公约的公约数的和

时间:2017-04-29 20:38:06

标签: algorithm math

在这个问题中,我想找到所有公对数除数的总和。对形成如下:

给定数量N = 3
然后这对数字和公约数如下:

  
      
  • (1,1)= 1,(1,2)= 1,(1,3)= 1
  •   
  • (2,2)= 3,(2,3)= 1,
  •   
  • (3,3)= 4(该对的公约数为1和3,因此总和为4)
  •   

所以答案是所有常见除数的总和,即11。

我在这里观察到某种类似的系列

for 1 : 1 1 1 1 ....
for 2 : 3 1 3 1 ....
for 3:  4 1 1 4 ....
for 4 : 7 1 3 1 7 .....
for 5 : 6 1 1 1 1 6 ....
for 6 : 12 1 3 4 3 1 12 ....

所以

使用上述模式可以解决这个问题吗?  如果,请通过为此写一个伪代码来帮助我。

1 个答案:

答案 0 :(得分:1)

在这个答案中,我假设您感兴趣的是单个参数N的简单函数。我认为它可以在O(N)中计算(假设您不进入长算术区域) 。实际上,您可以在OEIS A143127处找到指定为

的序列
  

k = d,...,n的k * d(k)之和,其中d(k)是k的除数。

然而,可能不是那么明显,为什么这个序列是正确的答案。要了解原因,请查看区别F(N) - F(N-1)。下一个N会在范围(i, N)中为i添加[1, N]对。对于p的每个除数N,将有N/p对将p加到总和中。换句话说,每个除数恰好将N加到总和中。因此,如果d(N)是除数的数量,那么对于所有对N * d(N),我们得到(i, N)

如果我们追求总和的顺序,我们可以得到更直接的公式。考虑一些固定的Nm < Nm将被添加多少次作为某对的公约数?好吧,它将被添加到所有对,其中两个数字除以m。在floor(N/m)之前,有m个数字除以N。由于我们只计算唯一对,因此每个floor(N/m) * (floor(N/m) + 1) / 2对将m添加到总和中。我们为所有m添加了O(N) - 时间公式

a(n) = sum_{m=1..N} m * floor(N/m) * (floor(N/m)+1)/2

OEIS提供了一个更复杂的公式,似乎有O(sqrt(N))运行时间

a(n) = sum_{m=1..floor(sqrt(n))} m*(m+floor(n/m))*(floor(n/m)+1-m) - A000330(floor(sqrt(n)))

,其中

A000330(n) = n*(n+1)*(2*n+1)/6. 

但我不确定他们是如何得到它的。仍然在我的测试中,这个公式为前30个值产生了正确的结果。