Почему этот код возвращает сумму множителей числа?
В нескольких задачах Project Euler вас просят вычислить сумму множителей как часть задачи. На одном из форумов кто-то разместил следующий 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
для обозначения i-го индекса фактор F или F sub i):
return product(sum(Fi^k, k from 0 to Ni), i from 1 to m)
где m
- количество уникальных простых множителей, Ni
- количество раз, когда каждый уникальный множитель встречается при разложении на простые множители.
Почему эта формула равна сумме факторов? Я предполагаю, что оно равно сумме каждой уникальной комбинации простых факторов (т.е. каждого уникального фактора) через свойство распределения, но я не понимаю, как это сделать.