【数论】欧拉函数与欧拉定理

更新于2021年7月

欧拉函数

对于一个正整数 x x x,小于 x x x且和 x x x互质的正整数的个数,记做 φ ( x ) \varphi(x) φ(x)。其中 φ ( 1 ) \varphi(1) φ(1)被定义为 1 1 1

性质1: p p p是质数,则

φ ( p a ) = p a − p a − 1 = p a ( 1 − 1 p ) \varphi(p^a)=p^a-p^{a-1}=p^a(1-\dfrac 1p) φ(pa)=papa1=pa(1p1)

特别地, φ ( p ) = p − 1 \varphi(p)=p-1 φ(p)=p1

证明: 由于大于 1 1 1的数不可能与它本身互质,所以定义中的“小于”完全可以改成“小于等于”。只需从小于等于 p a p^a pa p a p^a pa个正整数中减去与 p a p^a pa不互质的数,即含有质因数 p p p的数,即 p p p的倍数。而这样的数有 p a p = p a − 1 \dfrac{p^a}p=p^{a-1} ppa=pa1个。

性质2: p , q p,q p,q是质数,则

φ ( p a q b ) = φ ( p a ) φ ( q b ) \varphi\left(p^aq^b\right)=\varphi\left(p^a\right)\varphi\left(q^b\right) φ(paqb)=φ(pa)φ(qb)

证明: 小于等于 p a q b p^aq^b paqb的正整数中与 p a q b p^aq^b paqb不互质的数要么是 p p p的倍数(有 p a − 1 q b p^{a-1}q^b pa1qb个),要么是 q q q的倍数(有 p a q b − 1 p^aq^{b-1} paqb1个),且重复的数是 p q pq pq的倍数(有 p a − 1 q b − 1 p^{a-1}q^{b-1} pa1qb1个),所以

φ ( p a q b ) = p a q b − p a − 1 q b − p a q b − 1 + p a − 1 q b − 1 = p a q b ( 1 − 1 p ) ( 1 − 1 q ) = φ ( p a ) φ ( q b ) \begin{aligned} \varphi\left(p^aq^b\right)&=p^aq^b-p^{a-1}q^b-p^aq^{b-1}+p^{a-1}q^{b-1}\\ &=p^aq^b\left(1-\dfrac 1p\right)\left(1-\dfrac 1q\right)\\ &=\varphi\left(p^a\right)\varphi\left(q^b\right) \end{aligned} φ(paqb)=paqbpa1qbpaqb1+pa1qb1=paqb(1p1)(1q1)=φ(pa)φ(qb)

该性质很容易推广到多个质数的情况。设 x x x的质因数分解为 x = p 1 a 1 p 2 a 2 ⋯ p k a k x=p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k} x=p1a1p2a2pkak,则

φ ( x ) = x − ∑ 1 ⩽ i ⩽ k x p i + ∑ 1 ⩽ i < j ⩽ k x p i p j − ⋯ + ( − 1 ) k x p 1 p 2 ⋯ p k = x ( 1 − ∑ 1 ⩽ i ⩽ k 1 p i + ∑ 1 ⩽ i < j ⩽ k 1 p i p j − ⋯ + ( − 1 ) k 1 p 1 p 2 ⋯ p k ) = x ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p k ) = p 1 a 1 p 2 a 2 ⋯ p k a k ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p k ) = φ ( p 1 a 1 ) φ ( p 2 a 2 ) ⋯ φ ( p k a k ) \begin{aligned} \varphi(x)&=x-\sum_{1\leqslant i\leqslant k}\dfrac x{p_i}+\sum_{1\leqslant i<j\leqslant k}\dfrac x{p_ip_j}-\cdots+(-1)^k\dfrac x{p_1p_2\cdots p_k}\\ &=x\left(1-\sum_{1\leqslant i\leqslant k}\dfrac 1{p_i}+\sum_{1\leqslant i<j\leqslant k}\dfrac 1{p_ip_j}-\cdots+(-1)^k\dfrac 1{p_1p_2\cdots p_k}\right)\\ &=x\left(1-\dfrac 1{p_1}\right)\left(1-\dfrac 1{p_2}\right)\cdots\left(1-\dfrac 1{p_k}\right)\\ &=p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}\left(1-\dfrac 1{p_1}\right)\left(1-\dfrac 1{p_2}\right)\cdots\left(1-\dfrac 1{p_k}\right)\\ &=\varphi\left(p_1^{a_1}\right)\varphi\left(p_2^{a_2}\right)\cdots\varphi\left(p_k^{a_k}\right) \end{aligned} φ(x)=x1ikpix+1i<jkpipjx+(1)kp1p2pkx=x11ikpi1+1i<jkpipj1+(1)kp1p2pk1=x(1p11)(1p21)(1pk1)=p1a1p2a2pkak(1p11)(1p21)(1pk1)=φ(p1a1)φ(p2a2)φ(pkak)

