Я пытался создать свою собственную факториальную функцию, когда обнаружил, что вычисление в два раза быстрее, если оно вычисляется парами. Вот так:
Группы 1: 2 * 3 * 4... 50000 * 50001 = 4,1 секунды
Группы 2: (2 * 3) * (4 * 5) * (6 * 7)... (50000 * 50001) = 2,0 секунды
Группы 3: (2 * 3 * 4) * (5 * 6 * 7)... (49999 * 50000 * 50001) = 4,8 секунды
Вот С#, который я использовал для проверки этого.
Stopwatch timer = new Stopwatch();
timer.Start();
// Seperate the calculation into groups of this size.
int k = 2;
BigInteger total = 1;
// Iterates from 2 to 50002, but instead of incrementing 'i' by one, it increments it 'k' times,
// and the inner loop calculates the product of 'i' to 'i+k', and multiplies 'total' by that result.
for (var i = 2; i < 50000 + 2; i += k)
{
BigInteger partialTotal = 1;
for (var j = 0; j < k; j++)
{
// Stops if it exceeds 50000.
if (i + j >= 50000) break;
partialTotal *= i + j;
}
total *= partialTotal;
}
Console.WriteLine(timer.ElapsedMilliseconds / 1000.0 + "s");
Я тестировал это на разных уровнях и помещал среднее значение по нескольким тестам на гистограмме. Я ожидал, что он станет более эффективным, поскольку я увеличил количество групп, но 3 был наименее эффективным, а 4 не улучшался по сравнению с группами из 1.
Что вызывает эту разницу, и есть ли оптимальный способ ее вычисления?