C++ 10^18范围内的大模算法?

C++ 10^18范围内的大模算法?,c++,algorithm,number-theory,C++,Algorithm,Number Theory,我必须计算N^X MOD 10^18+7,我的范围是1有一个解决方案不涉及使用bignums。这个简单解决方案的主要问题是需要计算n*n。如果n>sqrt(2^63-1)将溢出int64编号。解决这个问题的方法是用与计算n^x%m相同的方法计算n*n%m 我的意思是,您必须实现一个自定义的模乘,它通过只做加法来避免溢出 在C++中,这将是类似的: #include <iostream> using namespace std; template <typename T>

我必须计算N^X MOD 10^18+7,我的范围是1有一个解决方案不涉及使用bignums。这个简单解决方案的主要问题是需要计算
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;
}
#包括
使用名称空间std;
模板
T mmul(T a,T b,T m){
a%=m;
T结果=0;
而(二){
如果(b%2)结果=(结果+a)%m;
a=(a+a)%m;
b/=2;
}
返回结果;
}
模板
T mpow(T a、T b、T m){
a%=m;
T结果=1;
而(二){
如果(b%2)结果=mmul(结果,a,m);
a=mmul(a,a,m);
b/=2;
}
返回结果;
}
int main(){
长长大=10000000000000000000000;

cout有一个解决方案不涉及使用bignum。这个简单解决方案的主要问题是需要计算
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;
}
#包括
使用名称空间std;
模板
T mmul(T a,T b,T m){
a%=m;
T结果=0;
而(二){
如果(b%2)结果=(结果+a)%m;
a=(a+a)%m;
b/=2;
}
返回结果;
}
模板
T mpow(T a、T b、T m){
a%=m;
T结果=1;
而(二){
如果(b%2)结果=mmul(结果,a,m);
a=mmul(a,a,m);
b/=2;
}
返回结果;
}
int main(){
长长大=10000000000000000000000;

无法为您选择的语言使用大数字库。由于您没有指定您的语言或更多详细信息,此问题可能会很快结束,因为范围太广。在此之前,请编辑并添加额外信息:)“通常的大模块算法将无法计算此值”.你为什么这么说?我想它会工作得很好。范围是10^18。10^18+7的最小模是多少?10^18。如果我的两个输入都是10^18,那么它会导致溢出。@Kevin不,不会。要计算n^x%m,你必须做大量的n*n。如果m>n>sqrt(2^63-1)这将再次溢出,什么语言?浮动/双精度可能适用于您(取决于精度),或其他在生成更大数据类型方面很聪明的系统。“溢出”不是算法或数论问题。它是语言问题。请为您选择的语言使用一个大的数字库。由于您没有指定语言或更多详细信息,此问题可能会很快结束,因为范围太广。在此之前,请编辑并添加额外信息:)“通常的大模块算法将无法计算此值”.你为什么这么说?我想它会工作得很好。范围是10^18。10^18+7的最小模是多少?10^18。如果我的两个输入都是10^18,那么它会导致溢出。@Kevin不,不会。要计算n^x%m,你必须做大量的n*n。如果m>n>sqrt(2^63-1)这将再次溢出,什么语言?浮点/双精度可能适用于您(取决于精度)或其他擅长生成更大数据类型的系统。“溢出”不是算法或数论,而是语言。