欧拉函数
φ函数的定义:设n为正整数,以 φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值,这里函数φ:N→N,n→φ(n)称为欧拉函数。
例如φ(8)=4,因为1,3,5,7均和8互质。
φ函数的值通式:
φ(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本身)。
注意:每种质因数只有一个(比如12=2*2*3,那么φ(12)=12*(1-1/2)*(1-1/3)=4)
若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1)。
φ函数的性质:
1.若m,n互质,φ(mn)=φ(m)φ(n)。
2.当n为奇数时,φ(2n)=φ(n)。
3.对于素数p,φ(p) = p -1 。
4.对于两个不同素数p,q ,它们的乘积n=p*q满足φ(n) = (p -1)*(q -1)
5.快速求出欧拉函数的值(a为N的质因数)
若(N%a==0 && (N/a)%a==0) 则有:E(N)=E(N/a)*a;
若(N%a==0 && (N/a)%a!=0) 则有:E(N)=E(N/a)*(a-1);
φ函数的编程实现:
#include < stdlib.h >
#include < stdio.h >
#define N 10000001
int main()
{
int i,j;
char prime[M];
__int64 phi[M];
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内的所有素数
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 );
}
}
for (i = 1 ;i < N;i ++ )
printf( " %d %I64d\n " ,i,phi[i]);
return 0 ;
}
//下面是两种求欧拉函数的不同编程方法:
/*==================================================*\
|递推求欧拉函数phi(i)
\*==================================================*/
void eular(int n)
{
int i;
for(i=2;i<=n;i++) phi[i]=0;
ph[1]=1;
for(i=2;i<=n;i++)
{
if(phi[i]==0)
{
for(j=i;j<=n;j+=i)
{
if(phi[j]==0) phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
}
}
/*==================================================*\n
|单独求欧拉函数phi(x)
\*==================================================*/
int euler(unsigned x)
{
int i, res=x;
for (i=2;i*i<=x;i++)
{
if(x%i==0)
{
res=res/i*(i-1);
while(x%i==0) // 保证i一定是素数
x/=i;
}
}
if(x>1)
res=res/x*(x-1);
return res;
}
欧拉定理 :对于互质的正整数a和n,有a^φ(n)≡1(mod n)。
费马定理 : 对于正整数a和质数n,有a^(n-1)≡1(mod n)。
*****************************************
补充:欧拉函数公式
( 1 ) p^k 的欧拉函数
对于给定的一个素数p,φ(p)= p -1。
则对于正整数 n = p^k ,φ(n)= p^k - p^(k-1).
( 2 ) p * q 的欧拉函数
假设p, q是两个互质的正整数,则 p*q 的欧拉函数为
φ(p * q) = φ(p) * φ(q)。(gcd(p,q)=1)
( 3 ) 任意正整数的欧拉函数
任意一个整数 n 都可以表示为其素数因子的乘积为:
I
n = ∏ pi^k*i (I为n的素数因子的个数)
i=1
根据前面两个结论,很容易得出它的欧拉函数为:
I I
Φ(n)=∏ pi^(k-1)*i*(pi -1)= n*∏(1 - 1 / pi)
i=1 i=1
对于任意 n > 2,2 | Φ(n) ,因为必存在 pi -1 是偶数。