왜이 코드는 숫자의 합계를 반환합니까?요인 합계 찾기
여러 Project Euler 문제에서 문제의 일부로 요소 합계를 계산해야합니다. 포럼 중 하나에서, 누군가가 실제로 개인 요소를 찾지 않아도되고, 주요 요소만을 찾을 필요가 없기 때문에 누군가가 다음 합계를 찾는 가장 좋은 방법으로 다음 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
입니다. 이 기능은 알고리즘은 (요인 F 또는 F 서브 I의 i 번째 인덱스를 의미하는 Fi
사용)로 귀결 당신에게 [2*(2*(2+1)+1)+1]=15
을 제공합니다 m
고유 소인수의 수입니다
return product(sum(Fi^k, k from 0 to Ni), i from 1 to m)
을 Ni
입니다 각각의 고유 한 요소가 소수 분해에서 발생하는 횟수.
이 공식은 요인의 합계와 같은 이유는 무엇입니까? 내 생각에 분산 속성을 통한 소수 요소 (예 : 모든 고유 요소)의 모든 고유 한 조합의 합계와 같지만 어떻게 보이지 않습니다.
나는 [2 * (2 + 1) +1) +1] = 15 –
을 의미한다고 생각합니다. @Adrian Petrescu : 네, 고마워요. 내가 고쳐 줄게 –