模块化算法计算错误

时间:2013-02-16 05:05:23

标签: c++

我有一个程序使用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;
 }

1 个答案:

答案 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几乎是完全误导的。)