我有一个程序使用Modular Exponentiation来计算7 ^ 644 mod 645,11 ^ 644 mod 645,3 ^ 2003 mod 99,123 ^ 1001 mod 101.我遵循Modular Exponentiation的规则然后当我编译我的结果时是错误的,输出的结果应该是436,1,22,27,但我的输出是关闭的。当我运行我的答案是643,655,20,39
这是我的代码:
int Modulo(int b, int e, int m)
{
int remainder;//set the remainder of the procedure
int x = 1;// modular initially sets x = 1
//while loop to request the multiplication
while ( e != 0)
{
remainder = e % 2;
e = e/2;
//Algorithm steps
if(remainder == 1)//if remainder = 1
x = ( x * b) % m;//then x = (x · power) % m
b = ( b * b) % m;//power = (power * power) % m
}
return x;
}
int main()
{
int b, e, m, modulo;//declares the variables
start:cout<<"Enter the base: ";//output for base
cin>>b;
cout<<"Enter the exponent: ";//output for exponent
cin>>e;
cout<<"Enter the number of modular: ";//output for mod
cin>>m;
modulo = b^e % m;//requesting the formula of Modular Exponentiation
cout<<"The answer is \n"<<modulo<<endl;
cin.get();
// I create if statement to allow the user to restart the application
//enter new value to see the different output
char c;
cout<<"Would you like to enter a new value? yes or no ";
cin>> c;
if(( c == 'Y') ||(c == 'y'))goto start ;//start is the label in the start of program
return 0;
}
答案 0 :(得分:0)
对于它的价值,我会编写类似这样的代码(测试并产生正确的结果,至少对于我尝试过的值):
unsigned Modulo(unsigned b, unsigned e, unsigned m) {
unsigned x = 1;
while (e > 0) {
if (e & 1)
x = x * b % m;
e >>= 1;
b = b * b % m;
}
return x;
}
请注意,我尝试使用与您的代码相同的名称 - 但其中许多并不会让我成为最好(甚至非常好)的选择。 Modulo
在我看来,这个名字特别差。我更喜欢pow_mod
之类的东西,至少暗示它在做什么(Modulo
几乎是完全误导的。)