![]() |
1
34
[编辑] 最后一个想法(IMO)非常重要,我会在开头说:如果你一次收集了一堆托特人,你可以避免很多多余的工作。不要费心从大的数字开始寻找较小的因子——相反,要迭代较小的因子,并为较大的数字积累结果。
这在我的桌面上只需要8毫秒。 维基百科网页 Euler totient function 有一些很好的数学结果。
*根据第二个定义 trivial 这对于 Möbius inversion formula 这是一个巧妙的技巧,可以将这种精确形式的和求反。
这自然会导致代码
存在更好的 Möbius function 它可以被记忆为速度,但这应该很容易理解。 对tottent函数的更明显的计算是
换句话说,把数字完全分解成唯一的素数和指数,然后从中做一个简单的乘法。
同样,还有更好的
使用此代码计算桌面上从1到9999的所有数字的总数,平均超过5次运行,
|
![]() |
2
29
这就是 Euler totient function ,φ。 它具有乘法的激励性质:如果gcd(m,n)=1,那么phi(m n)=phi(m)phi(n)。phi很容易计算素数的幂,因为除同一素数较小幂的倍数外,下面的一切都是互质的。 显然,因子分解仍然不是一个微不足道的问题,但即使是sqrt(n)试验分区(足以找到所有的素因子)也比欧几里得算法的n-1应用更为困难。 如果你记住了,你就可以降低计算它们的平均成本。 |
![]() |
3
5
下面是一个简单、简单的wikipedia页面上给出的公式的实现,使用gmpy进行简单的因子分解(我有偏见,但如果你想在python中玩有趣的整数,你可能需要gmpy…;-):
例如,在我的普通工作站上,计算Euler_Phi(123456789)[我得到82260072]需要937微秒(使用python 2.5;897使用2.4),这似乎是相当合理的性能。 |
![]() |
Muhammad Umer · 为什么这个随机数猜谜游戏模拟产生5.8 6 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 7 月前 |
|
D W · Python-将浮点数从2转换为10到100位小数 8 月前 |
![]() |
Bartol · 确定python龟图形中的角度 1 年前 |
|
randomAlgo · 将弹簧设置为相同长度的成本最低 1 年前 |
![]() |
Fyodor · 在C中使用sin和cos计算数学表达式不正确? 1 年前 |
![]() |
Sergio · python中大量数字的乘法 1 年前 |