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

时间:2015-09-21 18:43:59

标签: c++ algorithm number-theory

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

1 个答案:

答案 0 :(得分:7)

有一种解决方案不涉及使用bignums。普通解决方案的主要问题是需要计算n*n。如果n>sqrt(2^63-1)会溢出int64个号码。解决此问题的方法是以与计算n*n%m相同的方式计算n^x%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;
}