定义
在数论,对正整数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);
}