在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名 研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。例如φ(8)=4,因为1,3,5,7均和8互质。从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。

简介

  φ函数的值
  φ(1)=1(唯一和1互质的数就是1本身)。
  若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。
  欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。
  特殊性质:当n为奇数时,φ(2n)=φ(n), 证明于上述类似。

证明

  设A, B, C是跟m, n, mn互质的数的集,据中国剩余定理,A*B和C可建立一一对应的关系。因此φ(n)的值使用算术基本定理便知,
  若 n= ∏p^(α(下标p))
  则φ(n)=∏(p-1)p^(α(下标p)-1)=n∏(1-1/p)
  例如φ(72)=φ(2^3×3^2)=(2-1)2^(3-1)×(3-1)3^(2-1)=24

与欧拉定理、费马小定理的关系
(1)对任何两个互质的正整数a, m, m>=2有
a^φ(m)≡1(mod m),即欧拉定理

(2)当m是质数p时,此式则为:
a^(p-1)≡1(mod p),即费马小定理


欧拉函数的编程实现

  利用欧拉函数和它本身不同质因数的关系,用筛法计算出某个范围内所有数的欧拉函数值。
  欧拉函数和它本身不同质因数的关系:欧拉函数ψ(N)=N{∏p|N}(1-1/p)。(P是数N的质因数)

  如:
  ψ(10)=10×(1-1/2)×(1-1/5)=4;
  ψ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;
  ψ(49)=49×(1-1/7)=42。

#include <stdlib.h>
#include<stdio.h>
#define N 10000
int main()
{
    int *phi,i,j;
    char *prime;
    prime=(char*)malloc((N+1)*sizeof(char));
    prime[0]=prime[1]=0;
    for(i=2;i<=N;i++)
        prime[i]=1;
    for(i=2;i*i<=N;i++)
    {
        if(prime[i])
        {
            for(j=i*i;j<=N;j+=i)
                prime[j]=0;
        }
    } //这段求出了N内的所有素数 
    phi=(int*)malloc((N+1)*sizeof(int));
    for(i=1;i<=N;i++)
        phi[i]=i;
    for(i=2;i<=N;i++)
    {
        if(prime[i])
        {
            for(j=i;j<=N;j+=i)
                phi[j]=phi[j]/i*(i-1); //此处注意先/i再*(i-1),否则范围较大时会溢出
        }
    }
    for(i=1;i<N;i++)
        printf("%d %d\n",i,phi[i]);
    return 0;
}

标签: none

评论已关闭