关于快速幂、快速乘、矩阵快速幂

一、快速幂

快速幂是用于解决类似$a^b$ $mod$ $p$值类型的问题的。使用普通的方法是从$1$循环至$b$,再逐次累乘,逐次取模。但这种方法对于$b$很大的时候却可能会超时。那么,这时候我们就需要使用快速幂了。

快速幂是基于以下式子:

若$b$ $mod$ $2=1$,则$a^b=a^\frac{b}{2}\times a^\frac{b}{2}\times a$

若$b$ $mod$ $2=0$,则$a^b=a^\frac{b}{2}\times a^\frac{b}{2}$

这样,我们便通过分治将一个大问题变为两个小问题,再逐项计算,并取模。

另外,再加上两个边界条件:

$a^0=1$,$a^1=a$

例如下面的例子:

$3^7=3^3\times3^3\times3=(3^1\times3^1\times3)\times(3^1\times3^1\times3)\times 3$

其中,所有的式子都可以直接进行计算了,其时间复杂度为$\Theta(log_2b)$。

其程序如下:

int _pow(int a,int b){
    if(b==0)return 1;
    if(b==1)return a;
    int res=_pow(a,b/2);
    if(b%2)return res*res*a;
    return res*res;
}

二、快速乘

快速乘常与快速幂结合在一起。当模数$p$过大时,乘起来可能会超过$long$ $long$的范围。所以,我们也可以借助快速幂的思想在中间优化一下乘法。

注意到乘法$a\times b$可以转化为$\underbrace{a+a+...+a}_{b}$,所以我们也能够通过分治方法将其转化。

例如下面的例子:

$3\times7=3\times3+3\times3+3=(3\times1+3\times1+3)+(3\times1+3\times1+3)+3$

其中,所有的式子也可以进行计算,复杂度依然为$\Theta(log_2b)$。

快速乘的程序与快速幂极为类似,只不过将乘换为加而已。

三、矩阵快速幂

矩阵快速幂可以用于求一个某一个函数值是需要从前若干项函数值线性递推过来的函数(也称一次多阶递推式)某一项值。

即求函数$f(n)=a_1f(n-1)+a_2f(n-2)+...+a_mf(n-m)$的$f(n)$的值。普通方法其时间复杂度为$\Theta(n\times m)$。在$n$比较大时会出现超时情况。所以,我们应找一个新的实现方法。

这个实现方法即为矩阵。

那么首先,我们需要了解一些关于矩阵的知识。

矩阵是有定义乘法的。但是,不是所有的两个矩阵都能相乘。

两个矩阵$A$和$B$能够相乘,当且仅当$A$的列数等于$B$的行数。

但是,两个矩阵相乘法则,不是这里所讨论的。我们只需要知道如何能够使用矩阵推出$f(n)$。

举个例子,简单的$Fibonacci$数列,我们可以得到:

$\begin{bmatrix} f(n) \\\ f(n-1) \end{bmatrix}=\begin{bmatrix} 1&1 \\\ 1&0 \end{bmatrix}\cdot\begin{bmatrix} f(n-1) \\\ f(n-2) \end{bmatrix}$

一直递推下去,就能得到一个矩阵公式:

$\begin{bmatrix} f(n+1) \\\ f(n) \end{bmatrix}=\begin{bmatrix} 1&1 \\\ 1&0 \end{bmatrix}^n\cdot\begin{bmatrix} f(2) \\\ f(1) \end{bmatrix}$

再回到一般情况,我们要从

$\begin{bmatrix}f(n)\\f(n-1)\\\ \vdots\\f(n-m)\end{bmatrix}$推出$\begin{bmatrix}f(n+1)\\f(n)\\\ \vdots\\f(n-m+1)\end{bmatrix}$

其中,$f(n)$,$f(n-1)...f(n-m+1)$在原矩阵中均有出现,所以,通过构造$0$和$1$我们就可以推出。我们现在只需要算出$f(n)=a_1f(n-1)+a_2f(n-2)+...+a_mf(n-m)$。即构造矩阵的第一行为$\begin{bmatrix}a_1&a_2&...&a_m\end{bmatrix}$。以下所有行分别只含$0$和$1$,即第$i+1$行在第$i$列的值为$1$,其他所有值全为$0$.

