Fast_Modular_Exponentiation这个递归函数的解释
Explanation of this recursive function of Fast_Modular_Exponentiation
这是我目前正在学习的 udemy 课程的代码。这段代码是递归求解(a^n)%b
.
int fastExpo(int a, long long n, int MOD) {
if(n == 0)
return 1;
/// (a^n) % MOD
if(n % 2 == 0)
/// a ^ n = ((a ^ 2) ^ (n/2))
return fastExpo((1LL * a * a) % MOD, n / 2, MOD);
/// a ^ n = a * (a ^ (n - 1))
return (1LL * a * fastExpo(a, n - 1, MOD)) % MOD;
}
在此,我没看懂这行代码:(1LL * a * a) % MOD
。我知道如果 n
是偶数,(x^n)%MOD = ((x^(n/2))^2)%MOD
,但我不明白为什么我们要计算 (a^2)%MOD
,而我们应该计算 ((a^2)^(1/2))%MOD
。那么,有人可以向我解释一下这个递归步骤是如何正确的,以及递归在这种情况下实际上是如何工作的吗?
((a^2)^(1/2))%MOD
等于 a%MOD
。因此,如果 n
是奇数算法,则将当前值乘以 a
,然后从 n
中减去 1,以便在下一步中得到偶数 n
。
可以在此处找到算法的完整说明:https://en.m.wikipedia.org/wiki/Modular_exponentiation,请参阅从右到左的二进制方法
这里当n为偶数时使用
(x^n)%MOD = (((x^2)%MOD)^(n/2))%MOD
这也是正确的,在代码中使用它。
因为算法说 (a ⋅ b) mod m = [(a mod m) ⋅ (b mod m)] mod m
查找详细信息here 并进行解释
这是我目前正在学习的 udemy 课程的代码。这段代码是递归求解(a^n)%b
.
int fastExpo(int a, long long n, int MOD) {
if(n == 0)
return 1;
/// (a^n) % MOD
if(n % 2 == 0)
/// a ^ n = ((a ^ 2) ^ (n/2))
return fastExpo((1LL * a * a) % MOD, n / 2, MOD);
/// a ^ n = a * (a ^ (n - 1))
return (1LL * a * fastExpo(a, n - 1, MOD)) % MOD;
}
在此,我没看懂这行代码:(1LL * a * a) % MOD
。我知道如果 n
是偶数,(x^n)%MOD = ((x^(n/2))^2)%MOD
,但我不明白为什么我们要计算 (a^2)%MOD
,而我们应该计算 ((a^2)^(1/2))%MOD
。那么,有人可以向我解释一下这个递归步骤是如何正确的,以及递归在这种情况下实际上是如何工作的吗?
((a^2)^(1/2))%MOD
等于 a%MOD
。因此,如果 n
是奇数算法,则将当前值乘以 a
,然后从 n
中减去 1,以便在下一步中得到偶数 n
。
可以在此处找到算法的完整说明:https://en.m.wikipedia.org/wiki/Modular_exponentiation,请参阅从右到左的二进制方法
这里当n为偶数时使用
(x^n)%MOD = (((x^2)%MOD)^(n/2))%MOD
这也是正确的,在代码中使用它。
因为算法说 (a ⋅ b) mod m = [(a mod m) ⋅ (b mod m)] mod m
查找详细信息here 并进行解释