模幂运算(模运算中的功率)

时间:2017-08-08 10:45:48

标签: c++ c algorithm math

  

您好!   我无法理解模幂运算的概念。当我需要这个以及它是如何工作的。   
假设我将电源功能称为:电源(2,n-1)。   
如何执行循环,例如 n = 10

#define m 1000000007

unsigned long long int power(unsigned long long int x, unsigned long long int n){

    unsigned long long int res = 1;
    while(n > 0){
        if(n & 1){
            res = res * x;
            res = res % m;
        }
        x = x * x;
        x= x % m;
        n >>= 1;
    }
    return res;

}

1 个答案:

答案 0 :(得分:5)

根据DAle链接的维基百科页面上的模数法(在您之前的问题上),我们可以获得两个公式:

enter image description here

从第一个公式可以清楚地看出,我们可以从n的结果中迭代计算n / 2的模数。这是由行

完成的
x = x * x;
x = x % m;

因此算法中有log n个步骤,因为每次x的指数加倍。计数步骤由n >>= 1while (n > 0)完成,计算log n步。

现在,您可能想知道1)为什么这部分不设置res的值,以及2)这些行的目的是什么

if(n & 1){
   res = res * x;
   res = res % m;
}

这是必要的,因为在迭代中的某些点,无论是开始还是结束,n的值可能是奇数。我们不能忽略它并继续使用公式1,因为这意味着我们跳过 x的力量! (整数除法向下舍入,例如5 >> 1 = 2,我们将x^4而不是x^5。此if语句处理n为奇数时的情况,即n % 2 = n & 1 = 1。它只是使用上面的公式2来为结果“添加”x的单一幂。