由此得到了欧拉函数的计算式:

φ ( x ) = x ∏ p ∣ x ( 1 − 1 p ) \varphi(x)=x\prod_{p\vert x}\left(1-\dfrac 1p\right) φ(x)=xpx(1p1)

由于 x x x最多只有一个大于 x \sqrt x x 的质因数(否则质因数乘积就超过了 x x x),因此只需枚举 x \sqrt x x 以内的质因数,若有大于 x \sqrt x x 的质因数再特殊处理。每次枚举到一个质因数 i i i,将 x x x中的质因数 i i i除尽,保证枚举的下一个因数仍是质因数。

int phi(int x){
  int ans=x;
  for(int i=2;i*i<=x;i++)if(!(x%i)){
    ans-=ans/i;
    while(!(x%i))x/=i;
  }
  if(x>1)ans-=ans/x;
  return ans;
}

埃氏筛

先将所有的数标记为质数。从小到大讨论,若 i i i是质数,则 i i i的倍数全部标记为合数。

对于一个合数,在讨论其每一个质因数时都会标记到该合数,这就间接实现了枚举质因数的过程,可以据此用来求欧拉函数:先设 φ ( i ) = i \varphi(i)=i φ(i)=i,若 i i i是质数,根据欧拉函数的计算式, i i i的倍数的函数值全部乘以 1 − 1 i 1-\dfrac 1i 1i1

时间复杂度: O ( n log ⁡ log ⁡ n ) O(n\log\log n) O(nloglogn)

void make_prime(bool*mk,int n){
  memset(mk,0,sizeof(mk));mk[1]=1;
  for(int i=2;i<=n;i++)if(!mk[i])
    for(int j=i+i;j<=n;j+=i)mk[j]=1;
}
void make_phi(int*phi,int n){
  for(int i=1;i<=n;i++)phi[i]=i;
  for(int i=2;i<=n;i++)if(phi[i]==i)
    for(int j=i;j<=n;j+=i)phi[j]=phi[j]/i*(i-1);
}

线性筛

