首页 > 后端开发 > C++ > 正文

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

DDD
发布: 2024-10-28 18:57:29
原创
437 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!