欧拉函数的定义:
在数论中,对于正整数N,少于或等于N ([1,N]),且与N互质的正整数(包括1)的个数,记作φ(n)。
φ函数的值:
φ(x)=x(1-1/p(1))(1-1/p(2))(1-1/p(3))(1-1/p(4))…..(1-1/p(n)) 其中p(1),p(2)…p(n)为x
的所有质因数;x是正整数; φ(1)=1(唯一和1互质的数,且小于等于1)。注意:每种质因数只有一个。
例如:
φ(10)=10×(1-1/2)×(1-1/5)=4;
1 3 7 9
φ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;
φ(49)=49×(1-1/7)=42;
欧拉函数的性质:
(1) p^k型欧拉函数:
若N是质数p(即N=p),φ(n)= φ(p)=p(1-1/p)=p-1。 所以除了p自己本身外,[1,p-1]的任何数都与p互质,所以φ(p)=p-1,另外由公式得到φ(n)= φ(p)=p(1-1/p)=p-1。
若N是质数p的k次幂(即N=p^k), φ(n)= p^ k -p^(k-1) =(p-1)p^(k-1)。y因为除了p的倍数以外,其他数都与N互质。而是p的倍数的数有p,2p,3p...p^(k-1)*p,一共有p ^ ( k- 1)个,所以有p^k -p ^ (k-1) =(p-1)p^(k-1)个数与p互质。
(2)mn型欧拉函数
设m,n为正整数,若m,n互质,φ(mn)=(m-1)(n-1)=φ(m)φ(n)。容易知道mn与m的倍数或者n的倍数不互质,而n的倍数有n,2n,3n...mn,共有m个,m的倍数有m,2m,3m...nm,共有n个,又mn重复计数,所以共有n+m-1个,至于k1*n和k2*m中会不会有重复计数呢?因为n,m为质数,要使得k1n=k2m,那么k1=n,k2=m;所以与mn互质的有m*n-(n+m-1)=(m-1)*(n-1)=φ(m)φ(n)
(3)特殊性质:
若n为奇数时,φ(2n)=φ(n)。
对于任何两个互质 的正整数a,n(n>2)有:a^φ(n)=1 mod n (恒等于)此公式即 欧拉定理
当n=p 且 a与素数p互质(即:gcd(a,p)=1)则上式有: a^(p-1)=1 mod p (恒等于)此公式即 费马小定理
如果(a,c)互质,且c是素数,则(a ^ b)%c=a ^ ( b % ( phi(c) ) )%c , phi(c) 是指c的欧拉函数
四 欧拉函数的延伸:
( 一 )
小于或等于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1)。
( 二 )
定义:n的原根x满足条件0<x<n,并且有集合{ (xi mod n) | 1 <= i <=n-1 } 和集合{ 1, ..., n-1 }相等定理:如果p有原根,则它恰有φ(φ(p))个不同的原根。
例题 a ^ b ^ c mod 1000000007
#include<stdio.h>
#include <string.h>
using namespace std;
#define Mod 1000000007
int powMod(int a,int b,int c)
{
int res=1,base=a;
while(b)
{
if(b&1) res=((long long)res*base)%c;
base=((long long)base*base)%c;
b>>=1;
}
return res;
}
int main()
{
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c))
{
int resul=powMod(b,c,Mod-1);
printf("%d\n",powMod(a,resul,Mod));
}
}
求欧拉函数的方法
( 一 ) 根据定义来实现
int euler(int n)
{
int m=sqrt(n+0.5);
int res=n;
for(int i=2;i<=m;i++)
{
if(n%i==0)
{
res=res/i*(i-1);
while(n%i==0) n/=i;
}
}
if(n>1) res=res/n*(n-1);
return res;
}
( 二 )筛选法打欧拉函数表
const int MAXN=1000010;
int phi[MAXN];
void phi_table(int n)
{
memset(phi,0,sizeof(phi));
phi[1]=1;
for(int i=1;i<=n;i++)
{
if(phi[i]==0)//i是质数
{
for(int j=i;j<=n;j+=i)
{
if(phi[j]==0) phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
}
}