其中,矩阵可以进行快速幂,这样就可以通过快速幂独有的$\Theta(log_2n)$时间复杂度解决一次多阶递推式。

原文地址:https://www.cnblogs.com/ice-wing/p/9420193.html

时间: 2024-08-19 06:20:35

关于快速幂、快速乘、矩阵快速幂的相关文章

求幂大法,矩阵快速幂,快速幂模板题--hdu4549

hdu-4549 求幂大法.矩阵快速幂.快速幂 题目 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 6217 Accepted Submission(s): 1902 Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] *

快速幂算法(矩阵快速幂还不是很会。。日后会更新)

PS:转载,自己写的不如人家,怕误导.转载地址:http://www.cnblogs.com/CXCXCXC/p/4641812.html 首先,快速幂的目的就是做到快速求幂,假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多.它的原理如下: 假设我们要求a^b,那么其实b是可以拆成二进制的,该二进制数第i位的权为2^(i-1),例如当b==11时   a^11=a^(2^0+2^1+2^3) 11的二进制是

Luogu 3758 [TJOI2017]可乐(有向图邻接矩阵幂的意义 矩阵快速幂)

题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆.它每一秒都会随机触发一种行为.现 在给加里敦星球城市图,在第0秒时可乐机器人在1号城市,问经过了t秒,可乐机器人的行为方案数是多少? 输入输出格式 输入格式: 第一行输入两个正整数况N,M,N表示城市个数,M表示道路个数.(1 <= N <=30,0 < M < 100) 接下来M行输入u,v,表示u

codeforces 678D Iterated Linear Function 矩阵快速幂

矩阵快速幂的题要多做 由题可得 g[n]=A*g[n-1]+B 所以构造矩阵  { g[n] }    =  {A   B}  * { g[n-1]} {   1   }         {0   1}     {    1    } 然后矩阵快速幂就好 矩阵快速幂的题要多做,多构造矩阵 注:其实这个题可以直接等比数列求求和,单数矩阵快速幂对于这类题更具有普遍性 #include <cstdio> #include <iostream> #include <ctime>

#斐波那契数列用矩阵快速幂求解f(n)#

通常情况下,斐波那契数列第n项可以通过递归求解或者直接求解但当n非常大的时候,求解f(n)将显得非常困难下面利用矩阵以及快速幂的方法在logn复杂度内求解 则可以运用快速幂来求解矩阵高次幂,复杂度降为logn 来自为知笔记(Wiz)

矩阵乘法 洛谷 P3390【模板】矩阵快速幂

P3390 [模板]矩阵快速幂 题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k 共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7 输入输出样例 输入样例#1: 2 1 1 1 1 1 输出样例#1: 1 1 1 1 说明 n<=100, k<=10^12, |矩阵元素|<=1000 算法:矩阵快速幂

HDU 1005矩阵快速幂解法 循环节解法

循环节解法: 对于公式 f[n] = A * f[n-1] + B * f[n-2]; 后者只有7 * 7 = 49 种可能,为什么这么说,因为对于f[n-1] 或者 f[n-2] 的取值只有 0,1,2,3,4,5,6 这7个数,A,B又是固定的,所以就只有49种可能值了.由该关系式得知每一项只与前两项发生关系,所以当连续的两项在前面出现过,由于公式不变,那么后面得到的一定是跟前面相重复的.所以这个时候循环节就出现了,注意循环节并不一定会是开始的 1,1:但1,1一定可以作为一个循环节,只不过

HDOJ How many ways?? 2157【矩阵快速幂】

How many ways?? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2046    Accepted Submission(s): 758 Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这

poj 3735 稀疏矩阵矩阵快速幂

设人数为 $n$,构造 $(n + 1) \times (n + 1)$ 的矩阵 得花生:将改行的最后一列元素 $+ 1$ \begin{gather}\begin{bmatrix}1 & 0 & 0 & 1 \\0 & 1 & 0 & 0 \\0 & 0 & 1 & 0 \\0 & 0 & 0 & 1\end{bmatrix}\times\begin{bmatrix}x \\y \\z \\1 \\\end{

HDU 1575 Tr A 【矩阵经典2 矩阵快速幂入门】

任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1575 Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7572    Accepted Submission(s): 5539 Problem Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要