欧拉函数及其性质

定义

在数论,对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目(φ(1)=1)。此函数以其首名研究者欧拉命名(Euler’s totient function),它又称为Euler’s totient function、φ函数、欧拉商数等。

函数式

φ(x)=xi=1n(11pi) φ ( x ) = x ∏ i = 1 n ( 1 − 1 p i )

其中 pi p i x x 的质因数(x>0)
φ(x) φ ( x ) 1x 1 → x 与x互质数的个数

性质
1. 对于任意一个质数 p p ,φ(n)=n1

因为 n n 为质数,与他互质的个数就是 n-1

2. 当 gcd(n,m)=1时, φ(nm)=φ(n)φ(m) φ ( n m ) = φ ( n ) φ ( m )

因为 φ(n) φ ( n ) 是积性函数。 积性函数指对于所有互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数。

3. 若 n=pk n = p k 其中p为质数,则 φ(n)=pkpk1=(p1)pk1 φ ( n ) = p k − p k − 1 = ( p − 1 ) p k − 1

1n 1 → n 中除了p的倍数,都与 pk p k 互质, 1n 1 → n p p 倍数的个数为 pk÷p=pk1

4. n=pk11pk22pkm1m1pkmm n = p 1 k 1 p 2 k 2 … p m − 1 k m − 1 p m k m 其中 pkmm p m k m n n 所分解的质因数(km为每个质因数的个数) ,则
φ(n)=ni=1m(11pi) φ ( n ) = n ∏ i = 1 m ( 1 − 1 p i )

由性质3可得

φ(n)=i=1n(pi1)pki1i(pi|n)=(pk11pk22pk33pkmm)i=1m(11pi)=ni=1m(11pi) φ ( n ) = ∏ i = 1 n ( p i − 1 ) p i k i − 1 ( p i | n ) = ( p 1 k 1 p 2 k 2 p 3 k 3 … p m k m ) ∏ i = 1 m ( 1 − 1 p i ) = n ∏ i = 1 m ( 1 − 1 p i )

5. 所有小于 n n n互质个数的和 sum=n×φ(n)2 s u m = n × φ ( n ) 2

首先证明 gcd(n,i)=1 g c d ( n , i ) = 1 ,则 gcd(n,ni)=1 g c d ( n , n − i ) = 1
利用反证法:
设存在 gcd(n,i)=1,gcd(n,ni)=k g c d ( n , i ) = 1 , g c d ( n , n − i ) = k ,那么可得 (ni)%k=0,n%k=0 ( n − i ) % k = 0 , n % k = 0 ,所以 i%k=0 i % k = 0 ,即 gcd(n,i)=k g c d ( n , i ) = k
与假设矛盾,所以 gcd(n,i)=1 g c d ( n , i ) = 1 ,则 gcd(n,ni)=1 g c d ( n , n − i ) = 1 成立
由这个式子可得每个与 n n 互质的数都是成对的,因为gcd(n,i)=gcd(n,ni)=1 , i i (ni)成对,这样就可证明5性质

6. 如果 i i mod p=0,其中 p p 为质数,则 φ(ip)=pφ(i),否则 φ(ip)=(p1)φ(i) φ ( i ∗ p ) = ( p − 1 ) φ ( i )

对于前半部分,我们只需证明 如果 gcd(i,n)=1 g c d ( i , n ) = 1 gcd(i,n+i)=1 g c d ( i , n + i ) = 1
同上反证法:
gcd(i,n)=1,gcd(i,n+i)=k g c d ( i , n ) = 1 , g c d ( i , n + i ) = k
n+i=ka1,i=ka2 n + i = k a 1 , i = k a 2 ,则 ka2+n=ka1,n=(a1a2)k k a 2 + n = k a 1 , n = ( a 1 − a 2 ) k ,所以 gcd(i,n)>=k g c d ( i , n ) >= k ,与假设矛盾, gcd(i,n)=1 g c d ( i , n ) = 1 ,则 gcd(i,n+i)=1 g c d ( i , n + i ) = 1 成立

有了上面那个式子就好证明了,因为 p为质数,所以与 ip i ∗ p 互质的数也就是 1(ip) 1 → ( i ∗ p ) i i 互质的数的个数,这样就可以用上面那个定理了,设n是小于 i i 且与i互质的数,则 gcd(i,n)=1 g c d ( i , n ) = 1 gcd(i,n+i)=gcd(i,n+2i)=gcd(i,n+3i)==gcd(i,n+(p1)i) g c d ( i , n + i ) = g c d ( i , n + 2 i ) = g c d ( i , n + 3 i ) = ⋯ = g c d ( i , n + ( p − 1 ) i ) 也就是原来的 p p

