为什么这段代码会返回一个数字的因数之和?
在几个欧拉计划问题中,你需要计算因数之和作为问题的一部分。在其中一个论坛上,有人发布了以下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;
}
现在,我已经尝试了很多次并且发现它是有效的。问题是,为什么呢?
以因数100为例:1、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子i的第i个索引):
return product(sum(Fi^k, k from 0 to Ni), i from 1 to m)
其中m
是唯一质因数的数量,Ni
是每个唯一质因数在质因数分解中出现的次数。
为什么这个公式等于因子的总和?我的猜测是它通过分配律等于每个唯一的质因数的所有唯一组合(即每个唯一因子),但我不知道如何证明。