欧拉函数与欧拉定理

欧拉函数和欧拉定理

欧拉函数的定义

欧拉函数(Euler's totient function),即 φ(n),表示的是小于等于 nn 互质的数的个数。

比如说 φ(1)=1

当 n 是质数的时候,显然有 φ(n)=n1

欧拉函数的一些性质&结论

  • 欧拉函数是积性函数

不知道积性函数?点这里

  • n=d|nφ(d)

    证明:如果 gcd(k,n)=d

    那么 gcd(kd,nd)=1,(k<n)

    如果我们设 f(x) 表示 gcd(k,n)=x 的数的个数,那么 n=i=1nf(i)

    根据上面的证明,我们发现 f(x)=φ(nx)

    从而 n=i=1nφ(nx)

    注意到约数 dnd 具有对称性,所以上式化为 n=d|nφ(d)

  • n=pk,其中 p 是质数,那么 φ(n)=pkpk1=pk1×(p1)

    证明:显然对于从 1 到 pk 的所有数中,除了 pk1p 的倍数以外其它数都与 pk 互素,故 φ(n)=pkpk1=pk1×(p1),证毕。

  • 由唯一分解定理,设 n=i=1spiki,其中 pi 是质数,有 φ(n)=n×i=1s(11p)

    证明:

    • 引理:设 p 为任意质数,那么 φ(n)=pk1×(p1)

    φ(n)=i=1sφ(piki)

    =i=1s(pi1)piki1

    =i=1spiki×(11pi)

    =ni=1s(11pi)

如何求欧拉函数值

如果只要求一个数的欧拉函数值,那么直接根据定义质因数分解的同时求就好了。

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

如果是多个数的欧拉函数值,可以利用线性筛法来求得。

void pre() {
  memset(isprime, 1, sizeof(isprime));
  int cnt = 0;
  isprime[1] = 0;
  phi[1] = 1;
  for (int i = 2; i <= 5000000; i++) {
    if (isprime[i]) {
      prime[++cnt] = i;
      phi[i] = i - 1;
    }
    for (int j = 1; j <= cnt && i * prime[j] <= 5000000; j++) {
      isprime[i * prime[j]] = 0;
      if (i % prime[j])
        phi[i * prime[j]] = phi[i] * phi[prime[j]];
      else {
        phi[i * prime[j]] = phi[i] * prime[j];
        break;
      }
    }
  }
}

欧拉定理

与欧拉函数紧密相关的一个定理就是欧拉定理。其描述如下:

gcd(a,m)=1,则 aφ(m)1(modm)

证明:

证明转载自M_lear

记小于 n 且与 n 互质的正整数集合为

R={x1,x2,,xφ(n)}

S={ax1%n,ax2%n,,axφ(n)%n}

i[1,φ(n)]

gcd(a,n)=1,gcd(xi,n)=1

gcd(axi,n)=1

由最大公约数的性质可得 gcd(axi%n,n)=1

所以 S 中的所有元素都与 n 互质,且都小于 n。又 S 中无重复元素

假设 ij,axi%n=axj%n

axiaxj,又 gcd(a,n)=1

xixj(modn),i=j 矛盾

S=R

i=1φ(n)axii=1φ(n)xi(modn)

aφ(n)i=1φ(n)xii=1φ(n)xi(modn)

gcd(i=1φ(n)xi,n)=1

aφ(n)1(modn)

posted @   「ycw123」  阅读(66)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示