范围是10^18的大模算法

Big mod algorithm for range 10^18?

本文关键字:算法 范围是      更新时间:2023-10-16

我必须计算N^X MOD 10^18+7,我的范围是1<=N,X<=10^18。通常的大模算法将无法计算这个。解决这个问题的合适算法是什么我用的是c++。因为范围是10^18,所以10^18+7的最小mod将是10^18,如果是这样,那么编译器将不得不计算10^18*10^18。

有一个不涉及使用二进制的解决方案。平凡解决方案的主要问题是需要计算n*n。如果n>sqrt(2^63-1)将溢出int64数。解决这个问题的方法是用计算n^x%m的方法来计算n*n%m

我的意思是,你必须实现一个定制的模块化乘法,通过只做加法来避免溢出。

在c++中,类似于:

#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;
}