このコードが数値の因数の合計を返すのはなぜですか?
いくつかの Project Euler の問題では、問題の一部として因数の合計を計算するよう求められます。そこのフォーラムの 1 つで、誰かが次の 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 sub i の i 番目のインデックスを意味するために使用):
return product(sum(Fi^k, k from 0 to Ni), i from 1 to m)
ここで、mは一意の素因数の数、Niは素因数分解で各一意の要素が発生する回数です。
この式が因数の合計に等しいのはなぜですか? 私の推測では、分配特性を介して素因数のすべての一意の組み合わせ (つまり、すべての一意の要素) の合計に等しいと思いますが、その方法はわかりません。