您好! 我无法理解模幂运算的概念。当我需要这个以及它是如何工作的。
假设我将电源功能称为:电源(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;
}
答案 0 :(得分:5)
根据DAle链接的维基百科页面上的模数法(在您之前的问题上),我们可以获得两个公式:
从第一个公式可以清楚地看出,我们可以从n
的结果中迭代计算n / 2
的模数。这是由行
x = x * x;
x = x % m;
因此算法中有log n
个步骤,因为每次x
的指数加倍。计数步骤由n >>= 1
和while (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
的单一幂。