• 定理0 算术函数f如果满足对于任意两个互质的正整数m和n,均有f(mn)=f(m)f(n),就称f为积性函数(或乘性函数)。
  • 如果对于任意两个正整数m和n,均有f(mn)=f(m)f(n),就称为完全积性函数。

  • 定理1 对于素数p,ϕ(p)=p−1。
  • 定理2 ϕ(p n )=p n −p n−1 ,因为素数幂p n 不互质的只有p的倍数,一共有p n /p=p n−1 个。
  • 定理3 若m、n互质,ϕ(mn)=ϕ(m)ϕ(n),所以欧拉函数是积性函数。
  • 因为mn互质,和m互质的数乘上和n互质的数就会和mn互质。

  • 定理4 设n=p1 a1 p2 a2 ...pk ak 为正整数n的素数幂分解,那么ϕ(n)=n(1−1/p1)(1−1/p2)...(1−1/pk)。
  • 由定理2,ϕ(p n )=p n −p n−1 =p n (1-1/p),又由定理3,ϕ(n)=p1 a1 p2 a2 ...pk ak (1−1/p1)(1−1/p2)...(1−1/pk)=n(1−1/p1)(1−1/p2)...(1−1/pk)

    所以可以方便地求欧拉函数:边找质因子边算,res=n,找到一个质因子p,res=res/p*(p-1)。

    int euler(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;
    

    也可以方便地求出所有数的欧拉函数。过程就是先让每个phi[i]=i,再对每个质数p,j为它的倍数,phi[j]=phi[j]/p*(p-1)。

    for(int i=1; i<=maxn; ++i) phi[i] = i;
    for(int i=2; i<=maxn; i+=2) phi[i] /= 2;
    for(int i=3; i<=maxn; i+=2)
        if(phi[i] == i){
            for(int j=i; j<=maxn; j+=i)
                phi[j] = phi[j] / i * (i - 1);
    

      由定理2,ϕ(pk)=pk−pk−1

      p=2时,ϕ(2k)=2k−2k−1=2k−1是偶数,

      对于大于2的素数p,ϕ(pk)=pk−pk−1,p为奇数,p的次方也为奇数,两个奇数相减为偶数。

      所以ϕ(pk)为偶数。

      又由定理3,ϕ(n)=ϕ(p1a1)ϕ(p2a2)...ϕ(pkak),所以ϕ(n)一定是偶数。

  • 定理6d|nϕ(d)=n。
  • ┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
    ┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
    ┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
    ┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
    ┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
    ┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