zoukankan      html  css  js  c++  java
  • 快速幂学习笔记

    快速幂

    1. 快速幂代码
    int Fastmi(int a,int b,int p)
    {
    	int ans = 1 % p;
    	for(; b; b >>= 1)
    	{
    		if(b & 1) ans = (long long)ans * a % p;
    		a = (long long)a * a % p;
    	}
    	return ans;
    }
    
    1. 快速幂的数学原理?
      (b)在二进制下有(k)位,第(i)位的数字是(c_i),则每一个正整数都可以唯一表示为若干个指数不重复的(2)的次幂的形式:

    [b = c_{k-1}2^{k-1} + c_{k-2}2^{k-2} + cdots + c_{0}2^{0} ]

    (a^b)可以如此表示:

    [a^b = a^{c_{k-1}2^{k-1}} * a^{c_{k-2}2^{k-2}} * cdots * a^{c_{0}2^{0}} ]

    每次循环我们都将(a)平方,这样(2)的次幂将被表示出来,即从(2^0)一直到(2^{k-1})。我们将b在二进制下的每一位取出,若是1,则说明这一项(c_i)不为(0),将乘积累乘到ans当中去;若是0,则(c_i)(0),则ans的值不变。(b)&(1)运算可以取出(b)在二进制下的最低位(这也是为什么我们要从(2^0)一直累乘到(2^{k-1})的原因),而(b>>1)运算可以遍历(b)在二进制下的所有数位。
    3. 快速幂的时间复杂度?
    整个算法的时间复杂度为(O(log_2b)),比起只有(O(n))的pow不知道高到哪里去了。

  • 相关阅读:
    JDK源码分析 – HashMap
    牛哄哄的celery
    redis数据库基础篇
    RPC的入门应用
    Python的常用模块
    消息队列之真知灼见
    面向对象编程(2)
    python3的C3算法
    面向对象编程(1)
    CRM项目之stark组件(2)
  • 原文地址:https://www.cnblogs.com/breadcomplex/p/14044318.html
Copyright © 2011-2022 走看看