定义
φ(n)\varphi(n)φ(n)(读作fai)定义为[1, n]中与n互质的数的个数
显然,当 nnn 是素数时, φ(n)=n−1\varphi(n) = n-1φ(n)=n−1
欧拉函数的求法
关于 φ(n)\varphi(n)φ(n) ,有几种不同的求法,视情况使用。
首先呢,我们需要知道一个性质。
两个数a,ba, ba,b 互质时,φ(ab)=φ(a)∗φ(b)\varphi(ab)=\varphi(a)*\varphi(b)φ(ab)=φ(a)∗φ(b)
这是欧拉函数的积性性质,具体证明可以参考网上撒(因为我不会,我们对欧拉函数的求法,基本上都会基于此性质。
① 基于质因数分解的求法
考虑 p,qp,qp,q都是素数,n=p∗qn=p*qn=p∗q的情况。
由容斥原理:
φ(n)=n−np−nq+npq=n(1−1p)(1−1q)=(p−1)∗(q−1)=φ(p)∗φ(q)\varphi(n)=n - \dfrac{n}{p} - \dfrac{n}{q} + \dfrac{n}{pq} = n(1-\dfrac{1}{p})(1-\dfrac{1}{q}) = (p-1)*(q-1)=\varphi(p)*\varphi(q)φ(n)=n−pn−qn+pqn=n(1−p1)(1−q1)=(p−1)∗(q−1)=φ(p)∗φ(q)
拓展到多个素因子的情况 n=p1k1p2k2....pmkmn = p_1^{k_1}p_2^{k_2}....p_m^{k_m}n=p1k1p2k2....pmkm
那么
φ(n)=∏i=1mφ(pi)=n(1−1p1)...(1−1pm)\varphi(n) = \prod \limits_{i=1}^{m}\varphi(p_i) \\ = n(1-\dfrac{1}{p_1})...(1-\dfrac{1}{p_m})φ(n)=i=1∏mφ(pi)=n(1−p11)...(1−pm1)
( 其实把二式拆开,我们会发现满足容斥原理 )
那么我们就得到了求 φ(n)\varphi(n)φ(n) 的 第一种方法,就是求出 nnn 的 素因子(俗称质因数分解=。=
复杂度 O(n)O(\sqrt{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....pmkmn = p_1^{k_1}p_2^{k_2}....p_m^{k_m}n=p1k1p2k2....pmkm
Ⅰ k1=1k_1 = 1k1=1
那么 n/p1n / p_1n/p1 与 p1p_1p1互质,由积性函数可得:
φ(n)=φ(n/p1) ∗ φ(p1)=φ(n/p1) ∗ (p1−1)\varphi(n) = \varphi(n/p_1) ~* ~\varphi(p_1) = \varphi(n/p1)~*~(p1-1)φ(n)=φ(n/p1) ∗ φ(p1)=φ(n/p1) ∗ (p1−1)
Ⅱ k1>=2k_1 >= 2k1>=2
那么 n/p1n / p_1n/p1 与 nnn 有共同的素因子,也就是说,与 nnn 互质的数,同时也与 n/p1n/p1n/p1 互质。
利用这个性质,我们考虑用 φ(n/p1)\varphi(n/p_1)φ(n/p1) 来递推。
由 gcd(a, b)=gcd(a+kb, b)gcd(a,~b)=gcd(a+kb,~b)gcd(a, b)=gcd(a+kb, b)
因此 φ(n)=φ(n/p1)∗p1\varphi(n) = \varphi(n/p_1) * p_1φ(n)=φ(n/p1)∗p1
因此我们先用线性筛求出 nnn 的最小素因子,然后递推即可。
代码如下
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=1n∑j=1ngcd(i,j)s = \sum \limits_{i=1}^{n} \sum \limits_{j=1}^{n} gcd(i,j)s=i=1∑nj=1∑ngcd(i,j)
考虑枚举 d=gcd(i,j)d = gcd(i,j)d=gcd(i,j)
那么 s=∑d=1nd∗∑i=1n∑j=1n[gcd(i,j)==d]=∑d=1nd∗∑i=1n∑j=1n[gcd(i/d,j/d)==1]=∑d=1nd∗(2∗∑i=1n∑j=1i[gcd(i/d,j/d)==1]−1)=∑d=1nd∗(2∗∑i=1nφ(i/d)−1)=∑d=1nd∗(2∗∑i=1n/dφ(i)−1)s = \sum \limits_{d=1}^{n} d * \sum \limits_{i=1}^{n}\sum \limits_{j=1}^{n}[gcd(i,j)==d] \\ =\sum \limits_{d=1}^{n} d * \sum \limits_{i=1}^{n}\sum \limits_{j=1}^{n}[gcd(i/d,j/d)==1] \\ =\sum \limits_{d=1}^{n} d * (2*\sum \limits_{i=1}^{n}\sum \limits_{j=1}^{i}[gcd(i/d,j/d)==1] - 1) \\ =\sum \limits_{d=1}^{n} d * (2*\sum \limits_{i=1}^{n}\varphi(i/d) - 1) \\ = \sum \limits_{d=1}^{n} d * (2*\sum \limits_{i=1}^{n/d}\varphi(i) - 1)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,na,na,n互质,那么aφ(n)≡1 (mod n)a^{\varphi(n)} \equiv 1~~~ (mod~n)aφ(n)≡1 (mod n)
证明
构造简化剩余系证明就可以了。
拓展欧拉定理:
b>phi(n)b > phi(n)b>phi(n) 时,ab≡ab mod φ(n)+φ(n) (mod n)a^b \equiv a^{b~mod~\varphi(n) + \varphi(n)}~~~~(mod ~n)ab≡ab mod φ(n)+φ(n) (mod n)
证明
证明 aφ(n)≡a2φ(n) (mod n)即可a^{\varphi(n)} \equiv a^{2\varphi(n)}~~~(mod~n) 即可aφ(n)≡a2φ(n) (mod n)即可
证明:设n=n1n2n=n_1n_2n=n1n2,其中n1=(a∞,n)n1=(a^\infin, n)n1=(a∞,n)
则有(a,n2)=(n1,n2)=1(a, n_2)=(n_1, n_2)=1(a,n2)=(n1,n2)=1
注意到φ(n)≥log2n\varphi(n)≥log2nφ(n)≥log2n,因此n1∣aφ(n)n_1|a^{\varphi(n)}n1∣aφ(n), aφ(n)≡a2φ(n)≡0(mod n1)...(1)a^{\varphi(n)}≡a^{2\varphi(n)}≡0 (mod ~n_1)...(1)aφ(n)≡a2φ(n)≡0(mod n1)...(1)
又由(n1,n2)=1(n_1, n_2)=1(n1,n2)=1得 φ(n)=φ(n1)φ(n2)\varphi(n)=\varphi(n_1)\varphi(n_2)φ(n)=φ(n1)φ(n2),
由欧拉定理aφ(n)≡a2φ(n)≡1(mod n2)...(2)a^{\varphi(n)}≡a^{2\varphi(n)}≡1 (mod~n_2)...(2)aφ(n)≡a2φ(n)≡1(mod n2)...(2)
中国剩余定理合并12两式得证。
推论:b>phi(n)b > phi(n)b>phi(n) 时,ab≡ab mod φ(n)+φ(n) (mod n)a^b \equiv a^{b~mod~\varphi(n) + \varphi(n)}~~~~(mod ~n)ab≡ab mod φ(n)+φ(n) (mod n)
得到欧拉定理及拓展,我们就可以利用欧拉定理来降幂。
eg.求 7222 mod 107^{222}~mod~107222 mod 10
分析:(7, 10)=1, 故7φ(10)=75≡1(mod10)7^{\varphi(10)}=7^5≡1 (mod 10)7φ(10)=75≡1(mod10)
所以7222≡7222 mod 5=72=49≡9(mod10)7^{222}≡7^{222~mod~5}=7^2=49≡9 (mod 10)7222≡7222 mod 5=72=49≡9(mod10)
即7222 mod 10=97^{222}~ mod ~10 = 97222 mod 10=9
一些例题
[SDOI2012] Longge的问题 (利用第一条应用
[SDOI2008]沙拉公主的困惑 (利用gcd的性质
bzoj 3884 上帝与集合的正确用法(利用欧拉定理降幂

本文介绍了欧拉函数的定义,求法包括基于质因数分解和线性求法,并详细探讨了欧拉函数在解决求和问题和利用欧拉定理降幂中的应用。通过例题展示了如何在实际问题中运用欧拉函数。
4300

被折叠的 条评论
为什么被折叠?



