Euler:欧拉函数

/原文:2018-12-18

/更新于2019-8-7

欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示。

通式:
 
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
  • 比如x=12,拆成质因数为12=2*2*3,
  • 12以内有1/2的数是2的倍数,那么有1-1/2的数不是2的倍数(1,3,5,7,9,11),
  • 这6个数里又有1/3的数是3的倍数,
  • 只剩下(1 - 1/2 - 1/3)的数既不是2的倍数,也不是3的倍数(1,5,7,11)。
  • 这样剩下的12*(1 - 1/2 - 1/3)=4,即4个数与12互质,所以φ(12)=4。

证明:对于正整数x,

  • 如果x=1,则 φ(1) = 1。
    • 1与任何数(包括自身)都构成互质关系。
  • 如果x是质数,则 φ(x)=x-1 。
    • 质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。
  • 如果n只有一个质因数p,即x = p^k(p为质数,k>=1),则φ(pk)=pk(1-1/p)=pk-pk-1 。
    • 从1~x中,p的倍数共有x/p个,共占了1/p,则减去这些数后,还剩下x*(1-1/p)个。
    • 可以看出,上一种情况是 k=1 时的特例。
  • 如果n可以分解成两个互质的整数之积,即n = p1 * p2,φ(x) = φ(p* p2) = φ(p1) * φ(p2)。
    • φ(a)=m,φ(b)=n,φ(a*b) = a(1-p1)(1-p2)...*b(1-q1)(1-q2)... = m*n
    • 欧拉函数是积性函数(若当m与n互质时,f(m∗n)=f(m)∗f(n) f(m*n)=f(m)*f(n)f(m∗n)=f(m)∗f(n),那么f是积性函数。)
  • 任意一个大于1的正整数,都可以写成一系列质数的积。
  • 可以得到,φ(x) = φ(p1)*φ(p2)*...*φ(pn) = x(1-1/p1)*(1-1/p2)*...*(1-1/pn).

一些目前不需要的性质:

  • 当n>2时,φ(n)是偶数。
  • 若n为奇数时,φ(2n)=φ(n)。
  • n的因数(包括1和它自己)的欧拉函数之和等于n。
  • [0,n-1]中,与n互质的数的总和为:$φ(n)*n/2  (n>1)$。
    • 因为$gcd(n,i)=gcd(n,n-i)$,所以与n互质的数可以关于n/2对称,也就是相加等于n (居然真遇到这题了)
  • 对于任何两个互质的正整数a,n(n>2)有:aφ(n)1(mod n) 此公式即 欧拉定理。
  • 在上式的基础上,当n是质数时(即φ(n) = n-1),则上式有: an-11(mod n)此公式即 费马小定理。


求欧拉函数:

1.埃拉托斯特尼筛

求1~n所有数的欧拉函数:每次找到一个质数,就把它的倍数更新掉。复杂度大概是O(nlognlogn)。

void euler(int n) {
    for (int i=1; i<=n; i++) phi[i]=i; for (int i=2; i<=n; i++) if (phi[i]==i)//i是质数 for(int j=i; j<=n; j+=i) phi[j]=phi[j]/i*(i-1); }

 

2.欧拉筛

求n的欧拉函数:每次找到一个最小的因数(一定为质因数),求出x*(1 - 1/p)。复杂度为O(n)。

int euler(int n) {
    int res=n,a=n; for(int i=2; i*i<=a; i++) { if(a%i==0) { res=res/i*(i-1); while(a%i==0) a/=i; } } if(a>1) res=res/a*(a-1); //有质数剩余 return res; }

对于x = p1k1 * p2k2...,只需要求一次(1-p1)(1-p2)...就可以了,

为了保证每个质因数只被使用一次,通过以上的while循环把x中的p1除尽。

 

转载于:https://www.cnblogs.com/mogeko/p/11315051.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值