Друг предложил мне написать программу, которая получает три целых числа (int a, int n, int k)
и вычисляет максимально эффективно, a^n mod k
Я придумал это решение
public static int rec(int a,int n,int k) //calc a^n mod k
{
if(n == 1)
return a % k;
int exp1 = rec(a, n/2, k), exp2 = exp1;
if(n % 2 == 1)
exp2 = rec(a, n/2 + 1, k);
return (exp1 * exp2) % k;
}
Это невероятно простое рекурсивное решение, основанное на том факте, что a^(b+c) mod d = (a^b mod d * a^c mod d) mod d
работает в логарифмическом времени. По крайней мере теоретически.
На практике, когда мы измеряли наше решение, его линейное решение по времени было лучше, чем мое решение. Я подозреваю, что это связано с тем, что я использую рекурсию, а не циклы. Имеет ли это смысл? Если да, то как мне превратить этот код в итеративную программу?