快速幂

来源:互联网 发布:js offsetwidth 编辑:程序博客网 时间:2024/05/19 20:41

原理编辑
以下以求a的b次方来介绍[1]
把b转换成二进制数。
该二进制数第i位的权为

例如

11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算
实现编辑
快速幂可以用位运算这个强大的工具实现
1
b and 1{也就是取b的二进制最低位(即第0位) 判断b是否为奇数,是则为1}
1
b shr 1{就是去掉b的二进制最低位(即第0位)}
有了这个强大的工具,快速幂就好实现了!
以下为pascal的实现:

var a,b,n:int64;function f(a,b,n:int64):int64;var t,y:int64;begin      t:=1; y:=a;      while b<>0 do begin        if(b and 1)=1 then t:=t*y mod n;        y:=y*y mod n;{这里用了一个很强大的技巧,y*y即求出了a^(2^(i-1))不知道这是什么的看原理                     a^(2^(i-1))*a^(2^(i-1))=a^(2^i)                    而且一般情况下a*b mod c =(a mod c)*(b mod c) mod c}    b:=b shr 1;{去掉已经处理过的一位}  end;  exit(t);end;begin  read(a,b,n);{n是模}  writeln(f(a,b,n));end.

以上即为快速幂的解释与运用,不懂的可以仔细研读。

0 0