第一篇博客__对快速幂的理解

 

快速幂用于对次幂进行幂的取余运算:形如 求 x^y % mod = ?;

简单办法是 进行y次 x*x % mod 循环。这样的时间复杂度为 N(n);

而快速幂可以讲时间复杂度缩至 N(log2(n))。

而具体如何实现的呢。这种方法是把 指数的 十进制y 转换成 二进制。

例如 2^10 = 2^1010。

2^10 = 2(2^3+2^1) = 2^2^3 + 2^2^1;

具体代码实现(函数):

int ksm(int x,int y,int mod)
{
   int ans = 1;
   for ( ; y ; y >>= 1, (x*=x)%mod)
       if ( y & 1)
           (ans *= x) %= mod;
   return ans;
}

其中涉及到的 位运算 能够理解,当时我对快速幂这个方法不理解的地方是:

(x * = x) %mod 中的 x * = x;

我的想法是 x 在循环中的值变化方式是 x ,x^2, x^4 ,x^8;

它就直接跳过了 x^3 ,x^5 ,x^6 ,x^7 等等。

那跳过了这些是不是就无法*上它呢,而导致算法错误

实则不然,仔细看x^y 的 y二进制表示, 在二级制中,y 全部都转化成了 2^t 形式。最终就是

x2(t0) * x2(t1) * x2(t2)····,而对应的就是 x ,x^2, x^4 ,x^8。并不会因没有 x^3 ,x^5 ,x^6 ,x^7而导致运算失败。

 

end:

因为这是我第一次写博客,在语言的组织、整体逻辑的表达以及博客的可读性上具有的问题而造成的无法看懂或者不方便观看。对此感到非常抱歉。我写这篇博客目的就是让我的脑子转过弯来,不要一直陷入死胡同,对一个简单的快速幂,我理解的两个小时。如果下次我脑子又一抽,觉得x*=x这个有问题的时候,能够点醒一下自己。

 

posted @ 2022-04-05 22:36  jay_is_chou  阅读(48)  评论(0)    收藏  举报