欧拉函数

来源:互联网 发布:意大利军事实力 知乎 编辑:程序博客网 时间:2024/06/05 19:35

欧拉函数:在数论中,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。

φ函数的值  通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。 (注意:每种质因数只一个。比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4

如何求对正整数n,1~n中与m互质的数的个数phi。

这就要用到容斥原理。

参考:http://blog.csdn.net/ydd97/article/details/48712679


另外:1~n中与m或者n互质的数之和=phi*n/2;



欧拉函数代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;long long a[10000],b[30];int main(){    int n;    while(scanf("%d",&n)&&n){            if(n<=3){                cout<<0<<endl;                continue;            }            memset(b,0,sizeof(b));            int m=n,k,p,len1=0,len2=0;            for(long long i=2;i<=sqrt(m);i++){                if(m%i==0){                    b[len1++]=i;                    while(m%i==0){m/=i;}                }            }            if(m>1)b[len1++]=m;            long long sum=n;            for(int i=0;i<len1;i++){            sum-=sum/b[i];            }             cout<<sum<<endl;    }    return 0;}

求1~n与m互质数的个数代码;

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;long long a[10000],b[30];//long long ss(int n,int a){//求和//    if(fabs(a)>n)return 0;//    long long m=n/a;//    long long b=m*a;//    if(m==1||m==-1)return b;//    long long num;//    num=(((long long)fabs(a)+b)/2*m);//    return num;////}int main(){    int n,m;    while(scanf("%d%d",&n,&m)&&n){            if(n<=3){                cout<<0<<endl;                continue;            }            memset(b,0,sizeof(b));            int k,p,len1=0,len2=0;            for(long long i=2;i<=sqrt(m);i++){                if(m%i==0){                    b[len1++]=i;                    while(m%i==0){m/=i;}                }            }            if(m>1)b[len1++]=m;            a[len2++]=-1;            for(int i=0;i<len1;i++){                int l=len2;                for(int j=0;j<l;j++){                    a[len2++]=b[i]*a[j]*(-1);                                    }            }            long long sum=n;            for(int i=1;i<len2;i++){                //sum+=ss(n-1,a[i]);                sum-=sum/a[i];            }//cout<<sum<<endl;            sum%=1000000007;            cout<<sum<<endl;    }    return 0;}




                                             
0 0