欧拉函数
欧拉函数的简介与性质
-
欧拉函数是少于或等于\(n\)的数中与\(n\)互质的数的数目。
-
欧拉函数的性质:它在整数\(n\)上的值等于对n进行素因子分解后,所有的素数幂上的欧拉函数之积。
欧拉函数的值
- 通式:\(\varphi(x)=x(1-\frac{1}{p_1})(1-\frac{1}{p_2})(1-\frac{1}{p_3})(1-\frac{1}{p_4})\dots(1-\frac{1}{p_n})\),其中\(p1, p2\dots pn\)为\(x\)的所有质因数,\(x\)是不为\(0\)的整数。\(\varphi(1)=1\)(唯一和\(1\)互质的数(小于等 于1)就是1本身)。 (注意:每种质因数只一个。比如\(12=2*2*3\)那么\(φ(12)=12*(1-1/2)*(1-1/3)=4\))
推论:
-
当\(n\)为奇数时,有\(\varphi(2n)=\varphi(n)。\)
-
因为\(2\)和奇数互质,所以\(\varphi(2)*\varphi(n)=\varphi(2n)\),又因为\(\varphi(2)=1\),所以\(\varphi(n)=\varphi(2n)\)
-
若\(n\)是质数\(p\)的\(k\)次幂,\(φ(n)=p^k-p^{(k-1)}=(p-1)p^{(k-1)}\),因为除了\(p\)的倍数外,其他数都跟\(n\)互质。
-
设\(n\)为正整数,以\(φ(n)\)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值,这里函数\(φ:N→N,n→φ(n)\)称为欧拉函数。
-
欧拉函数是积性函数——若\(m,n\)互质,\(φ(mn)=φ(m)φ(n)\)。
特殊性质:
- 当\(n\)为奇数时,\(φ(2n)=φ(n)\), 证明与上述类似。
算法实现
用通式直接求:
int Euler(int n) //1.直接求欧拉函数的值
{
int rea=n;
for(int i=2; i*i<=n; i++)
if(n%i==0)//第一次找到的必为素因子
{
rea=rea-rea/i;
while(n%i==0){
n=n/i;//把该素因子全部约掉
}
}
if(n>1)
rea=rea-rea/n;
return rea;
}
素数表实现
bool boo[50000];
int p[20000];
void prim()
{
memset(boo,0,sizeof(boo));
boo[0]=boo[1]=1;
int k=0;
for(int i=2; i<50000; i++)
{
if(!boo[i])
p[k++]=i;
for(int j=0; j<k&&i*p[j]<50000; j++)
{
// cout<<i*p[j]<<endl;
boo[i*p[j]]=1;
if(!(i%p[j]))
break;
}
}
}//筛选法打表
int phi(int n)
{
int rea=n;
for(int i=0; p[i]*p[i]<=n; i++)//对于一些不是素数的可不遍历
if(n%p[i]==0)
{
rea=rea-rea/p[i];
while(n%p[i]==0){
n=n/p[i];
}
}
if(n>1)
rea=rea-rea/n;
return rea;
}
递推求欧拉函数
int pp[20000];
for(int i=1; i<=maxn; i++)
pp[i]=i;
for(int i=2; i<=maxn; i+=2)
pp[i]/=2;
for(int i=3; i<=maxn; i+=2)
if(pp[i]==i)
for(int j=i; j<=maxn; j+=i)
pp[j]=pp[j]/i*(i-1);