Найти сумму множителей

Почему этот код возвращает сумму множителей числа?

В нескольких задачах 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 - количество раз, когда каждый уникальный множитель встречается при разложении на простые множители.

Почему эта формула равна сумме факторов? Я предполагаю, что оно равно сумме каждой уникальной комбинации простых факторов (т.е. каждого уникального фактора) через свойство распределения, но я не понимаю, как это сделать.

7
задан Zero Piraeus 22 January 2015 в 18:33
поделиться