扩展欧拉定理以及练习题
文章目录
- 扩展欧拉定理
- 定理
- 定理内容
- 证明
- 习题
- 模板题luogu5091
- 练习题
扩展欧拉定理
定理
定理内容
ab≡{abmodφ(m)如果 gcd(a,m)=1,ab如果 gcd(a,m)≠1且 b<φ(m),abmodφ(m)+φ(m)如果 gcd(a,m)≠1且 b≥φ(m).(modm)a^b \equiv \begin{cases} a^{b \bmod \varphi(m)} & \text{如果 } \gcd(a, m) = 1, \\ a^b & \text{如果 } \gcd(a, m) \neq 1 \text{ 且 } b < \varphi(m), \\ a^{b \bmod \varphi(m) + \varphi(m)} & \text{如果 } \gcd(a, m) \neq 1 \text{ 且 } b \geq \varphi(m). \end{cases} \pmod{m} ab≡⎩⎨⎧abmodφ(m)ababmodφ(m)+φ(m)如果 gcd(a,m)=1,如果 gcd(a,m)=1 且 b<φ(m),如果 gcd(a,m)=1 且 b≥φ(m).(modm)
其中 φ\varphiφ 为欧拉函数。
例子:
计算 71000mod107^{1000} \bmod 1071000mod10:
- φ(10)=4\varphi(10) = 4φ(10)=4(因为与 10 互质的数为 1, 3, 7, 9)。
- gcd(7,10)=1\gcd(7, 10) = 1gcd(7,10)=1,所以直接应用欧拉定理:
71000=74×250=70≡1(mod10).7^{1000} = 7^{4 \times 250} = 7^0 \equiv 1 \pmod{10}. 71000=74×250=70≡1(mod10).
证明
这里偷懒,贴了deepseek的证明:
习题
模板题luogu5091
link
不过注意到 bbb 的值域达到了 102×10710^{2\times 10^7}102×107,所以需要读入的时候就可以进行取模了,这样子这题就做完了。
#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL);
#define fr(i,a,b,k) for(int i=a;i!=b;i+=k)// a<b a>b
using namespace std;
const int N=1e6+1;
int t,n,m,mod,a,b;
inline int qmi(int x,int y)
{int res=1;while(y>0){if(y&1)res*=x,res%=mod;x*=x,x%=mod,y>>=1;}return res;
}
inline int read()
{int x=0;bool f=0;char c=getchar();while(c>'9'||c<'0')c=getchar();while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar(),f|=(x>=m),x%=m;return x+f*m;
}
int phi(int x)
{int ans=x,y=sqrt(x);fr(i,2,y+1,1){if(x%i==0)ans=ans/i*(i-1);while(x%i==0)x/=i;}if(x>1)ans=ans/x*(x-1);return ans;
}
signed main()
{//IOS;cin>>a>>mod;m=phi(mod);b=read();cout<<qmi(a,b);return 0;
}
代码是很久以前写的,码风烂,勿喷。
还有一些注意的点:
求单个欧拉函数的时间复杂度是 n\sqrt nn,但是如果求多个的话,可以线性筛 O(V)O(V)O(V) 解决。
其次你可能会疑惑,这代码里也没有判断 gcd(a,m)\gcd(a,m)gcd(a,m) 是否为 111 啊。
其实是简化了的,根据欧拉定理:
当 a,m∈Za, m \in \mathbb{Z}a,m∈Z ,且 gcd(a,m)=1\operatorname{gcd}(a, m)=1gcd(a,m)=1 时有: aφ(m)≡1(modm)a^{\varphi(m)} \equiv 1(\bmod m)aφ(m)≡1(modm) 。
此时 abmodφ(m)+φ(m)=abmodφ(m)a^{b\bmod \varphi(m)+\varphi(m)}=a^{b\bmod\varphi(m)}abmodφ(m)+φ(m)=abmodφ(m)
所以写代码时一般认为扩展欧拉定理长这样:
当 a,m∈Za, m \in \mathbb{Z}a,m∈Z 时有:
ab≡{ab,b<φ(m)abmodφ(m)+φ(m),b≥φ(m)(modm)a^b \equiv\left\{\begin{array}{cl} a^b & , b<\varphi(m) \\ a^{b \bmod \varphi(m)+\varphi(m)} & , b \geq \varphi(m) \end{array}(\bmod m)\right. ab≡{ababmodφ(m)+φ(m),b<φ(m),b≥φ(m)(modm)
练习题
这里放几道题,由于作者现在还没有做出来这些题,所以先放着,以后会出相应的题解。
- 洛谷P4139 lnik
- CF906D 洛谷 CF
- CF615D 洛谷 CF
- CF17D 洛谷 CF