快速幂

原理编辑
以下以求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.

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

点赞