このコードが数値の因数の合計を返すのはなぜですか?
いくつかの 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
は素因数分解で各一意の要素が発生する回数です。
この式が因数の合計に等しいのはなぜですか? 私の推測では、分配特性を介して素因数のすべての一意の組み合わせ (つまり、すべての一意の要素) の合計に等しいと思いますが、その方法はわかりません。