3.7 欧拉函数

  欧拉函数(Euler’s totient function),也叫φ函数,入参只能是正整数。定义是从1到N这N个数里,和N互质的数的个数。欧拉函数没有通项公式,只有分段递归公式。下面是1~10的欧拉函数值:

x12345678910
φ(x)1122426464

  欧拉函数最简单的算法是循环。但是这个计算方法非常费时。高斯证明了以下一个公式:
∑ d ∣ n ϕ ( d ) = n \sum_{d|n}\phi(d)=n dnϕ(d)=n
  这里的d|n的意思是遍历n所有的约数。比如10的所有约数是1,2,5,10。这个公式没有恰当的翻译,我姑且翻译为约数欧拉函数和。所以应用上述公式有:
ϕ ( 1 ) + ϕ ( 2 ) + ϕ ( 5 ) + ϕ ( 10 ) = 10 \phi(1)+\phi(2)+\phi(5)+\phi(10)=10 ϕ(1)+ϕ(2)+ϕ(5)+ϕ(10)=10
  验证下哈,确实没错:
ϕ ( 1 ) + ϕ ( 2 ) + ϕ ( 5 ) + ϕ ( 10 ) = 1 + 1 + 4 + 4 = 10 \phi(1)+\phi(2)+\phi(5)+\phi(10)=1+1+4+4=10 ϕ(1)+ϕ(2)+ϕ(5)+ϕ(10)=1+1+4+4=10
  但是明白了这个公式后,我们就可以用一种快速的算法去计算了。但是计算过程并不能让人马上明白,所以我以刚才的φ(10)为例子。细细讲一下:
∵ ϕ ( 1 ) + ϕ ( 2 ) + ϕ ( 5 ) + ϕ ( 10 ) = 10 ∴ ϕ ( 10 ) = 10 − ϕ ( 1 ) − ϕ ( 2 ) − ϕ ( 5 ) \because \phi(1)+\phi(2)+\phi(5)+\phi(10)=10\\ \therefore \phi(10)=10-\phi(1)-\phi(2)-\phi(5)\\ ϕ(1)+ϕ(2)+ϕ(5)+ϕ(10)=10ϕ(10)=10ϕ(1)ϕ(2)ϕ(5)
  所以就是找到所有的因数。这个时候需要用到一种类似埃拉托色尼筛选法的算法。托色尼筛选法算法的本质是,我们不要去前面找所有的因数。而是去后面找所有的倍数减去我本身,与常规数组的向前遍历的算法稍有不同。我以求φ(10)为例子,讲解一下

  第一步先初始化为n

x012345678910
φ(x)012345678910

  1后面所有的数都是1的倍数,所以全部减去φ(1),所以变成:

x012345678910
φ(x)01123456789

  2后面所有2的倍数所以全部减去φ(2),所以变成:

x012345678910
φ(x)01122446688

  3后面所有3的倍数所以全部减去φ(3),所以变成:

x012345678910
φ(x)01122426668

  4后面所有4的倍数所以全部减去φ(4),所以变成:

x012345678910
φ(x)01122426468

  5后面所有5的倍数所以全部减去φ(5),所以变成:

x012345678910
φ(x)01122426464

  那么明白了算法之后,代码就容易了:

# _*_ coding:utf-8 _*_

def euler_totient(n):
    phi = [i for i in range(0, n + 1)]
    for i in range(1, n + 1):
        # 把i后面的全部减去phi[i]
        for j in range(i << 1, n + 1, i):
            phi[j] -= phi[i]
    return phi[n]


if __name__ == '__main__':
    print(euler_totient(10))

  测试结果:

4
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒过来摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值