定义:对于正整数 n n n,欧拉函数是小于等于 n n n的数中与 n n n互质的数的个数。

符号: φ ( n ) φ(n) φ(n)表示 n n n的欧拉函数,默认 φ ( 1 ) = 1 φ(1)=1 φ(1)=1

一些定理:

1.对于一个素数 p p p φ ( p ) = p 1 φ(p)=p-1 φ(p)=p1

证明略。

2.对于两个互质的数 a , b a,b a,b φ ( a × b ) = φ ( a ) × φ ( b ) φ(a \times b)=φ(a) \times φ(b) φ(a×b)=φ(a)×φ(b) ( ( (感谢 h y j hyj hyj 巨佬的指正 ) ) )

证明:因为 a a a b b b互质,所以 a a a b b b没有共同的质因数。设 a a a k a k_a ka个质因数, b b b k b k_b kb个质因数,因此:
<mstyle displaystyle="true" scriptlevel="0"> φ ( a ) φ ( b ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = a <munderover> i = 1 k a </munderover> ( 1 1 p [ i ] ) b <munderover> i = 1 k b </munderover> ( 1 1 p [ i ] ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = a b <munderover> i = 1 k a + k b </munderover> ( 1 1 p [ i ] ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = φ ( a b ) </mstyle> \begin{aligned}φ(a)*φ(b)&amp;=a*\prod\limits_{i=1}^{k_a} \left(1-\dfrac{1}{p[i]}\right)*b*\prod\limits_{i=1}^{k_b} \left(1-\dfrac{1}{p[i]}\right)\\&amp;=a*b*\prod\limits_{i=1}^{k_a+k_b} \left(1-\dfrac{1}{p[i]}\right)\\&amp;=φ(a*b)\end{aligned} φ(a)φ(b)=ai=1ka(1p[i]1)bi=1kb(1p[i]1)=abi=1ka+kb(1p[i]1)=φ(ab)
注:欧拉函数是积性函数,但不是完全积性函数。

u p d a t e update update:这个证法貌似是错的,因为要用到欧拉函数的公式,但是欧拉函数的公式又要由这个式子推出来。所以只能显然正确了。真的证明我还不会 ( ( (我菜爆了 ) ) ),可以参考这里

3.对于一个素数 p p p的幂次,如 p a p^{a} pa,有 φ ( p a ) φ(p^{a}) φ(pa) = = = ( p 1 ) (p-1) (p1) × \times × p a 1 p^{a-1} pa1

证明:比 p a p^{a} pa小的正整数共 p a 1 p^{a}-1 pa1个。其中所有 p p p的倍数可以表示成 p p p × \times × t t t ( t = 1 , 2...... p a 1 1 ) (t=1,2......p^{a-1}-1) (t=1,2......pa11),即共有 p a 1 1 p^{a-1}-1 pa11个数能被 p p p整除。因为 p p p是质数,所以显然只有这些数不能被 p p p整除,剩余的数都与 p p p互质。因此, φ ( p a ) φ(p^{a}) φ(pa) = = = p a 1 p^{a}-1 pa1 - ( p a 1 1 ) (p^{a-1}-1) (pa11) = = = ( p 1 ) (p-1) (p1) × \times × p a 1 p^{a-1} pa1

4.如果 i % p = 0 i\%p=0 i%p=0,那么 φ ( i × p ) = φ ( i ) × p φ(i\times p)=φ(i)\times p φ(i×p)=φ(i)×p

证明:懒了不想写,好像没多大用。

求欧拉函数:

1.求单个欧拉函数: φ ( x ) φ(x) φ(x) = x =x =x × \times × i = 1 k ( 1 1 p [ i ] ) \prod\limits_{i=1}^k \left(1-\dfrac{1}{p[i]}\right) i=1k(1p[i]1)

其中 p [ 1 ] , p [ 2 ] . . . . . . p [ k ] p[1],p[2]......p[k] p[1],p[2]......p[k] x x x的所有质因子

证明:首先,由整数的唯一分解定理可得, x x x = = = p [ 1 ] a 1 p[1]^{a_1} p[1]a1 × \times × p [ 2 ] a 2 p[2]^{a_2} p[2]a2 × \times × . . . . . . ...... ...... × \times × p [ k ] a k p[k]^{a_k} p[k]ak。显然 p [ 1 ] a 1 p[1]^{a_1} p[1]a1 p [ 2 ] a 2 p[2]^{a_2} p[2]a2 . . . . . . ...... ...... p [ k ] a k p[k]^{a_k} p[k]ak之间两两互质。那么,根据定理 2 , 3 2,3 2,3
<mstyle displaystyle="true" scriptlevel="0"> φ ( x ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = φ ( p [ 1 ] a 1 ) φ ( p [ 2 ] a 2 ) . . . . . . φ ( p [ k ] a k ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = ( p [ 1 ] a 1 ( 1 1 p [ 1 ] ) ) ( p [ 2 ] a 2 ( 1 1 p [ 2 ] ) ) . . . . . . ( p [ k ] a k ( 1 1 p [ k ] ) ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = ( p [ 1 ] a 1 p [ 2 ] a 2 . . . . . . p [ k ] a k ) ( 1 1 p [ 1 ] ) ( 1 1 p [ 2 ] ) . . . . . . ( 1 1 p [ k ] ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = x <munderover> i = 1 k </munderover> ( 1 1 p [ i ] ) </mstyle> \begin{aligned}φ(x)&amp;=φ(p[1]^{a_1})*φ(p[2]^{a_2})*......*φ(p[k]^{a_k})\\&amp;=(p[1]^{a_1}*(1-\frac{1}{p[1]}))*(p[2]^{a_2}*(1-\frac{1}{p[2]}))*......* (p[k]^{a_k}*(1-\frac{1}{p[k]}))\\&amp;=(p[1]^{a_1}*p[2]^{a_2}*......*p[k]^{a_k})*(1-\frac{1}{p[1]})*(1-\frac{1}{p[2]})*......*(1-\frac{1}{p[k]})\\&amp;=x*\prod\limits_{i=1}^k \left(1-\dfrac{1}{p[i]}\right)\end{aligned} φ(x)=φ(p[1]a1)φ(p[2]a2)......φ(p[k]ak)=(p[1]a1(1p[1]1))(p[2]a2(1p[2]1))......(p[k]ak(1p[k]1))=(p[1]a1p[2]a2......p[k]ak)(1p[1]1)(1p[2]1)......(1p[k]1)=xi=1k(1p[i]1)
代码:

inline int getphi(int x){
    int res=x;
    for(int i=2;i*i<=x;i++){
        if(x%i==0){
            res=res/i*(i-1);//通分公式大括号内内容即可
            while(x%i==0) x/=i; 
        }
    }
    if(x>1) res=res/x*(x-1);
    return res;
}

2.线性筛欧拉函数:方法类似于筛素数,其实并不难,在筛素数的同时进行筛欧拉函数。

用到上面的1,2,4定理。

代码:

for(int i=2;i<=n;i++){
    if(!v[i]){
        phi[i]=i-1;
        pr[++top]=i;
    }
    for(int j=1;j<=top&&i*pr[j]<=n;j++){
        v[i*pr[j]]=1;
        if(i%pr[j]==0){
            phi[i*pr[j]]=phi[i]*pr[j];
            break;
        }
        else phi[i*pr[j]]=phi[i]*phi[pr[j]];
    }
}

欧拉定理:若 g c d ( a , m ) = 1 gcd(a,m)=1​ gcd(a,m)=1,那么 a φ ( m ) a^{φ(m)}​ aφ(m) \equiv​ 1 ( m o d m ) 1 \pmod m​ 1(modm)

证明:找欧拉去