Math 求因子之和
为什么这段代码返回一个数字的因子之和 在几个项目Euler问题中,要求您计算作为问题一部分的因子之和。在那里的一个论坛上,有人发布了以下Java代码,作为找到该总和的最佳方式,因为您实际上不必找到单个因素,只需找到主要因素(您不需要了解Java,您可以跳到下面我的摘要): 其中,Math 求因子之和,math,sum,number-theory,factors,Math,Sum,Number Theory,Factors,为什么这段代码返回一个数字的因子之和 在几个项目Euler问题中,要求您计算作为问题一部分的因子之和。在那里的一个论坛上,有人发布了以下Java代码,作为找到该总和的最佳方式,因为您实际上不必找到单个因素,只需找到主要因素(您不需要了解Java,您可以跳到下面我的摘要): 其中,m是唯一素因子的数目,Ni是每个唯一因子在素因子分解中出现的次数 为什么这个公式等于这些因素之和?我的猜测是,它等于通过分配属性的素数因子的每个唯一组合(即每个唯一因子)的总和,但我不知道如何计算。让我们看看最简单的情况
m
是唯一素因子的数目,Ni
是每个唯一因子在素因子分解中出现的次数
为什么这个公式等于这些因素之和?我的猜测是,它等于通过分配属性的素数因子的每个唯一组合(即每个唯一因子)的总和,但我不知道如何计算。让我们看看最简单的情况:当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^0
(对于y
)也是如此。然后我们把它们相乘,得到因子的和。该算法基本上是研究n的素因子的所有有序子集的集合,这与n的因子集合类似。我想你的意思是[2*(2*(2+1)+1]=15@Adrian彼得雷斯库:是的,谢谢。我会修好的,汉克斯,我会试试的。等一下,明白了!如果一个数字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]。再次感谢是的,看起来你明白了:)
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;
}
return product(sum(Fi^k, k from 0 to Ni), i from 1 to m)