algorithm@ Matrix fast power
一. 什么是快速幂:
快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。一般一个矩阵的n次方,我们会通过连乘n-1次来得到它的n次幂。但做下简单的改进就能减少连乘的次数,方法如下:把n个矩阵进行两两分组,比如:A*A*A*A*A*A => (A*A)*(A*A)*(A*A)。这样变的好处是,你只需要计算一次A*A,然后将结果(A*A)连乘自己两次就能得到A^6,即(A*A)^3=A^6。算一下发现这次一共乘了3次,少于原来的5次。但是当n非常大的时候,其实效率也没有比直接乘号多少。
二. 二分思想求矩阵的快速幂:
首先大家要明白任何一个数都可以用二进制数来表示,比如十进制数字7可以表示为111(2),因此假设我们要求a^b,就可以把b分解成多项式,即:
b = P(n)*An+ P(n-1)*An-1+…+ P(i)*Ai+ P(i-1)*Ai-1+…+ P(0)*A0
ab= a P(n)*An + P(n-1)*An-1+…+ P(i)*Ai + P(i-1)*Ai-1 +…+ P(0)*A0= a P(n)*An * a P(n-1)*An-1 * a P(i)*Ai* …* a P(0)*A0
上面的p(i)等于0或者1,所以如果p(i)=0的话,a P(i)*Ai=a0=1. 当p(i)=1时,a P(i)*Ai=a Ai,
所以A^11就等于A^(10112)=(A^8)*(A^2)*(A^1)。这里就体现了快速的效果了:原本要进行10次乘法运算现在最多只要算4次了。(4次对应的是1011总共有4个位)。可以想象一下A的1024次幂,可以由1023次乘法运算降低到11次运算了(1024=100000000002,总共11位)。
三. 算法演示:
为了更清晰的说明快速幂算法,这里以A的11次幂为例子,配了一张图来说明,这样大家都能看得懂了哈~

