欧拉函数

定义

在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。 例如φ(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)就是1本身)。

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

 

性质

① 若n为质数,则 φ(n)= n-1

② 若n是质数p的k次幂,φ(n) = p^k * (1 – 1/p) = p^k -p^(k-1)=(p-1)p^(k-1)

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

③ 欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)=(m-1)(n-1)

     证明:若m,n互质,只需在mn-1个数中减去m与n的小于mn的倍数即可

                m的倍数:2m, 3m, 4m…. (n-1)m  ——   n-1个

                n的倍数:2n, 3n, 4n…. (m-1)n  ——  m-1个

                所以,φ(mn) = mn-1-(n-1)-(m-1) = mn-n-m+1 = (m-1)(n-1)

④ 当n为奇数时,φ(2n)=φ(n)

     证明与④类似。

 

代码

一个整数n(n>=2)可以拆成若干质数的乘积。

这些质数有两种情况:① m与n不同,即互质(因为两个都是质数),可以写成φ(mn)  = (m-1)(n-1)

                                    ② m与n相同,即整数为质数p的k次,可以写成φ(n) = (p-1)p^(k-1)

所以就可以对整数n取因数,若 i 是因数,ans += (i-1), 若因数 i 多次出现,第二次开始 ans += i 即可 

普通写法:

int euler(int n)
{
	int ret = 1, i;
	for(i=2; i*i<=n; i++)
		if(n%i==0)
		{
			n /= i;
			ret *= i-1;
			while(n%i==0)
			{
				n /= i;
				ret *= i;
			}
		}
	if(n>1)
		ret *= n-1;
	return ret;
}

打表写法(跟埃式筛法有点像):

int main()
{
	int euler[maxn];
    euler[1] = 1;
    for(int i=2;i<maxn;i++) euler[i] = i;
    
	for(int i=2;i<maxn;i++)
        if(euler[i] == i)
        	for(int j=i;j<maxn;j+=i)
            	euler[j] = euler[j]/i*(i-1);
            	
}

点赞