【专题】欧拉函数

来源:互联网 发布:电商系统源码 编辑:程序博客网 时间:2024/05/22 06:42

欧拉函数

欧拉函数定义:欧拉函数ϕ(n)指不超过n且与n互素的正整数的个数

定义及定理

定义1(算数函数): 定义在所有正整数上的函数称为算数函数

定义2(积性函数):算数函数f如果满足对任意两个互素的正整数 n和m,均有f(mn)=f(m)f(n),就称为积性函数(或乘性函数).如果对任意的两个正整数 n和m,均有f(mn)=f(m)f(n),就称为完全积性函数(完全或乘性函数).


定理1:如果f是一个积性函数,对于任意正整数n有素数幂分解n=pa11pa22...pakk,那么有f(n)=f(pa11)f(pa22)...f(pakk)

定理2:如果p是素数,那么ϕ(p)=p1;反之,如果p是一个正整数且满足ϕ(p)=p1,那么p是素数

定理3:设p是素数,a是一个正整数,那么ϕ(pa)=papa1

定理4:设m和n是互素的正整数,那么ϕ(mn)=ϕ(m)ϕ(n)

定理5:n=pa11pa22...pakk为正整数n的素数幂分解,那么:

ϕ(n)=n(11p1)(11p2)...(11pk)

  • 推论 当n为奇数时,有ϕ(2n)=ϕ(n)

定理6:设n是一个大于2的正整数,那么ϕ(n)是偶数

定理7:设n是一个正整数,那么d|nϕ(d)=n

常用定理

欧拉定理:对任何两个互质的正整数a,m(m2)aϕ(m)1(modm)

费马小定理:当m是质数时且a与m互质,am11(modm)

证明

定理(1)(2)显而易见

定理3根据欧拉函数的定义易得

定理4也就是证明欧拉函数是积性函数,具体证明见百度,好像还不太简单

定理5可以由定理(1)(3)(4)推出

费马小定理的证明参考《算法概论》

应用

1.求欧拉函数的值,以POJ2407这道题为模板
题意:给出一个正整数n,小于n且和n互素的正整数有多少个?

#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<queue>using namespace std;const int MAXN=50005;int p[MAXN+1];//保存素数,下标从1开始int bj[MAXN+1];//未被标记的表示素数void Prime(int p[],int bj[])//线筛素数{     memset(bj,0,sizeof(bj));     bj[0]=bj[1]=1;     int cnt=0;     for(int i=1;i<=MAXN;i++)     {          if(bj[i]==0)p[++cnt]=i;          for(int j=1;j<=cnt && i*p[j]<MAXN;j++)          {                bj[i*p[j]]=1;                if((i%p[j])==0)break;          }     }}int Phi(int n){      int ans=n;      for(int i=1;p[i]*p[i]<=n;i++)      {            if(n%p[i]==0)//找素因子            {                  ans=ans-ans/p[i];                  while(n%p[i]==0)n/=p[i];            }      }      if(n>1)ans=ans-ans/n;      return ans;}int main(){     int n;     Prime(p,bj);     while(scanf("%d",&n)!=EOF && n)     {           cout<<Phi(n)<<endl;     }}
0 0
原创粉丝点击