将11写成1011,然后按位从右到左扫描,设置一个tmp来表示当前扫描位对应的十进制幂的大小,比如第0位对应的十进制指数是1,第3位对应的十进制指数是8,因此我们每向左前进一个扫描位,tmp就double一次,这样tmp就能表示二进制位对应的十进制幂了(tmp初始值为1)。然后我们每遇到二进制位对应数字是1时,就把结果ans和tmp相乘,并且把结果复制到ans中(ans初始值为1)。好了,现在开始运行算法:
刚开始,指针指向第0位,tmp=A,并且该位对应数字是1,所以ans=ans*tmp=A。
指针扫描到第1位,tmp也已经double一次了(tmp=A2)。该位对应数字是1,所以ans=ans*tmp=A3。
指针扫描到第2位,tmp也已经double一次(tmp=A4),该位对应数字是0,所以什么都不做,继续扫描。
指针扫描到第3位,tmp也已经double一次(tmp=A8),该位都应数字是1,所以ans=ans*tmp=A11。此时,算法结束。
四. 完整代码:
#include <iostream>
using namespace std; //计算a^bmodn
int modexp(int a,int b,int n)
{
int ret=;
int tmp=a;
while(b)
{
//基数存在
if(b&0x1) ret=ret*tmp%n;
tmp=tmp*tmp%n;
b>>=;
}
return ret;
} int main()
{
cout<<modexp(,,)<<endl;
return ;
}
algorithm@ Matrix fast power的更多相关文章
- 校赛热身 Problem B. Matrix Fast Power
找循环节,肯定在40项以内,不会证明. #include <iostream> #include <cstring> #include <string> #incl ...
- Lintcode: Fast Power 解题报告
Fast Power 原题链接:http://lintcode.com/en/problem/fast-power/# Calculate the an % b where a, b and n ar ...
- Fast Power
Calculate the a^n % b where a, b and n are all 32bit integers. Example For 2^31 % 3 = 2 For 100^1000 ...
- 论文总结(negFIN: An efficient algorithm for fast mining frequent itemsets)
一.论文整体思路: 作者提出了一种基于前缀树的数据结构,NegNodeset,其实是对之前前缀树的一种改进,主要区别在于采用了位图编码,通过这种数据结构产生的算法称为negFIN. negFIN算法高 ...
- ZJOI2017 Day1
私のZJOI Day1 2017-3-21 07:52:53 有人在暴力膜 苟-- 富贵 无相忘 ZJOI2017交流群 133135071 如果你足够厉害 如果你足够厉害 如果你足够厉害 其实完全可 ...
- POJ 3233 Matrix Power Series(二分等比求和)
Matrix Power Series [题目链接]Matrix Power Series [题目类型]二分等比求和 &题解: 这题我原来用vector写的,总是超时,不知道为什么,之后就改用 ...
- Java Algorithm Problems
Java Algorithm Problems 程序员的一天 从开始这个Github已经有将近两年时间, 很高兴这个repo可以帮到有需要的人. 我一直认为, 知识本身是无价的, 因此每逢闲暇, 我就 ...
- Lintcode: Hash Function && Summary: Modular Multiplication, Addition, Power && Summary: 长整形long
In data structure Hash, hash function is used to convert a string(or any other type) into an integer ...
- Reinforcement Learning for Self Organization and Power Control of Two-Tier Heterogeneous Networks
R. Amiri, M. A. Almasi, J. G. Andrews and H. Mehrpouyan, "Reinforcement Learning for Self Organ ...
随机推荐
- poj 1733 Parity game
Parity game 题意:一个长度为N(N < 1e9)内的01串,之后有K(K <= 5000)组叙述,表示区间[l,r]之间1的个数为odd还是even:问在第一个叙述矛盾前说了几 ...
- 用android-x86模拟器不能运行程序错误Tag:libc的问题
如果用的是x86的android模拟器,运行软件时一闪就关闭logcat中:类似:Fatal signal 11 (SIGSEGV) at 0x00000078 (code=1), thread 16 ...
- VC项目配置基础以及快捷键(收藏)
来自http://blog.csdn.net/phunxm/article/details/5082488 一.IDE基础配置 1.字体 VC6中“Tools→Options→Format→Font” ...
- 【记录】让人淡疼的BUG之参数传送错误
前言 面试的时候往往容易被面试官问到:“说说你遇到过的比较重大或经典的Bug有哪些,能说一说吗?”我被问时脑海的反应是:“尼玛,这个我从来没有刻意记!一时半会咋想得起来,然后还是没想起来或者是随意给了 ...
- hdu 4800 Josephina and RPG
简单dp #include<cstdio> #define maxn 10005 #include<cstring> #include<algorithm> usi ...
- 双缓冲(Double Buffer)原理和使用
转自双缓冲(Double Buffer)原理和使用 一.双缓冲作用 双缓冲甚至是多缓冲,在许多情况下都很有用.一般需要使用双缓冲区的地方都是由于"生产者"和& ...
- POJ 1275 Cashier Employment(差分约束)
http://poj.org/problem?id=1275 题意 : 一家24小时营业的超市,要雇出纳员,需要求出超市每天不同时段需要的出纳员数,午夜只需一小批,下午需要多些,希望雇最少的人,给出每 ...
- 来看看Meteor的功能
看了一上午,感觉这确实比所谓传统的APP开发,有很多不一样的地方. 记录下来: simple-todos.css /* CSS declarations go here */ /* CSS decla ...
- codeforces Mafia
/* * Mafia.cpp * * Created on: 2013-10-12 * Author: wangzhu */ /** * 每个人都想玩若干场,求至少需要玩几场才可以满足大家的需求. * ...
- asp.net 弹出式日历控件 选择日期 Calendar控件
原文地址:asp.net 弹出式日历控件 选择日期 Calendar控件 作者:逸苡 html代码: <%@ Page Language="C#" CodeFile=&quo ...