欧拉函数性质以及代码

先说欧拉函数的两条性质吧:

1.欧拉函数的求法,Euler(A)=A*(1-1/p1)*(1-1/p2)*....*(1-1/pn)。(p为A的分解质因数中的不同的质因数)

证明:首先我们从给出的一个实例12开始分析,从1到12的数依次为:1 2 3 4 5 6 7 8 9 10 11 12

找到12分解质因数中存在的质因子:2 3,那么我们在1~12中去掉2的倍数和3的倍数,得到的即为Euler(12),因为如果存在一个数a,使得gcd(12,a)!=1,那么2|gcd(12,a) (注:gcd(12,a)是2的倍数)或者 3|gcd(12,a)。

所以我们得到最简单的求n的欧拉函数的求法:列出1~n的数,去掉其中所有(p1,p2...pn)的倍数,即为答案。但是这一步可以简化,对于p1来说,去掉p1后的数为A-A/p1,对于然后去掉p2的倍数,剩下来的数为A*(1-1/p1)*(1-1/p2) (这一步可以好好自己琢磨琢磨),最终剩下的数量为A*(1-1/p1)*(1-1/p2)*....*(1-1/pn)。

最终得到解:Euler(A)=A*(1-1/p1)*(1-1/p2)*....*(1-1/pn)。(p为A的分解质因数中的不同的质因数)

2.欧拉函数中,当A与B是互素时,Euler(A*B)=Euler(A)*Euler(B),即欧拉函数是积性函数,但不是完全积性函数。

证明:对于A的不同质因数,Pa1,Pa2,..Pan,有Euler(A)=A*(1-1/Pa1)*(1-1/Pa2)*...*(1-1/Pan),对于B的不同质因数,Pb1,Pb2,...Pbn,Euler(B)=B*(1-1/Pb1)*(1-1/Pb2)*....*(1-1/Pbn)。如果Pai属于A,那么Pai一定不属于B,因为如果属于了,那么GCD(A,B)就为Pai了啊。所以我们有理由得到A*B的不同质因数有且仅为Pa1,Pa2,..Pan,Pb1,Pb2,...Pbn,所以Euler(A*B)=A*B*(1-1/Pa1)*(1-1/Pa2)*...*(1-1/Pan)*(1-1/Pb1)*(1-1/Pb2)*....*(1-1/Pbn)=A*(1-1/Pa1)*(1-1/Pa2)*...*(1-1/Pan)*B*(1-1/Pb1)*(1-1/Pb2)*....*(1-1/Pbn)=Euler(A)*Euler(B)。

有了上面两条性质,我们写起Euler函数的代码就轻松多了。

写Euler函数之前,我们先给出三个条件:

1.对于素数A,有Euler(A)=A*(1-1/A)=A-1。(A有且只有一个质因子,它自己)

2.如果对于任意数A和素数p,有A%p==0,那么Euler(A*p)=p*Euler(A)。(证明:设A的质因子为p,P1,P2,..Pn,那么A*p的质因子也一定是p,P1,P2,..Pn,所以Euler(A)=A*(1-1/p)*(1-1/P1)*...*(1-1/Pn),Euler(A*p)=A*p*(1-1/p)*(1-1/P1)*...*(1-1/Pn),所以Euler(A*p)=Euler(A)*p。)

3.如果对于任意数A和素数p,有A%p!=0,那么A与p互素,所以Euler(A*p)=Euler(A)*Euler(p)=Euler(A)*(p-1)。

有了以上三个条件,我们再来借鉴筛素数的方法,即可快速得到Euler函数的值,将复杂度降到O(n)。

代码:

void Euler() {
	memset(is_prime, 1, sizeof(is_prime));
	memset(prime, 0, sizeof(prime));
	for (int i=1; i<MAXN; ++i) euler[i]=i;
	p_cnt=0;
	for (int i=2; i<MAXN; ++i) {
		if (is_prime[i]) {
			prime[p_cnt++]=i;
			euler[i]=i-1;
		}
		for (int j=0; j<p_cnt&&prime[j]*i<MAXN; ++j) {
			is_prime[prime[j]*i]=false;
			if (i%prime[j]==0) {
				euler[i*prime[j]]=euler[i]*prime[j];   //条件2的递推
				break;            //为啥break?拿3,5,7,15,35,105动手推一下,这里确保每个数只
			}
			else {
				euler[i*prime[j]]=euler[i]*(prime[j]-1); //条件3的递推
			}
		}	
	}
} 

关于它的应用,可以浏览博客(PS:一定程度参照了这位博主的博客):

http://www.cnblogs.com/1-1-1-1/p/5727032.html

猜你喜欢

转载自blog.csdn.net/xiaobai__lee/article/details/77528505