生成互质对的有效方法

时间:2018-11-28 21:25:18

标签: primes greatest-common-divisor

我需要打印辅数对(a,b)的数量,0 http://mathworld.wolfram.com/CarefreeCouple.html

但是该程序没有我预期的那么快。 我听说过一种有效的方法,可以通过使用“ Farey Sequence”来解决此问题,但是代码是用PHP编写的,我只能理解C。

那么哪种方法可以帮助我解决问题?感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您陈述的兴趣在于互质对(a,b)。无忧无虑的夫妇增加了一个附加限制,即a是无平方的。因此,尽管有些数学上是相似的,但这不是相同的问题。据我了解,您的问题等同于将欧拉totient函数从1求和到n,即所谓的Totient Summatory Function

我不知道有任何技巧可以给出一个简单的封闭式解决方案来给出答案。但是,我认为在大多数编程语言中,修改简单的Sieve of Eratosthenes(SoT)应该可以在不到10秒的时间内获得答案。

正常运行SoT只会产生素数<= n的列表。但是,我们的目标将改变为计算介于1和n之间(含1和n)的每个整数的完整素数功率因数分解。为此,我们必须为每个筛分条目存储多于一个的信息位,我们必须存储一个列表。当我们通过数组筛选质数p时,我们将(p,1)添加到已存储在该条目中的列表中。然后我们通过p 2 进行筛选,并将我们击中的每个位置的(p,1)项更改为(p,2),因此对于p <= n的每个幂和每个p <= 。完成后,您 可以快速计算每个值0 <= x <= n的Totient函数并将它们求和。

编辑:
我看到在math.stackexchange.com here上已经有了对该问题的更好的答案。在问题的解决解决之前,我会暂时保留这个答案。