【问题标题】:Find sum of factors求因子之和
【发布时间】:2010-12-17 02:25:07
【问题描述】:

为什么这段代码会返回一个数的因数之和?

在几个 Project Euler 问题中,您被要求计算因子的总和作为问题的一部分。在那里的一个论坛上,有人发布了以下 Java 代码作为找到该总和的最佳方法,因为您实际上不必找到单个因素,只需找到主要因素(您不需要了解 Java,您可以跳到我下面的总结):

public int sumOfDivisors(int n)
{
    int prod=1;
    for(int k=2;k*k<=n;k++){
        int p=1;
        while(n%k==0){
            p=p*k+1;
            n/=k;
        }
        prod*=p;
    }
    if(n>1)
        prod*=1+n;
    return prod;
}

现在,我已经尝试了很多次,我发现它有效。问题是,为什么?

假设您考虑了1001,2,4,5,10,20,25,50,100。总和是217。素数分解是2*2*5*5。这个函数给你[5*(5+1)+1]*[2*(2+1)+1] = [25+5+1]*[4+2+1] = 217

分解8: 1,2,4,8。总和是15。素数分解是2*2*2。这个函数给你[2*(2*(2+1)+1)+1]=15

算法归结为(使用Fi 表示因子 F 或 F sub i 的第 i 个索引):

return product(sum(Fi^k, k from 0 to Ni), i from 1 to m)

其中m 是唯一素因数的数量,Ni 是每个唯一因数在素因数分解中出现的次数。

为什么这个公式等于因子之和?我的猜测是,它等于通过分配属性的主要因素的每个独特组合(即每个独特因素)的总和,但我不知道如何。

【问题讨论】:

  • 我想你的意思是 [2*(2*(2+1)+1)+1]=15
  • @Adrian Petrescu:是的,谢谢。我会解决的

标签: math sum number-theory factors


【解决方案1】:

让我们看看最简单的情况:当 n 是质数的幂。

k^m的因数是1, k, k^2, k^3 ... k^m-1。

现在让我们看一下算法的内循环:

第一次迭代后,我们有k + 1

第二次迭代后,我们有k(k+1) + 1,或k^2 + k + 1

第三次迭代后,我们有k^3 + k^2 + k + 1

等等……


这就是它对作为单素数幂的数字的工作原理。我可能会坐下来将其概括为所有数字,但您可能想先自己尝试一下。

编辑:既然这是公认的答案,我将通过展示该算法如何处理具有两个不同质因数的数字来详细说明。然后可以直接将其推广到具有任意数量的不同质因数的数字。

x^i.y^j的因子是x^0.y^0,x^0.y^1...x^0.y^j,x^1.y^0...

每个不同的素数因子的内部循环生成x^i + x^i-1 + ... + x^0y 也是如此)。然后我们只需将它们相乘,就得到了因子的总和。

【讨论】:

  • 谢谢,我试试。一秒。
  • 知道了!如果数字 A=k^mp^n,则因子将是 1,k,k^2...k^m, 1,p,p^2...p^n 以及这两个中的一个项目。每个因子作为矩阵中的一个条目,第一行是 1,k,k^2...k^m,第一列是 1,p,p^2,...p^n。任何项目 ij 将是 k^ip^j。补码将是条目 n-i,m-j。第一行是 1,k,k^2...k^m,第二行是 p x 第一行,第三行是 p^2 x 第一行,最后一行是 p^n x第一排。因此,每个条目的总和(即 A 的每个因子)等于 [1+k+k^2+...+k^m]*[1+p+p^2+...+p^ n]。再次感谢
  • 是的,你好像明白了:)
【解决方案2】:

算法本质上是看n的素因子的所有有序子集的集合,类似于n的因子集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-04
    • 2011-08-17
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多