欧拉函数和欧拉定理

· · 个人记录

欧拉函数和欧拉定理

欧拉函数的定义

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

比如说 \varphi(1)=1

当 n 是质数的时候,显然有 \varphi(n)=n-1

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

不知道积性函数?点这里。

如何求欧拉函数值

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

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^{\varphi(m)} \equiv 1 \pmod m

证明:

证明转载自M_lear

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

R=\{x_1,x_2, \cdots ,x_{\varphi(n)}\}

S=\{ax_1 \% n,ax_2 \% n, \cdots ,ax_{\varphi(n)} \% n\} \forall i \in [1,\varphi(n)] \because gcd(a,n)=1,gcd(x_i,n)=1 \therefore gcd(ax_i,n)=1

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

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

假设 i \not = j,ax_i \% n= ax_j \% n

ax_i \equiv ax_j,又 gcd(a,n) = 1

$\therefore S=R \therefore \displaystyle\prod_{i=1}^{\varphi(n)} ax_i \equiv \prod_{i=1}^{\varphi(n)} x_i \pmod{n} \therefore a^{\varphi(n)}\displaystyle\prod_{i=1}^{\varphi(n)} x_i \equiv \prod_{i=1}^{\varphi(n)} x_i \pmod{n} \because gcd\left(\displaystyle\prod_{i=1}^{\varphi(n)} x_i,n\right)=1 \therefore a^{\varphi(n)} \equiv 1 \pmod{n}