引言
我们知道,欧拉函数是一个非常有用的函数,要想学好数论,就必须要学懂欧拉函数(自己也没怎么学好)
话不多说,直接步入正题。
欧拉函数的基本定义
欧拉函数用符号表示,如
那么就会有一个问题,欧拉函数得出的值的意义是:得出的结果即 n 以内与 n 互质的整数的个数
的结果是4,与8互质的数的个数为4,有 1 , 3 , 5 , 7 与 8 互质。
一个正整数 n ,可以分解为若干个质数的w次方乘积,设 m 为其质因子的个数,则有
欧拉函数的通解为
若 n 为 p 的 x 次方,则一定有
所以
欧拉函数的性质
1. 若 p 为质数,则
因为 p 是质数,则 p 以内的所有数都与其互质
2. 若 p > 2,则
一定是偶数
因为互质数是成对出现的,如 p - a 与 p 互质,则 a 也会与 p 互质
3.当N为奇数时,φ(2*N)=φ(N)
代码
求出欧拉函数的代码实现
方法一
scanf("%lld", &n );
if( n == 0 )
return 0;
long long m = n ;
for(int i = 2 ; i * i <= m ; ++ i )//分解为质数乘积
{
if( m % i == 0 )
{
cnt ++ ;
p[cnt] = i ;
while( m % i == 0 )
{
m = m / i ;
w[cnt] ++ ;
}
}
}
if( m != 1 )
{
cnt ++ ;
p[cnt] = m ;
w[cnt] = 1 ;
}
long long ans = 1 ;
for(int i = 1 ; i <= cnt ; ++ i )
{
ans = ans * (p[i] - 1 ) ;
for(int j = 1 ; j < w[i] ; j ++ )
{
ans = ans *p[i] ;
}
}
方法二
ph[1] = 1 ;//结合欧式筛法,可以求出 n 以内每一个数的欧拉函数值
scanf("%d", &n );
for(int i = 2 ; i <= n ; ++ i ) {
if(!vis[i]) {
cnt ++ ;
pr[cnt] = i ;
ph[i] = i - 1 ;
}
for(int j = 1 ; j <= cnt && i * pr[j] <= n ; ++ j ) {
vis[ i * pr[j] ] = 1 ;
if( i % pr[j] == 0 ) {
ph[ pr[j] * i ] = ph[i] * pr[j] ;
break;
}
else
ph [ pr[j] * i] = ph[i] * (pr[j] - 1 );
}
}
希望这篇文章对大家有一定帮助