Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的模幂运算+;_C++_Modulo_Exponentiation - Fatal编程技术网

C++ C+中的模幂运算+;

C++ C+中的模幂运算+;,c++,modulo,exponentiation,C++,Modulo,Exponentiation,我的模块求幂代码有点问题,尽管使用两个不同的伪代码源时写了三次,我还是无法发现问题。我在SE上阅读了关于C++中模幂运算的其他问题,但这对我没有帮助。 这是我的最后一段代码,用我认为更简单但不太理想的方式编写: #include<iostream> using namespace std; // base ^ exponent mod modulus unsigned mulmod1(unsigned base, unsigned exponent, unsigned modul

我的模块求幂代码有点问题,尽管使用两个不同的伪代码源时写了三次,我还是无法发现问题。我在SE上阅读了关于C++中模幂运算的其他问题,但这对我没有帮助。 这是我的最后一段代码,用我认为更简单但不太理想的方式编写:

#include<iostream>
using namespace std;

// base ^ exponent mod modulus 
unsigned mulmod1(unsigned base, unsigned exponent, unsigned modulus) {
    int result = 1;
    while(exponent > 0){
        if(exponent % 2 == 1)
            result = (result * base) % modulus;
        exponent >>= 1;
        base = (base * base) % modulus;
    }
  return result;
}

int main(){

//9688563^45896 mod 71 = 30
//12^53 mod 7 = 3

cout<<mulmod1(9688563,45896 ,71)<<"\n";   //gives 10 instead of 30
cout<<mulmod1(12,53,7)<<"\n";             //gives correct answer 3

return 0;
}
#包括
使用名称空间std;
//基指数模模量
无符号mulmod1(无符号基、无符号指数、无符号模){
int结果=1;
而(指数>0){
如果(指数%2==1)
结果=(结果*基础)%模数;
指数>>=1;
基底=(基底*基底)%模量;
}
返回结果;
}
int main(){
//9688563^45896模块71=30
//12^53模7=3

无法清理函数的输入
mulmod1
未签名
无法保持
9688563*9688563

如果你做得正确,你“只”需要一个能容纳模*模的数据类型(当然还有你的输入数字)才能正确地执行模幂运算。

清理函数的输入
mulmod1
无符号的
不能容纳
9688563*9688563

如果正确执行此操作,您“只”需要一个可以容纳模数*模数的数据类型(当然还有您的输入数字)才能正确执行模幂运算。

要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或添加打印语句)现在我开始觉得我不理解一些用模幂运算的思想或者用C++本身来理解一些东西,你应该找到最简单的测试用例,它不起作用,然后添加打印语句来跟踪每个单个i上的每个变量的值。进行迭代,并将其与手动计算进行比较。一旦出现差异,您就发现了错误。要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或添加打印语句)现在我开始觉得我不理解一些用模幂运算的思想或者用C++本身来理解一些东西,你应该找到最简单的测试用例,它不起作用,然后添加打印语句来跟踪每个单个i上的每个变量的值。然后将它们与手动计算进行比较。一旦出现差异,您就找到了错误。unsigned long long也很长,因此我必须尝试另一个伪代码以适合更大的numbers@Qbik如果不清楚的话,我建议你在对它进行任何计算之前,先做
base=base%modules
,我刚刚另外,mulmod1(968856345896,71)给出的答案仍然是20而不是30。事实上,我认为20是正确的答案。你可以在Python中尝试:
pow(968856345896,71)
产生
20
。另请参见。无符号long-long也是long-long,因此我必须尝试另一个伪代码以适合更大的应用numbers@Qbik如果不清楚,我建议您在对其进行任何计算之前先做
base=base%modules
。。我刚刚添加了这一点,mulmod1(968856345896,71)仍然有问题给出20而不是30实际上,我认为20是正确的答案。您可以在Python中尝试:
pow(968856345896,71)
产生
20
。另请参见。