欧拉函数求解

通式:

其中p1, p2……pn为x的所有质因数,x是不为0的整数。

φ(1)=1(和1互质的数(小于等于1)就是1本身)。

注意:每种质因数只一个。 比如12=2*2*3那么φ(12)=φ(4*3)=φ(2^2*3^1)=(2^2-2^1)*(3^1-3^0)=4

若n是质数p的k次幂,

,因为除了p的倍数外,其他数都跟n互质。

设n为正整数,以 φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值

φ:N→N,n→φ(n)称为欧拉函数。

欧拉函数是积性函数——若m,n互质,

特殊性质:当n为奇质数时,

, 证明与上述类似。

若n为质数则

#include<bits/stdc++.h>
using namespace std;
//直接求欧拉函数的值 
int euler(int n)
{
	int rea=n;
	for(int i=2;i*i<=n;i++)
	{
		if(n%i==0)//第一次找到 的必为素因子 
		{
			rea=rea-rea/i;//同一个素因子只能用一次 
			while(n%i==0)
			{
				n/=i;//把该素因子全部去掉 
			} 	
		}
	}
	if(n>1)
	   rea=rea-rea/n;
	 return rea; 
}
int main()
{
	int n;
	cin>>n;
	cout<<euler(n)<<endl;
	return 0;
}

先处理素数,再求解

#include<bits/stdc++.h>
using namespace std;
bool is_prime[100];
int p[100];
void check()
{
	for(int i=2;i<100;++i){
        is_prime[i]=1;
    }
    for(int i=2;i*i<100;++i)
    {
        if(is_prime[i]){
            for(int j=i*i;j<100;j +=i)
            {
                is_prime[j]=0;
            }
        }     
    }
    int k=0;
    for(int i=2;i<=100;i++)
    {
    	if(is_prime[i])
    	{
    		p[k++]=i;
		}
	}
    
}
int main() {
    check();
    int n;
    cin>>n;
    int res=n;
    for(int k=0;p[k]*p[k]<=n;k++)
    {
    	if(n%p[k]==0)
    	{
    		res=res-res/p[k];
		}
		while(n%p[k]==0)
		{
			n/=p[k];
		}	
	}
	if(n>1)
	{
		res=res-res/n;
	}
	cout<<res<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/amf12345/article/details/89111014
今日推荐