欧拉筛(线性筛)保证每个合数仅被它的最小质因数筛去正好一次。用当前的 i i i按从小到大的顺序依次乘以已筛出的质数 p p p来标记合数,当 i   m o d   p = 0 i\bmod p=0 imodp=0时,说明 i i i中含有质因数 p p p,则 i i i乘以更大的质数 p ′ p' p得到新的合数 i ⋅ p ′ i\cdot p' ip时,其最小质因数就不是 p ′ p' p而是 p p p,这个合数应该在 i ′ = i ⋅ p ′ p i'=\dfrac{i\cdot p'}p i=pip时筛去。因此在 i   m o d   p = 0 i\bmod p=0 imodp=0时,就不再用当前的 i i i标记合数,而是进入下一层循环。

线性筛并没有枚举出所有的质因数,因此不能根据计算式求欧拉函数,需要利用欧拉函数的另一些性质。

性质3: 欧拉函数是积性函数。(若 x , y x,y x,y互质,则 φ ( x y ) = φ ( x ) φ ( y ) \varphi(xy)=\varphi(x)\varphi(y) φ(xy)=φ(x)φ(y)。)

证明: 因为 x , y x,y x,y互质,所以 x , y x,y x,y没有公共质因数。设 x = p 1 a 1 p 2 a 2 ⋯ p k 1 a k 1 x=p_1^{a_1}p_2^{a_2}\cdots p_{k_1}^{a_{k_1}} x=p1a1p2a2pk1ak1 y = p k 1 + 1 a k 1 + 1 p k 1 + 2 a k 1 + 2 ⋯ p k 1 + k 2 a k 1 + k 2 y=p_{k_1+1}^{a_{k_1+1}}p_{k_1+2}^{a_{k_1+2}}\cdots p_{k_1+k_2}^{a_{k_1+k_2}} y=pk1+1ak1+1pk1+2ak1+2pk1+k2ak1+k2,则

φ ( x y ) = φ ( p 1 a 1 p 2 a 2 ⋯ p k 1 a k 1 p k 1 + 1 a k 1 + 1 p k 1 + 2 a k 1 + 2 ⋯ p k 1 + k 2 a k 1 + k 2 ) = φ ( p 1 a 1 ) φ ( p 2 a 2 ) ⋯ φ ( p k 1 a k 1 ) φ ( p k 1 + 1 a k 1 + 1 ) φ ( p k 1 + 2 a k 1 + 2 ) ⋯ φ ( p k 1 + k 2 a k 1 + k 2 ) = φ ( p 1 a 1 p 2 a 2 ⋯ p k 1 a k 1 ) φ ( p k 1 + 1 a k 1 + 1 p k 1 + 2 a k 1 + 2 ⋯ p k 1 + k 2 a k 1 + k 2 ) = φ ( x ) φ ( y ) \begin{aligned} \varphi(xy)&=\varphi\left(p_1^{a_1}p_2^{a_2}\cdots p_{k_1}^{a_{k_1}}p_{k_1+1}^{a_{k_1+1}}p_{k_1+2}^{a_{k_1+2}}\cdots p_{k_1+k_2}^{a_{k_1+k_2}}\right)\\ &=\varphi\left(p_1^{a_1}\right)\varphi\left(p_2^{a_2}\right)\cdots\varphi\left(p_{k_1}^{a_{k_1}}\right)\varphi\left(p_{k_1+1}^{a_{k_1+1}}\right)\varphi\left(p_{k_1+2}^{a_{k_1+2}}\right)\cdots\varphi\left(p_{k_1+k_2}^{a_{k_1+k_2}}\right)\\ &=\varphi\left(p_1^{a_1}p_2^{a_2}\cdots p_{k_1}^{a_{k_1}}\right)\varphi\left(p_{k_1+1}^{a_{k_1+1}}p_{k_1+2}^{a_{k_1+2}}\cdots p_{k_1+k_2}^{a_{k_1+k_2}}\right)\\ &=\varphi(x)\varphi(y) \end{aligned} φ(xy)=φ(p1a1p2a2pk1ak1pk1+1ak1+1pk1+2ak1+2pk1+k2ak1+k2)=φ(p1a1)φ(p2a2)φ(pk1ak1)φ(pk1+1ak1+1)φ(pk1+2ak1+2)φ(pk1+k2ak1+k2)=φ(p1a1p2a2pk1ak1)φ(pk1+1ak1+1pk1+2ak1+2pk1+k2ak1+k2)=φ(x)φ(y)

性质4: p p p是质数,则

φ ( x p ) = { φ ( x ) p x   m o d   p = 0 φ ( x ) ( p − 1 ) x   m o d   p ≠ 0 \varphi(xp)=\begin{cases} \varphi(x)p&x\bmod p=0\\ \varphi(x)(p-1)&x\bmod p\neq 0 \end{cases} φ(xp)={φ(x)pφ(x)(p1)xmodp=0xmodp=0

证明:

  • x   m o d   p = 0 x\bmod p=0 xmodp=0时, x x x一定可以表示成 x = k p a x=kp^a x=kpa,其中 k , p k,p k,p互质,则

    φ ( x p ) = φ ( k ) φ ( p a + 1 ) = φ ( k ) ⋅ p a + 1 ( 1 − 1 p ) φ ( x ) p = φ ( k ) φ ( p a ) p = φ ( k ) ⋅ p a ( 1 − 1 p ) p \begin{aligned} \varphi(xp)&=\varphi(k)\varphi(p^{a+1})=\varphi(k)\cdot p^{a+1}\left(1-\dfrac 1p\right)\\ \varphi(x)p&=\varphi(k)\varphi(p^a)p=\varphi(k)\cdot p^a\left(1-\dfrac 1p\right)p \end{aligned} φ(xp)φ(x)p=φ(k)φ(pa+1)=φ(k)pa+1(1p1)=φ(k)φ(pa)p=φ(k)pa(1p1)p

    于是 φ ( x p ) = φ ( x ) p \varphi(xp)=\varphi(x)p φ(xp)=φ(x)p

  • x   m o d   p ≠ 0 x\bmod p\neq 0 xmodp=0时, x , p x,p x,p互质,所以

    φ ( x p ) = φ ( x ) φ ( p ) = φ ( x ) ( p − 1 ) \varphi(xp)=\varphi(x)\varphi(p)=\varphi(x)(p-1) φ(xp)=φ(x)φ(p)=φ(x)(p1)

时间复杂度: O ( n ) O(n) O(n)

void make_prime(bool*mk,int*p,int n){
  memset(mk,0,sizeof(mk));mk[1]=1;
  for(int i=2;i<=n;i++){
    if(!mk[i])p[++tot]=i;
    for(int j=1;j<=tot&&i*p[j]<=n;j++){
      mk[i*p[j]]=1;
      if(!(i%p[j]))break;
    }
  }
}
void make_phi(int*phi,bool*mk,int*p,int n){
  memset(mk,0,sizeof(mk));mk[1]=phi[1]=1;
  for(int i=2;i<=n;i++){
    if(!mk[i])p[++tot]=i,phi[i]=i-1;
    for(int j=1;j<=tot&&i*p[j]<=n;j++){
      mk[i*p[j]]=1;
      if(i%p[j])phi[i*p[j]]=phi[i]*(p[j]-1);
      else{phi[i*p[j]]=phi[i]*p[j];break;}
    }
  }
}

GCD的个数(NKOJ 3684)

问题描述
给定两个正整数 n n n, m m m, 求满足下列两个条件的 x x x的个数:
条件1: 1 ⩽ x ⩽ n 1\leqslant x\leqslant n 1xn
条件2: g c d ( x , n ) ⩾ m gcd(x,n)\geqslant m gcd(x,n)m

输入格式
一行,两个整数 n n n m m m

输出格式
一行,一个整数,表示所求结果

样例输入
10 2

样例输出
6

提示
2 ⩽ n ⩽ 1000000000 , 1 ⩽ m ⩽ N 2\leqslant n\leqslant 1000000000,1\leqslant m\leqslant N 2n1000000000,1mN

先考虑满足 x ⩽ n x\leqslant n xn g c d ( x , n ) = d gcd(x,n)=d gcd(x,n)=d x x x的个数,显然 g c d ( x d , n d ) = 1 gcd(\frac xd,\frac nd)=1 gcd(dx,dn)=1
∴ x d \therefore\dfrac xd dx ⌊ n d ⌋ \left\lfloor\dfrac nd\right\rfloor dn内的与 ⌊ n d ⌋ \left\lfloor\dfrac nd\right\rfloor dn互质的数,总共有 φ ( ⌊ n d ⌋ ) \varphi\left(\left\lfloor\dfrac nd\right\rfloor\right) φ(dn)个。
于是只需枚举 n n n的因数 d d d,当 d ⩾ m d\geqslant m dm时答案增加 φ ( ⌊ n d ⌋ ) \varphi\left(\left\lfloor\dfrac nd\right\rfloor\right) φ(dn)。由于 n n n较大,可以把枚举量减少到 n \sqrt n n 。特殊情况特殊处理。

#include<cstdio>
typedef long long LL;
LL phi(LL x){
  LL ans=x;
  for(LL i=2;i*i<=x;i++)if(!(x%i)){
    ans=ans-ans/i;
  	while(!(x%i))x=x/i;
  }
  if(x>1)ans=ans-ans/x;
  return ans;
}
int main(){
  LL n,m,ans=0;
  scanf("%lld%lld",&n,&m);
  for(LL d=1;d*d<=n;d++){
    if(d>=m&&!(n%d))ans+=phi(n/d);
    if(d*d<n&&!(n%d)&&n/d>=m)ans+=phi(d);
  }
  printf("%lld\n",ans);
  return 0;
}

费马小定理

如果 p p p是素数,且 a , p a,p a,p互质,那么

a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv1\pmod p ap11(modp)

证明: 假设有这样 p − 1 p-1 p1个正整数,其中每个数都小于 p p p,且两两不相同。显然这些数为

1 , 2 , … , p − 1 (1) 1,2,\dots,p-1\tag 1 1,2,,p1(1)

再考虑下面这 p − 1 p-1 p1个数:

a   m o d   p , 2 a   m o d   p , 3 a   m o d   p , … , ( p − 1 ) a   m o d   p (2) a\bmod p,2a\bmod p,3a\bmod p,\dots,(p-1)a\bmod p\tag 2 amodp,2amodp,3amodp,,(p1)amodp(2)

1 ⩽ i ⩽ p − 1 1\leqslant i\leqslant p-1 1ip1时, a , i a,i a,i都与 p p p互质,因此 i a   m o d   p ≠ 0 ia\bmod p\neq 0 iamodp=0 ( 2 ) (2) (2)中的数都是小于 p p p的正整数。

假设存在 1 ⩽ i < j ⩽ p − 1 1\leqslant i<j\leqslant p-1 1i<jp1,使得 i a   m o d   p = j a   m o d   p ia\bmod p=ja\bmod p iamodp=jamodp,则 ( j − i ) a   m o d   p = 0 (j-i)a\bmod p=0 (ji)amodp=0,而 a , j − i a,j-i a,ji p p p互质,该式不成立。故 ( 2 ) (2) (2)中的数两两不相同。

于是 ( 1 ) ( 2 ) (1)(2) (1)(2)完全相同,则它们的乘积也相同,即

( p − 1 ) ! ≡ ( p − 1 ) ! a p − 1 ( m o d p ) a p − 1 ≡ 1 ( m o d p ) \begin{aligned} (p-1)!&\equiv(p-1)!a^{p-1}&\pmod p\\ a^{p-1}&\equiv 1&\pmod p \end{aligned} (p1)!ap1(p1)!ap11(modp)(modp)

欧拉定理

费马小定理是欧拉定理的一种特殊情况。
a , n a,n a,n为正整数,且 a , n a,n a,n互质,那么:

a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)}\equiv1\pmod n aφ(n)1(modn)

证明: 证明过程与费马小定理类似。假设小于 n n n且与 n n n互质的正整数为

x 1 , x 2 , … , x φ ( n ) (3) x_1,x_2,\dots,x_{\varphi(n)}\tag 3 x1,x2,,xφ(n)(3)

又有

a x 1   m o d   n , a x 2   m o d   n , … , a x φ ( n )   m o d   n (4) ax_1\bmod n,ax_2\bmod n,\dots,ax_{\varphi(n)}\bmod n\tag 4 ax1modn,ax2modn,,axφ(n)modn(4)

因为 a , x i a,x_i a,xi都与 n n n互质,所以 a x i   m o d   n ≠ 0 ax_i\bmod n\neq 0 aximodn=0 ( 4 ) (4) (4)中的数都是小于 n n n的正整数。

假设存在 1 ⩽ i < j ⩽ φ ( n ) 1\leqslant i<j\leqslant\varphi(n) 1i<jφ(n),使得 a x i   m o d   n = a x j   m o d   n ax_i\bmod n=ax_j\bmod n aximodn=axjmodn,则 a ( x j − x i )   m o d   n = 0 a(x_j-x_i)\bmod n=0 a(xjxi)modn=0,而 a , x i , x j a,x_i,x_j a,xi,xj n n n互质,该式不成立。故 ( 4 ) (4) (4)中的数两两不相同。

同理将 ( 3 ) ( 4 ) (3)(4) (3)(4)中的数分别相乘得

x 1 x 2 ⋯ x φ ( n ) ≡ x 1 x 2 ⋯ x φ ( n ) a φ ( n ) ( m o d n ) a φ ( n ) ≡ 1 ( m o d n ) \begin{aligned} x_1x_2\cdots x_{\varphi(n)}&\equiv x_1x_2\cdots x_{\varphi(n)}a^{\varphi(n)}&\pmod n\\ a^{\varphi(n)}&\equiv 1&\pmod n \end{aligned} x1x2xφ(n)aφ(n)x1x2xφ(n)aφ(n)1(modn)(modn)

a , n a,n a,n互质时,可用欧拉定理降幂。
a b   m o d   n = a b   m o d   φ ( n )   m o d   n a^b\bmod n=a^{b\bmod\varphi(n)}\bmod n abmodn=abmodφ(n)modn

一般地, a , n a,n a,n不互质,且 b ⩾ φ ( n ) b\geqslant\varphi(n) bφ(n)时:
a b   m o d   n = a b   m o d   φ ( n ) + φ ( n )   m o d   n a^b\bmod n=a^{b\bmod\varphi(n)+\varphi(n)}\bmod n abmodn=abmodφ(n)+φ(n)modn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值