爲什麼此代碼返回一個數字的因子總和?查找因子總和
在一些項目歐拉問題中,您被要求計算因子的總和作爲問題的一部分。在其中的一個論壇上,有人發佈了以下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個指標):
return product(sum(Fi^k, k from 0 to Ni), i from 1 to m)
其中m
是唯一素因子數,Ni
是每個唯一因素在素因子分解中出現的次數。
爲什麼這個公式等於這些因子的總和?我的猜測是它等於通過分配性質的每個唯一因素組合(即每個唯一因素)的總和,但我不知道如何。
我想你的意思是[2 *(2 *(2 + 1)+1)+1] = 15 – 2010-12-17 02:30:35
@Adrian Petrescu:是的,謝謝。我會修復它 – 2010-12-17 02:35:59