C++ C+中的模幂运算+;
我的模块求幂代码有点问题,尽管使用两个不同的伪代码源时写了三次,我还是无法发现问题。我在SE上阅读了关于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
#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
。另请参见。