欧拉函数

对正整数n,欧拉函数是小于n的数中与n互质的数的数目

欧拉函数与组合数学中的计数原理和容斥原理有着密切的联系。

Euler函数表达通式:


其中 为x的所有素因子,x是不为0的整数。

euler(1)=1(唯一和1互质的数就是1本身)。

欧拉定理:对于互质的正整数a和n,有 (可用于求解逆元)

若m,n互质, ——积性函数的性质

同时,欧拉函数也能这样计算:   其中是一个素数.

因为除了的倍数其他数字均和互质。而的倍数有个,所以



当初学习欧拉函数时我隐隐觉得它和容斥原理有什么联系,现在明白了,计数原理能解释欧拉函数。

欧拉函数的等式:


由算术基本定理(正整数的唯一分解定理):

那么,在1——n内和n互质的数这样求解:先除减去能被一个素因子整除的数:


发现多减了,再加上两个素因子乘积计算结果:

再减去三个素因子的乘积计算结果:

......

整理得到:

它也就是:


实现代码:
由表达式得到:
int Euler(int n){
    int ans=n,a=n;
    for(int i=2;i*i<=a;i++){
        if(a%i==0){
            ans=ans/i*(i-1);
            while(a%i==0){
                a/=i;
            }
        }
    }
    if(a>1) ans=ans/a*(a-1);
    return ans;
}

递推(筛法)求欧拉函数:
void Euler(int Max){
    for(int i=1;i<Max;i++)  phi[i]=i;
    for(int i=2;i<Max;i++) {
        if(phi[i]==i){
            for(int j=i;j<Max;j+=i){
                phi[j]=phi[j]/i*(i-1);
            }
        }
    }
}



你可能感兴趣的:(Euler)