后半部分更好证明,i p p 互质,那就是性质2

7. n=d|nφ(d) (d|n) ( d | n ) 指n是d的倍数

正规的推导看不懂,在搜了很多博客后看到了一种简单的证明方法

1n,2n,3n,4n,,nn 1 n , 2 n , 3 n , 4 n , … , n n

一共n个分数,把所有数化简到最简分数,则每个分母都是n的因子,也就是说n 是所有分母的倍数,每个分母存在的数量就是 φ(i) φ ( i ) 所有 φ(i) φ ( i ) 的和也就是所有数的个数 n n

8. 欧拉定理:对于互质的整数a,m,有 aφ(m)1 (mod m)。

证明
设小于 n n 且与n互质的集合 Z Z , 则|Z|=φ(n)Z={q1,q2,q3qm}
设集合 Y={ap1 mod m,ap2 mod m apφ(m} Y = { a ∗ p 1   m o d   m , a ∗ p 2   m o d   m …   a ∗ p φ ( m }

我们只需证明 Y=Z Y = Z 即可
因为 a a n互质, pi p i n n 互质,所以 api n n 互质,所以 api mod nZ
i != j i   ! =   j 那么 api mod n != apj mod n a ∗ p i   m o d   n   ! =   a ∗ p j   m o d   n
一如既往的反证法:
api mod n = apj mod n a ∗ p i   m o d   n   =   a ∗ p j   m o d   n , api=kin+b a ∗ p i = k i ∗ n + b ,那么

apiapj=kin+bkjnba(pipj)=n(kikj) n=pipjkikja a ∗ p i − a ∗ p j = k i ∗ n + b − k j ∗ n − b 化 简 得 a ( p i − p j ) = n ( k i − k j )   进 而 得 n = p i − p j k i − k j a
,这与 a n a   n 互质矛盾,所以 i != j i   ! =   j 那么 api mod n != apj mod n a ∗ p i   m o d   n   ! =   a ∗ p j   m o d   n 成立
因此我们可得 Z=Y Z = Y
所以我们可以列出
ap1ap2apφ(n)p1p2pφ(n)( mod n)aφ(n)1 ( mod n) a ∗ p 1 ∗ a ∗ p 2 ∗ ⋯ ∗ a ∗ p φ ( n ) ≡ p 1 ∗ p 2 ∗ ⋯ ∗ p φ ( n ) (   m o d   n ) → a φ ( n ) ≡ 1   (   m o d   n )

费马小定理就是他的一种情况 ap a 与 p 互质时 ap11 ( mod p) a p − 1 ≡ 1   (   m o d   p ) ,这时候 φ(p)=p1 φ ( p ) = p − 1 带进去这个性质便可得

欧拉函数求法
应用
欧拉筛质数

板子 线性筛法中的p[]就是

欧拉降幂

公式
AkAk%φ(m)(mod m)gcd(A,m)=1 A k ≡ A k % φ ( m ) ( m o d   m ) g c d ( A , m ) = 1
AkAk(mod m)gcd(A,m)!=1,k<φ(m) A k ≡ A k ( m o d   m ) g c d ( A , m ) ! = 1 , k < φ ( m )
AkAk%φ(m)+φ(m)(mod m)gcd(A,m)!=1,k>φ(m) A k ≡ A k % φ ( m ) + φ ( m ) ( m o d   m ) g c d ( A , m ) ! = 1 , k > φ ( m )
证明见:https://blog.csdn.net/weixin_38686780/article/details/81272848
看不懂,只好背公式,数学还是太垃圾了


板子
O(n) O ( n ) ,线性筛法

int p[maxn];
bool  vis[maxn];
ll phi[maxn];
int cnt=0;
ll get_phi(int len=maxn){
    phi[1]=1;
    for(int i=2;i<len;i++){
        if(!vis[i]){
            p[cnt++]=i;
            phi[i]=i-1;
        }       
        for(int j=0;j<cnt;j++){
            if(p[j]*i>=len) break;
            vis[p[j]*i]=1;
            if(i%p[j]==0){
                phi[i*p[j]]=p[j]*phi[i];
                break;  
            }
            phi[i*p[j]]=phi[i]*(p[j]-1);

        }
    }

}

O(n) O ( n ) ,适合求单点

ll get_phi(ll  x){
    ll res=x;
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0){
            res=res-res/i;
            while(x%i==0) x/=i;
        }       
    }
    if(x!=1) res=res-res/x;
    return res;
}

练习

BZOJ 3884 上帝与集合的正确用法 ( O(n) O ( n ) 板子) 题解

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值