定义

φ ( n ) \varphi(n) φ(n)(读作fai)定义为[1, n]中与n互质的数的个数

显然,当 n n n 是素数时, φ ( n ) = n 1 \varphi(n) = n-1 φ(n)=n1




欧拉函数的求法

关于 φ ( n ) \varphi(n) φ(n) ,有几种不同的求法,视情况使用。


首先呢,我们需要知道一个性质。

两个数 a , b a, b a,b 互质时, φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab)=\varphi(a)*\varphi(b) φ(ab)=φ(a)φ(b)
这是欧拉函数的积性性质,具体证明可以参考网上撒(因为我不会,我们对欧拉函数的求法,基本上都会基于此性质。


① 基于质因数分解的求法

考虑 p q p,q pq都是素数, n = p q n=p*q n=pq的情况。
由容斥原理:
φ ( n ) = n n p n q + n p q = n ( 1 1 p ) ( 1 1 q ) = ( 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)=npnqn+pqn=n(1p1)(1q1)=(p1)(q1)=φ(p)φ(q)
拓展到多个素因子的情况 n = p 1 k 1 p 2 k 2 . . . . p m k m n = p_1^{k_1}p_2^{k_2}....p_m^{k_m} n=p1k1p2k2....pmkm
那么
φ ( n ) = <munderover> i = 1 m </munderover> φ ( p i ) = n ( 1 1 p 1 ) . . . ( 1 1 p m ) \varphi(n) = \prod \limits_{i=1}^{m}\varphi(p_i) \\ = n(1-\dfrac{1}{p_1})...(1-\dfrac{1}{p_m}) φ(n)=i=1mφ(pi)=n(1p11)...(1pm1)
( 其实把二式拆开,我们会发现满足容斥原理 )
那么我们就得到了求 φ ( n ) \varphi(n) φ(n) 的 第一种方法,就是求出 n n n 的 素因子(俗称质因数分解=。=
复杂度 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 = p 1 k 1 p 2 k 2 . . . . p m k m n = p_1^{k_1}p_2^{k_2}....p_m^{k_m} n=p1k1p2k2....pmkm

k 1 = 1 k_1 = 1 k1=1

那么 n / p 1 n / p_1 n/p1 p 1 p_1 p1互质,由积性函数可得:
φ ( n ) = φ ( n / p 1 ) <mtext>   </mtext> <mtext>   </mtext> φ ( p 1 ) = φ ( n / p 1 ) <mtext>   </mtext> <mtext>   </mtext> ( p 1 1 ) \varphi(n) = \varphi(n/p_1) ~* ~\varphi(p_1) = \varphi(n/p1)~*~(p1-1) φ(n)=φ(n/p1)  φ(p1)=φ(n/p1)  (p11)

k 1 &gt; = 2 k_1 &gt;= 2 k1>=2

那么 n / p 1 n / p_1 n/p1 n n n 有共同的素因子,也就是说,与 n n n 互质的数,同时也与 n / p 1 n/p1 n/p1 互质。
利用这个性质,我们考虑用 φ ( n / p 1 ) \varphi(n/p_1) φ(n/p1) 来递推。
g c d ( a , <mtext>   </mtext> b ) = g c d ( a + k b , <mtext>   </mtext> b ) gcd(a,~b)=gcd(a+kb,~b) gcd(a, b)=gcd(a+kb, b)

因此 φ ( n ) = φ ( n / p 1 ) p 1 \varphi(n) = \varphi(n/p_1) * p_1 φ(n)=φ(n/p1)p1

因此我们先用线性筛求出 n n 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 = <munderover> i = 1 n </munderover> <munderover> j = 1 n </munderover> g c d ( i , j ) s = \sum \limits_{i=1}^{n} \sum \limits_{j=1}^{n} gcd(i,j) s=i=1nj=1ngcd(i,j)
考虑枚举 d = g c d ( i , j ) d = gcd(i,j) d=gcd(i,j)
那么 s = <munderover> d = 1 n </munderover> d <munderover> i = 1 n </munderover> <munderover> j = 1 n </munderover> [ g c d ( i , j ) = = d ] = <munderover> d = 1 n </munderover> d <munderover> i = 1 n </munderover> <munderover> j = 1 n </munderover> [ g c d ( i / d , j / d ) = = 1 ] = <munderover> d = 1 n </munderover> d ( 2 <munderover> i = 1 n </munderover> <munderover> j = 1 i </munderover> [ g c d ( i / d , j / d ) = = 1 ] 1 ) = <munderover> d = 1 n </munderover> d ( 2 <munderover> i = 1 n </munderover> φ ( i / d ) 1 ) = <munderover> d = 1 n </munderover> d ( 2 <munderover> i = 1 n / d </munderover> φ ( 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=1ndi=1nj=1n[gcd(i,j)==d]=d=1ndi=1nj=1n[gcd(i/d,j/d)==1]=d=1nd(2i=1nj=1i[gcd(i/d,j/d)==1]1)=d=1nd(2i=1nφ(i/d)1)=d=1nd(2i=1n/dφ(i)1)
预处理个前缀和即可。
这种想法非常常见!!!!!很重要!!!

② 欧拉定理及拓展
欧拉定理:如果 a , n a,n a,n互质,那么 a φ ( n ) 1 <mtext>     </mtext> ( m o d <mtext>   </mtext> n ) a^{\varphi(n)} \equiv 1~~~ (mod~n) aφ(n)1   (mod n)
证明

构造简化剩余系证明就可以了。

拓展欧拉定理:

b &gt; p h i ( n ) b &gt; phi(n) b>phi(n) 时, a b a b <mtext>   </mtext> m o d <mtext>   </mtext> φ ( n ) + φ ( n ) <mtext>      </mtext> ( m o d <mtext>   </mtext> n ) a^b \equiv a^{b~mod~\varphi(n) + \varphi(n)}~~~~(mod ~n) abab mod φ(n)+φ(n)    (mod n)

证明

证明 a φ ( n ) a 2 φ ( n ) <mtext>     </mtext> ( m o d <mtext>   </mtext> n ) a^{\varphi(n)} \equiv a^{2\varphi(n)}~~~(mod~n) 即可 aφ(n)a2φ(n)   (mod n)
证明:设 n = n 1 n 2 n=n_1n_2 n=n1n2,其中 n 1 = ( a , n ) n1=(a^\infin, n) n1=(a,n)
则有 ( a , n 2 ) = ( n 1 , n 2 ) = 1 (a, n_2)=(n_1, n_2)=1 (a,n2)=(n1,n2)=1
注意到 φ ( n ) l o g 2 n \varphi(n)≥log2n φ(n)log2n,因此 n 1 a φ ( n ) n_1|a^{\varphi(n)} n1aφ(n), a φ ( n ) a 2 φ ( n ) 0 ( m o d <mtext>   </mtext> n 1 ) . . . ( 1 ) a^{\varphi(n)}≡a^{2\varphi(n)}≡0 (mod ~n_1)...(1) aφ(n)a2φ(n)0(mod n1)...(1)
又由 ( n 1 , n 2 ) = 1 (n_1, n_2)=1 (n1,n2)=1 φ ( n ) = φ ( n 1 ) φ ( n 2 ) \varphi(n)=\varphi(n_1)\varphi(n_2) φ(n)=φ(n1)φ(n2),
由欧拉定理 a φ ( n ) a 2 φ ( n ) 1 ( m o d <mtext>   </mtext> n 2 ) . . . ( 2 ) a^{\varphi(n)}≡a^{2\varphi(n)}≡1 (mod~n_2)...(2) aφ(n)a2φ(n)1(mod n2)...(2)
中国剩余定理合并12两式得证。
推论: b &gt; p h i ( n ) b &gt; phi(n) b>phi(n) 时, a b a b <mtext>   </mtext> m o d <mtext>   </mtext> φ ( n ) + φ ( n ) <mtext>      </mtext> ( m o d <mtext>   </mtext> n ) a^b \equiv a^{b~mod~\varphi(n) + \varphi(n)}~~~~(mod ~n) abab mod φ(n)+φ(n)    (mod n)

得到欧拉定理及拓展,我们就可以利用欧拉定理来降幂。

eg.求 7 222 <mtext>   </mtext> m o d <mtext>   </mtext> 10 7^{222}~mod~10 7222 mod 10
分析:(7, 10)=1, 故 7 φ ( 10 ) = 7 5 1 ( m o d 10 ) 7^{\varphi(10)}=7^5≡1 (mod 10) 7φ(10)=751(mod10)
所以 7 222 7 222 <mtext>   </mtext> m o d <mtext>   </mtext> 5 = 7 2 = 49 9 ( m o d 10 ) 7^{222}≡7^{222~mod~5}=7^2=49≡9 (mod 10) 72227222 mod 5=72=499(mod10)
7 222 <mtext>   </mtext> m o d <mtext>   </mtext> 10 = 9 7^{222}~ mod ~10 = 9 7222 mod 10=9


一些例题

[SDOI2012] Longge的问题 (利用第一条应用

[SDOI2008]沙拉公主的困惑 (利用gcd的性质

bzoj 3884 上帝与集合的正确用法(利用欧拉定理降幂