首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >范围10^18的大模算法?

范围10^18的大模算法?
EN

Stack Overflow用户
提问于 2015-09-21 18:43:58
回答 1查看 2K关注 0票数 1

我必须计算N^X MOD 10^18+7,我的范围是1<=N,X<=10^18。通常的大模块算法将无法计算这一点。用C++解决这个问题的正确算法是什么?当范围为10^18时,10^18+7的最低模数将为10^18,如果是,则编译器必须计算10^18*10^18。会导致溢出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-21 18:53:34

有一种解决方案不涉及使用bignum。这个简单的解决方案的主要问题是需要计算n*n。如果n>sqrt(2^63-1)将溢出一个int64号码。解决这一问题的方法是按照计算n*n%m的方式计算n^x%m

我的意思是,您必须实现一个自定义模乘,通过只做加法来避免溢出。

在C++中,这可能类似于:

代码语言:javascript
复制
#include <iostream>
using namespace std;

template <typename T>
T mmul(T a, T b, T m) {
    a %= m;
    T result = 0;
    while (b) {
        if (b % 2) result = (result + a) % m;
        a = (a + a) % m;
        b /= 2;
    }
    return result;
}

template <typename T>
T mpow(T a, T b, T m) {
    a %= m;
    T result = 1;
    while (b) {
        if (b % 2) result = mmul(result, a, m);
        a = mmul(a, a, m);
        b /= 2;
    }
    return result;
}


int main() {
    long long big = 1000000000000000000;
    cout << mpow(big+1, big+2, big+7) << endl;
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32702449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档