首页  >  文章  >  后端开发  >  如何高效计算大指数的(a^b)%MOD?

如何高效计算大指数的(a^b)%MOD?

DDD
DDD原创
2024-10-28 18:57:29438浏览

How to Efficiently Calculate (a^b)%MOD with Large Exponents?

计算大指数的 (a^b)%MOD

在本次编程挑战中,任务是计算 pow( a, b)%MOD,其中指数 b 可能非常大。虽然传统的 log(b) 时间复杂度方法适合较小的值,但当 b 超过 C 中 long long 数据类型的容量时,它就变得不切实际。

然而,更有效的方法涉及利用 Euler 的 totient 函数, φ(MOD)。欧拉定理指出 a^φ(MOD)≡1(mod MOD)。这意味着 a 的幂可以显着降低为 a^(b % φ(MOD))。

计算 φ(MOD) 本身就是一项不平凡的任务,但可以使用整数分解方法来实现。计算完成后,指数 b 可以替换为 b % φ(MOD),以显着减少计算时间。

进一步细化

2008 年,Schramm 证明 φ (b) 可以通过 gcd(b, i) 的离散傅立叶变换获得,其中 i 的范围为 1 到 b。这消除了显式因式分解的需要。

此外,Carmichael 函数 λ(MOD) 可用于获得正确答案,特别是当 a 和 MOD 共享公因数时。

代码实现

以下代码片段作为 C 语言的示例:

<code class="cpp">#include <iostream>
#include <vector>

using namespace std;

typedef long long ll;

ll gcd(ll a, ll b) { return (b == 0) ? a : gcd(b, a % b); }

ll pmod(ll a, ll b, ll mod) {
    if (b == 0) return 1;
    if (b % 2 == 1) {
        return (a * pmod(a, b - 1, mod)) % mod;
    } else {
        ll tmp = pmod(a, b / 2, mod);
        return (tmp * tmp) % mod;
    }
}

int main() {
    ll a, b, mod;
    cin >> a >> b >> mod;
    cout << pmod(a, b % phi(mod), mod) << endl;
    return 0;
}</code>

以上是如何高效计算大指数的(a^b)%MOD?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn