定义
φ(n)(读作fai)定义为[1, n]中与n互质的数的个数
显然,当 n 是素数时, φ(n)=n−1
欧拉函数的求法
关于 φ(n) ,有几种不同的求法,视情况使用。
首先呢,我们需要知道一个性质。
两个数 a,b 互质时, φ(ab)=φ(a)∗φ(b)
这是欧拉函数的积性性质,具体证明可以参考网上撒(因为我不会,我们对欧拉函数的求法,基本上都会基于此性质。
① 基于质因数分解的求法
考虑 p,q都是素数, n=p∗q的情况。
由容斥原理:
φ(n)=n−pn−qn+pqn=n(1−p1)(1−q1)=(p−1)∗(q−1)=φ(p)∗φ(q)
拓展到多个素因子的情况 n=p1k1p2k2....pmkm
那么
φ(n)=i=1∏mφ(pi)=n(1−p11)...(1−pm1)
( 其实把二式拆开,我们会发现满足容斥原理 )
那么我们就得到了求 φ(n) 的 第一种方法,就是求出 n 的 素因子(俗称质因数分解=。=
复杂度 O(n )
代码如下:
int phi(int x) {
int ret = x;
for (int i = 2; i * i <= x; ++i)
if (x % i == 0) {
while (x % i == 0) x /= i;
ret = ret / i * (i - 1);
}
if (x > 1) ret = ret / x * (x - 1);
return ret;
}
② 线性求法
继续考虑
n=p1k1p2k2....pmkm
Ⅰ k1=1
那么 n/p1 与 p1互质,由积性函数可得:
φ(n)=φ(n/p1) ∗ φ(p1)=φ(n/p1) ∗ (p1−1)
Ⅱ k1>=2
那么 n/p1 与 n 有共同的素因子,也就是说,与 n 互质的数,同时也与 n/p1 互质。
利用这个性质,我们考虑用 φ(n/p1) 来递推。
由 gcd(a, b)=gcd(a+kb, b)
因此 φ(n)=φ(n/p1)∗p1
因此我们先用线性筛求出 n 的最小素因子,然后递推即可。
代码如下
for(i = 2; i <= m; i++){
if(!x[i]) x[i] = p[++cnt] = i;
for(j = 1; j <= cnt; j++){
t = p[j] * i;
if(t > m) break;
x[t] = p[j];
if(i % p[j] == 0) break;
}
}
phi[1] = 1;
for(i = 2; i <= m; i++){
if(x[i / x[i]] == x[i]) phi[i] = phi[i / x[i]] * x[i];
else phi[i] = phi[x / x[i]] * (x[i] - 1);
}
欧拉函数的应用
① 将求和问题转化为求个数问题
eg. 求 s=i=1∑nj=1∑ngcd(i,j)
考虑枚举 d=gcd(i,j)
那么 s=d=1∑nd∗i=1∑nj=1∑n[gcd(i,j)==d]=d=1∑nd∗i=1∑nj=1∑n[gcd(i/d,j/d)==1]=d=1∑nd∗(2∗i=1∑nj=1∑i[gcd(i/d,j/d)==1]−1)=d=1∑nd∗(2∗i=1∑nφ(i/d)−1)=d=1∑nd∗(2∗i=1∑n/dφ(i)−1)
预处理个前缀和即可。
这种想法非常常见!!!!!很重要!!!
② 欧拉定理及拓展
欧拉定理:如果 a,n互质,那么 aφ(n)≡1 (mod n)
证明
构造简化剩余系证明就可以了。
拓展欧拉定理:
b>phi(n) 时, ab≡ab mod φ(n)+φ(n) (mod n)
证明
证明 aφ(n)≡a2φ(n) (mod n)即可
证明:设 n=n1n2,其中 n1=(a∞,n)
则有 (a,n2)=(n1,n2)=1
注意到 φ(n)≥log2n,因此 n1∣aφ(n), aφ(n)≡a2φ(n)≡0(mod n1)...(1)
又由 (n1,n2)=1得 φ(n)=φ(n1)φ(n2),
由欧拉定理 aφ(n)≡a2φ(n)≡1(mod n2)...(2)
中国剩余定理合并12两式得证。
推论: b>phi(n) 时, ab≡ab mod φ(n)+φ(n) (mod n)
得到欧拉定理及拓展,我们就可以利用欧拉定理来降幂。
eg.求 7222 mod 10
分析:(7, 10)=1, 故 7φ(10)=75≡1(mod10)
所以 7222≡7222 mod 5=72=49≡9(mod10)
即 7222 mod 10=9
一些例题
[SDOI2012] Longge的问题 (利用第一条应用
[SDOI2008]沙拉公主的困惑 (利用gcd的性质
bzoj 3884 上帝与集合的正确用法(利用欧拉定理降幂