欧拉函数:
定义:
ϕ(i)\phi(i)ϕ(i)表示第i个欧拉函数的值,代表了从1到i与i互质的数的个数,例如ϕ(8)=4\phi(8)=4ϕ(8)=4,因为1,3,5,7均和8互质
通式:
ϕ(x)=x∗∏i=1n(1−1pi)(pi为x的质因子)\phi (x)=x*\prod_{i=1}^n(1-\dfrac{1}{p_i}) (p_i为x的质因子)ϕ(x)=x∗∏i=1n(1−pi1)(pi为x的质因子)
eg:ϕ(8)=8∗(1−12)=4eg:\quad \phi(8)=8*(1-\dfrac{1}{2})=4eg:ϕ(8)=8∗(1−21)=4
关系式:
- 如果a是素数且n不是a倍数 , 有ϕ(n∗a)=ϕ(n)∗(a−1)\phi(n*a)=\phi(n)*(a-1)\quadϕ(n∗a)=ϕ(n)∗(a−1)
- 如果a是素数且n是a倍数 , 有ϕ(n∗a)=ϕ(n)∗a\phi(n*a)=\phi(n)*aϕ(n∗a)=ϕ(n)∗a
- 如果n是素数 , 有ϕ(n)=n−1\phi(n)=n-1ϕ(n)=n−1
- 如果n和m互质 , 有ϕ(m∗n)=ϕ(m)∗ϕ(n)\phi(m*n)=\phi(m)*\phi(n)ϕ(m∗n)=ϕ(m)∗ϕ(n)
- 如果n是奇数 , 有ϕ(2∗n)=ϕ(n)\phi(2*n)=\phi(n)ϕ(2∗n)=ϕ(n)
- 如果n>2 , 有ϕ(n)\phi(n)ϕ(n)为偶数
- 如果p是素数 , 有ϕ(pq)=pq−pq−1\phi(p^q)=p^q- p^{q-1}ϕ(pq)=pq−pq−1
求和式:
- ∑d∣nϕ(d)=n\sum_{d|n}\phi(d)=n∑d∣nϕ(d)=n
- ∑i=1n[gcd(n,i)=1]=ϕ(n)\sum_{i=1}^n[gcd(n,i)=1]=\phi(n)∑i=1n[gcd(n,i)=1]=ϕ(n)
- ∑i=1ni[gcd(n,i)=1]=⌈ϕ(n)∗n2⌉\sum_{i=1}^ni[gcd(n,i)=1]=\lceil \dfrac{\phi(n)*n}{2}\rceil∑i=1ni[gcd(n,i)=1]=⌈2ϕ(n)∗n⌉,由于n>2n>2n>2时欧拉函数值为偶数,所以只有n=1n=1n=1时为奇数,所以可以写成ϕ(n)∗n2+[n=1]\dfrac{\phi(n)*n}{2}+[n=1]2ϕ(n)∗n+[n=1]或者ϕ(n)∗n+[n=1]2\dfrac{\phi(n)*n+[n=1]}{2}2ϕ(n)∗n+[n=1]
按照通式我们就可以O(sqrt(n))求出一个数的欧拉函数值:
int phi(int n){
int res=n,a=n;
for(int i=2;i*i<=a;i++){ //这里可以素数筛处理再枚举素数,不过这样也是可以的
if(a%i==0){
res=res/i*(i-1);
//res=rea-rea/i;
while(a%i==0) a/=i;
}
}
if(a>1) res=res/a*(a-1);
return res;
}
可以利用性质,O(n)筛法处理出n个数的值,而大于nnn的无法预处理的部分,可以用性质去掉部分素因子,降到[1,n][1,n][1,n],两部分相乘得。
const int MAXN = 1e6+5;
bool flag[MAXN];
LL phi[MAXN];
LL p[MAXN];
LL cnt ;
void Get_Phi(){
cnt = 0;
phi[1] = 1ll;
for(LL i=2ll; i<MAXN; i++) {
if(!flag[i]) {
p[++cnt] = i;
phi[i] = i-1ll;//性质2
}
for(LL j=1; j<=cnt&&1ll*i*p[j]<MAXN; j++){
flag[i*p[j]] = 1;
if(i%p[j] == 0){
phi[i*p[j]] = p[j] * phi[i];//性质3
break;
}
else phi[i*p[j]] = (p[j]-1ll) * phi[i];//性质1
}
}
}
int Get_Phi(int n){
int now=1;
for(int i=1;i<=cnt;i++){
if(n<MAXN)return now*phi[n];
if(n%p[i]==0)while(1){
n/=p[i];
if(n%p[i]==0){
now*=p[i];
}
else{
now*=p[i]-1;
break;
}
}
if(n==1)return now;
if(p[i]>sqrt(n))
return now*(n-1);
}
}
欧拉定理:
如果a和m互质的情况下,有同余性质:aφ(m)≡1(mod m) (gcd(a,m)=1)a^{φ(m)}\equiv1(mod \;m) \;(gcd(a,m)=1)aφ(m)≡1(modm)(gcd(a,m)=1)
这个东西有什么用呢?
欧拉降幂:
比如让你求7233%m7^{233}\% m7233%m(求个位数就是%10)后的结果(不使用快速幂,因为有些题需要O(1)处理)
由欧拉定理得 : 7ϕ(m)≡1(mod m)7^{\phi(m)}\equiv1(mod \;m)7ϕ(m)≡1(modm)
设:a=233 % ϕ(m),即233=k∗ϕ(m)+aa=233\;\% \;\phi(m),即233=k*\phi(m)+aa=233%ϕ(m),即233=k∗ϕ(m)+a
⇒\Rightarrow⇒同求(7k∗ϕ(m)∗7a)%m(7^{k*\phi(m)}*7^a)\%m(7k∗ϕ(m)∗7a)%m
=(1∗7a)%m=(1*7^a)\%m=(1∗7a)%m
所以得出欧拉降幂在a与m互质情况下的公式:
aq≡aq%ϕ(m) (mod m)a^q\equiv a^{q\%\phi(m)}\;(mod\;m)aq≡aq%ϕ(m)(modm)
当然还有通用公式(不管是否互质):
q>=ϕ(m)时:aq≡aq%ϕ(m)+ϕ(m) (mod m)q>=\phi(m)时:a^q\equiv a^{q\%\phi(m)+\phi(m)}\;(mod\;m)q>=ϕ(m)时:aq≡aq%ϕ(m)+ϕ(m)(modm)