【问题标题】:Modulo for large numbers that are squared平方的大数的模
【发布时间】:2016-06-09 20:01:26
【问题描述】:

我有一个很大的数字,我想取其余的。例如 300^31。当我尝试使用 % 运算符时,它说我不能在双打上使用它,因为它仅适用于整数。这个计算有什么函数吗?

我尝试使用a=pow(b,x)%d;

【问题讨论】:

  • 您是否尝试对整数进行精确计算(例如,用于密码学)?如果是这样,您将找不到用于此的内置 C++ 函数,并且您不需要任何类型的浮点近似。尝试搜索“模幂”,您会发现一些相对简单的方法来实现您想要的,而不必生成巨大的中间值。

标签: c++ modular-arithmetic


【解决方案1】:

如果bxd 适合整数,则可以使用

int expoModulo(int b, int x, int d) {
    int a = 1;
    for(int i=0; i<x; i++) {
        a = (a*b)%d;
    }
    return a;
}

【讨论】:

    【解决方案2】:

    我认为在您尝试求幂时最好取余数。您可以使用Big Modulo Algorithm。它将帮助您避免获得大数字。之后,您可以使用 long long 而不是 double。

    我尝试在代码块 16.01 (codeblocks-16.01mingw-setup.exe) 中编写此代码,它运行良好(我的代码与链接代码略有不同,但概念相同):

    #include<iostream>
    using namespace std;
    
    int bmod = 33;
    
    int bigmod(long long int x,long long int b){ // x^b
        int ans=1;
        while(b){
            if(b%2)ans=((long long)ans*x)%bmod;
            b=b>>1;
            x=((long long)x*x)%bmod;
        }
        return ans;}
    
    int main(){
        cout<<bigmod(300,31);
    }
    

    【讨论】:

    • 我的 c++ 不支持 long long,我使用代码块,知道如何解决吗?
    • 认真的吗?不可能,long long int 是内置数据类型
    • |11|错误:ISO C++ 1998 不支持'long long'|
    • 我认为是编译器问题,尝试更新它或查看此问题:stackoverflow.com/questions/4017621/…。但是如果你的数字不够大,你可以使用 int
    • @Sick654 更新编译器很容易。找到 mingw-w64 的下载链接,将其安装在某处(不要触摸任何设置)。打开 CB 设置并将编译器路径更改为您刚刚放置 mingw-w64 的位置。此外,当您更改编译器设置时,您还应该启用-std=c++14 标志,这将启用最新的花哨的 C++ 功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 2019-10-07
    • 2013-08-30
    • 2018-05-30
    • 2019-02-16
    • 1970-01-01
    • 2015-03-04
    相关资源
    最近更新 更多