原理编辑
以下以求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.
以上即为快速幂的解释与运用,不懂的可以仔细研读。