矩阵快速幂

合集下载

矩阵快速幂欧拉定理

矩阵快速幂欧拉定理

矩阵快速幂欧拉定理
矩阵快速幂欧拉定理是一种高效的算法,通常用于解决大数取模的问题。

其核心思想是将底数进行分解,利用欧拉定理对每个因子进行求幂,再对结果进行合并,最终得到正确的答案。

具体而言,将底数a拆分为若干个质数的积,例如a=p1^k1 *
p2^k2 * ... * pn^kn。

然后对于每个质数pi,使用欧拉定理进行求幂,即:
a^b ≡ (a mod m)^b mod m ≡ ((a mod pi)^b mod pi) * ((a/p1^k1 mod pi)^b mod pi) * ... * ((a/pn^kn mod pi)^b mod pi) (mod pi)
最后将每个pi的结果使用中国剩余定理合并即可得到最终答案。

而矩阵快速幂则是一种优化的算法,它可以利用矩阵乘法的性质,将若干个底数的求幂问题合并为一个矩阵的求幂问题,从而大幅降低时间复杂度。

总之,矩阵快速幂欧拉定理是一种非常强大的算法,可以在处理大数取模问题时发挥重要作用。

学好这个算法,对于提高程序效率和解决复杂问题都有很大帮助。

- 1 -。

矩阵快速幂取模

矩阵快速幂取模

矩阵快速幂取模参考博客1:据说,矩阵快速幂在递推式优化上相当神奇,⽽且效率很⾼。

两矩阵相乘,朴素算法的复杂度是O(N^3)。

如果求⼀次矩阵的M次幂,按朴素的写法就是O(N^3*M)。

既然是求幂,不免想到快速幂取模的算法,有快速幂取模的介绍,a^b %m 的复杂度可以降到O(logb)。

如果矩阵相乘是不是也可以实现O(N^3 * logM)的时间复杂度呢?答案是肯定的。

先定义矩阵数据结构: struct Mat {double mat[N][N];}; O(N^3)实现⼀次矩阵乘法Mat operator * (Mat a, Mat b) {Mat c;memset(c.mat, 0, sizeof(c.mat));int i, j, k;for(k = 0; k < n; ++k) {for(i = 0; i < n; ++i) {if(a.mat[i][k] <= 0) continue; //(针对ZOJ2853)剪枝,cpu运算乘法的效率并不是想像的那么理想(加法的运算效率⾼于乘法,⽐如Strassen矩阵乘法)for(j = 0; j < n; ++j) {if(b.mat[k][j] <= 0) continue; //剪枝c.mat[i][j] += a.mat[i][k] * b.mat[k][j];}}}return c;} 下⾯介绍⼀种特殊的矩阵:单位矩阵很明显的可以推知,任何矩阵乘以单位矩阵,其值不改变。

有了前边的介绍,就可以实现矩阵的快速连乘了。

Mat operator ^ (Mat a, int k) {Mat c;int i, j;for(i = 0; i < n; ++i)for(j = 0; j < n; ++j)c.mat[i][j] = (i == j); //初始化为单位矩阵for(; k; k >>= 1) {if(k&1) c = c*a;a = a*a;}return c;} 举个例⼦: 求第n个Fibonacci数模M的值。

矩阵幂和矩阵指数函数的计算方法

矩阵幂和矩阵指数函数的计算方法

矩阵幂和矩阵指数函数的计算方法矩阵幂和矩阵指数函数是矩阵运算中比较重要的两个概念。

在矩阵幂和矩阵指数函数的计算过程中,我们需要用到一些特殊的算法和方法。

本文将介绍矩阵幂和矩阵指数函数的概念、计算方法和应用等方面的内容,帮助读者更好地了解和掌握这两个概念。

一、矩阵幂的概念对于一个$n$阶矩阵$A$,设$k$为一个自然数,则$A^k$表示$k$次幂。

即:$A^k=\underbrace{A \times A \times \cdots \times A}_{k\text{个} A}$其中,当$k=0$时,$A^k$等于$n$阶单位矩阵$I_n$。

矩阵幂的计算过程中,我们需要用到矩阵乘法的定义。

对于两个$n$阶矩阵$A$和$B$,它们的乘积$AB$定义为:$AB=[c_{ij}]=\sum_{k=1}^na_{ik}b_{kj}$其中,$c_{ij}$表示矩阵的第$i$行第$j$列的元素,$a_{ik}$和$b_{kj}$分别表示第$i$行第$k$列的元素和第$k$行第$j$列的元素。

二、矩阵幂的计算方法矩阵幂的计算方法有两种:直接幂法和快速幂法。

1. 直接幂法直接幂法是一种比较简单的计算矩阵幂的方法。

对于一个$n$阶矩阵$A$和一个自然数$k$,我们可以通过$k-1$次连乘的方式计算出$A^k$的值。

即:$A^k=\underbrace{A \times A \times \cdots \times A}_{k-1\text{个} A} \times A$由此可见,计算矩阵幂的直接幂法需要进行$k-1$次矩阵乘法运算,时间复杂度为$O(kn^3)$。

2. 快速幂法快速幂法是计算矩阵幂的高效方法,它能够有效地减少运算次数,提高计算效率。

该方法基于指数的二进制表示,通过不断地平方和乘以相应的权值,最终计算出矩阵幂的值。

具体步骤如下:(1)将指数$k$转换成二进制数,例如,$k=13$转换成二进制数为$1101$。

矩阵乘法快速幂

矩阵乘法快速幂

矩阵乘法快速幂矩阵快速幂算法可以用于计算矩阵的幂。

假设有一个 n * n 的矩阵 A,需要计算 A 的 m 次幂,其中 m 是非负整数。

矩阵快速幂算法的基本思想是通过分治法将矩阵的幂运算化简为多个矩阵的乘法运算。

具体步骤如下:1. 初始化一个单位矩阵 I,它的每个元素 A[i][j] = 1 当且仅当 i = j,其余元素都为 0。

2. 将矩阵 A 和单位矩阵 I 分别初始化为两个 n * n 的矩阵。

3. 将矩阵 A 逐步平方,即计算 A^2, A^4, A^8, ..., A^m,直到指数大于等于 m。

4. 对于每个指数 k,将 I 与 A^(2^k) 相乘,即计算 I * A^(2^k)。

5. 最后得到的矩阵 I 就是 A 的 m 次幂。

矩阵的乘法可以利用分块矩阵的性质进行加速。

假设 A 和 B是两个 n * n 的矩阵,其中 n = 2^k,可以将 A 和 B 分成大小为 n/2 * n/2 的四个子矩阵,并依次计算它们的乘积。

这样可以将原来的矩阵乘法的时间复杂度从 O(n^3) 降低为 O(n^2)。

总结起来,矩阵快速幂算法的时间复杂度为 O(n^3 * log m),其中 n 是矩阵的大小,m 是指数。

下面是一个示例代码,用于计算矩阵的快速幂:```pythonimport numpy as npdef matrix_power(matrix, power):result = np.eye(matrix.shape[0], dtype=int)while power > 0:if power % 2 == 1:result = np.dot(result, matrix)matrix = np.dot(matrix, matrix)power //= 2return result```这个代码使用了 NumPy 库来表示和操作矩阵。

函数`matrix_power` 接受一个矩阵和一个非负整数作为参数,返回计算结果。

基础算法—快速幂详解

基础算法—快速幂详解

基础算法—快速幂详解幂运算是⾮常常见的⼀种运算,求取,最容易想到的⽅法便是通过循环逐个累乘,其复杂度为,这在很多时候是不够快的,所以我们需要⼀种算法来优化幂运算的过程。

⼀、快速幂——反复平⽅法该怎样去加速幂运算的过程呢?既然我们觉得将幂运算分为n 步进⾏太慢,那我们就要想办法减少步骤,把其中的某⼀部分合成⼀步来进⾏。

⽐如,如果能被2整除,那我们可以先计算⼀半,得到的值,再把这个值平⽅得出结果。

这样做虽然有优化,但优化的程度很⼩,仍是线性的复杂度。

再⽐如,如果我们能找到,那我们就能把原来的运算优化成,只需要次运算就可以完成,效率⼤⼤提升。

可惜的是,这种条件显然太苛刻了,适⽤范围很⼩。

不过这给了我们⼀种思路,虽然我们很难找到,但我们能够找到。

这样,我们可以通过递推,在很短的时间内求出各个项的值。

我们都学习过进制与进制的转换,知道⼀个进制数的值可以表⽰为各个数位的值与权值之积的总和。

⽐如,2进制数,它的值可以表⽰为10进制的,即。

这完美地符合了上⾯的要求。

可以通过2进制来把转化成的序列之和,⽽2进制中第位(从右边开始计数,值为或是)则标记了对应的是否存在于序列之中。

譬如,为⼆进制的,他可以表⽰为,其中由于第⼆位为,项被舍去。

如此⼀来,我们只需要计算的值(这个序列中的项不⼀定都存在,由的⼆进制决定)并把它们乘起来即可完成整个幂运算。

借助位运算的操作,可以很⽅便地实现这⼀算法,其复杂度为。

typedef long long ll;ll mod;ll qpow(ll a, ll n)//计算a^n % mod{ll re = 1;while (n){if (n & 1)//判断n 的最后⼀位是否为1re = (re * a) % mod;n >>= 1;//舍去n 的最后⼀位a = (a * a) % mod;//将a 平⽅}return re % mod;}取模运算⼀般情况下是需要的,当然也可以省去。

矩阵快速幂与同余定理

矩阵快速幂与同余定理

矩阵快速幂与同余定理矩阵快速幂和同余定理是计算机科学和数学领域的重要概念,在算法设计和数论问题中有广泛的应用。

本文将分别介绍矩阵快速幂和同余定理,并说明它们的相关性。

一、矩阵快速幂矩阵快速幂是一种高效计算矩阵乘法的方法,它通过将指数转化为二进制形式,从而降低了计算复杂性。

具体来说,对于一个矩阵A和非负整数n,矩阵快速幂算法能够在O(log(n))的时间内计算出A的n次幂,而传统的幂运算需要O(n)的时间。

矩阵快速幂的基本思想是通过不断地平方和相乘来快速计算幂次。

首先将指数n用二进制表示,然后按照二进制形式的每一位进行计算。

具体步骤如下:1. 初始化结果矩阵res为单位矩阵,即矩阵对角线上的元素全为1,其余元素全为0;2. 将矩阵A赋值给临时矩阵tmp;3. 从二进制的最低位开始,如果该位为1,则将res与tmp相乘并将结果赋值给res;4. 不断地将tmp自乘,即将tmp与自身相乘,并将结果赋值给tmp;5. 将指数n右移一位,即将二进制表示的n向右移动一位;6. 重复步骤3-5,直到n变为0。

矩阵快速幂的时间复杂度为O(log(n)),其中n为指数的位数。

这种算法在求解庞大的矩阵乘法和幂运算问题时非常高效。

二、同余定理同余定理是数论中的重要定理,它描述了两个整数在除以一个正整数的情况下的余数之间的关系。

具体来说,对于给定的整数a、b和正整数m,如果a与b对m取余得到的余数相等,即a ≡ b (mod m),则称a和b同余于模m。

同余关系具有如下性质:1. 若a ≡ b (mod m),则对于任意的整数k,有a+km ≡ b (mod m),即同余关系在加法运算下封闭;2. 若a ≡ b (mod m),则对于任意的正整数n,有a^n ≡ b^n (mod m),即同余关系在乘法运算下封闭。

同余定理在数论中有广泛的应用,如计算组合数、求解线性同余方程、判定素数等。

通过同余定理,我们可以将原问题转化为与余数相关的问题,从而简化计算过程。

矩阵乘法的快速幂

矩阵乘法的快速幂

矩阵乘法的快速幂快速幂是一种优化算法,用于求取幂运算的结果。

在数学中,我们知道,一个数的幂可以通过连续的乘法运算得到,但是当指数较大时,这种计算方式会变得十分耗时。

而快速幂算法则通过利用幂运算的一些特性,将指数的计算过程进行了优化,从而大大提高了计算效率。

在矩阵运算中,同样可以应用快速幂算法来进行优化。

矩阵乘法是一种常见的运算,它的计算复杂度为O(n^3),即矩阵乘法的计算时间与矩阵维度的立方成正比。

在实际应用中,矩阵维度往往很大,因此矩阵乘法的运算量也会相应增大。

为了提高矩阵乘法的计算效率,可以利用快速幂算法进行优化。

快速幂算法的核心思想是将指数进行二进制拆分,并利用幂运算的特性进行迭代计算。

对于矩阵乘法,我们可以将指数表示为一个二进制数,然后通过对矩阵的连续平方运算,来得到最终结果。

举例来说,假设我们有一个矩阵A,我们需要计算A的n次方。

传统的方法是通过连续的乘法运算来实现,即 A * A * A * ... * A。

而利用快速幂算法,我们可以将指数n进行二进制拆分,比如n=13可以表示为二进制数1101。

然后,我们根据二进制数的每一位进行迭代计算,每次将矩阵进行平方运算,然后根据二进制位的值来决定是否要乘上当前的矩阵。

具体的计算过程如下:1. 初始化结果矩阵为单位矩阵I,即I = [[1, 0], [0, 1]];2. 将指数n转换为二进制数,比如n=13,则二进制数为1101;3. 从二进制数的最低位开始,依次遍历每一位;4. 若当前位为1,则将结果矩阵乘以当前的矩阵A;5. 将当前的矩阵A进行平方运算,即A = A * A;6. 继续遍历下一位,直到遍历完所有位数。

通过上述步骤,我们可以得到矩阵A的n次方。

由于每次迭代只需要进行平方运算和乘法运算,因此快速幂算法的时间复杂度为O(logn),大大优化了矩阵乘法的计算效率。

需要注意的是,在实际应用中,矩阵的乘法运算可能涉及到更复杂的计算,比如矩阵的加法、减法等。

斐波那契数列矩阵快速幂

斐波那契数列矩阵快速幂

斐波那契数列矩阵快速幂斐波那契数列是指这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列可以定义如下:F(0) = 0F(1) = 1F(n) = F(n-1) + F(n-2) (n≥2,n∈N*)现在我们来考虑如何使用矩阵快速幂来计算斐波那契数列。

对于斐波那契数列,我们可以使用如下的矩阵表示:| F(n) || 11 || F(n-1) ||| = || * |||F(n-1)|| 10 || F(n-2) |根据矩阵的乘法法则,两个矩阵可以相乘,当且仅当第一个矩阵的列数等于第二个矩阵的行数。

因此,我们可以将上面的矩阵表示转化为如下的形式:Fn-1, Fn-2 = Fn-2, Fn-3 * (1 1, 1 0)接下来,我们可以使用矩阵快速幂来加速计算斐波那契数列。

矩阵快速幂的步骤如下:1. 将要求的幂次写成二进制的形式。

2. 将矩阵不断地进行平方运算,直到幂次的某一位为1。

3. 将平方的结果乘到答案里。

例如,如果要求2^10,我们可以将10表示成二进制的形式,即1010,在平方运算的过程中,每次将矩阵平方并存储下来,如果当前位的值为1,则将存储下来的结果乘到最终答案中。

使用矩阵快速幂来计算斐波那契数列的代码如下:int fib(int n) {if (n <= 1) {return n;}int res[2][2] = {{1, 1}, {1, 0}};pow(res, n - 1);return res[0][0];}void pow(int res[2][2], int n) { int tmp[2][2] = {{1, 1}, {1, 0}};while (n) {if (n & 1) { multiply(res, tmp);}multiply(tmp, tmp);n >>= 1;}}void multiply(int res[2][2], int tmp[2][2]) {int a = res[0][0] * tmp[0][0] + res[0][1] * tmp[1][0];int b = res[0][0] * tmp[0][1] + res[0][1] * tmp[1][1];int c = res[1][0] * tmp[0][0] + res[1][1] * tmp[1][0];int d = res[1][0] * tmp[0][1] + res[1][1] * tmp[1][1];res[0][0] = a;res[0][1] = b;res[1][0] = c;res[1][1] = d;}在这段代码中,我们定义了三个函数:pow、multiply和fib。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

A=[ B=[
f[0] f[1] f[1] f[2]
]
01 11
]
即求出A· B^n即可
矩阵快速幂
由于矩阵乘法没有交换律,只有结合律 所以先求出B^n,命C=B^n 再求出A· C,即是最后你想要的矩阵
一个公式只对应一个矩阵么?
矩阵是唯一的么? 公式怎样推出矩阵呢?
矩阵快速幂
f[0]=0; f[1]=1; …… f[n]=f[n-1]+f[n-2]
矩阵快速幂
练习: f(n)= a*f(n-1)+b*f(n-2)+c*f(n-3)
[f(n-1),f(n-2),f(n-3)]*[ [f(n) ,f(n-1),f(n-2)]
]=
a10 b01 c00
Thank you~
矩阵乘法
hrbust1143.cpp
快速幂
hrbust1140 数字和问题 Description 定义一种操作为:已知一个数字,对其各位数字 反复求和,直到剩下的数是一位数不能求和为止。 例如:数字2345,第一次求和得到2 + 3 + 4 + 5 = 14 ,再对14的各位数字求和得到1 + 4 = 5,得到5将不再 求和。 现在请你求出对a^b进行该操作后,求最终得到的数字. Input 第一行,包含两个数字a(0 <= a <= 2000000000)和b (1 <= b <= 2000000000) Output 输出对a^b进行操作后得到的数字是什么
ACM矩 • 矩阵快速幂
矩阵乘法
矩阵乘法
矩阵乘法: 只有当矩阵A的列数与矩阵B的行数相等时 A×B才有意义。一个m×n的矩阵a (m,n)左乘一个n×p的矩阵b(n,p),会 得到一个m×p的矩阵c(m,p),满足 矩阵乘法满足结合律,但不满足交换律 同大家线性代数中所学的矩阵乘法
快速幂
a(0 <= a <= 2000000000) b(1 <= b <= 2000000000)
首先求a^b
but~
a、b的范围太大?不能暴力循环!
怎么办?
快速幂
快速幂 只需计算log(b)次 还不超过40次!!!!即可解出 but问题又出现了! 不超时了,但是超范围了!! 2000000000^2000000000 用int、long long 、unsigned long long是装不下的!
[ f[n] [ f[n] [
f[n-1] f[n]
]* [ ]= f[n-1]+f[n] ]= f[n+1] ]
01 11
矩阵快速幂
例如: f(n)= a*f(n-1)+b*f(n-2) f(n)= a*f(n-1)+b*f(n-2)+c*f(n-3)
[f(n-1),f(n-2)]*[ [f(n) ,f(n-1)]
取模+超时---->快速幂 but 公式怎么快速幂呢?
矩阵快速幂
f[0]=0; f[1]=1; …… f[n]=f[n-1]+f[n-2]
]* [ ]= [ f[n] f[n-1]+f[n] ] [ f[n+1] f[n]+f[n+1]
f[n-1] f[n] f[n] f[n+1] 01 11
矩阵快速幂
矩阵乘法
在计算机中,一个矩阵实际上就是一个 二维数组。一个n行m列的矩阵与一个 m行p列的矩阵可以相乘,得到的结果 是一个n行p列的矩阵,其中的第i行第 j列位置上的数为第一个矩阵第i行上 的m个数与第二个矩阵第j列上的m个 数对应相乘后所得的m个乘积之和。
矩阵乘法
hrbust1143 Input 输入数据第一行三个整数m,n,p,分别代表有两个矩阵 A[M][N] B[N][P],接下来是A,B两个矩阵,M、N、P 均小于100,矩阵中所有数据范围为[0, 1000],且均为 整数。 Output 将矩阵输出,每两个数字之间只有一个空格。 Sample Input Sample Output 2 2 3 12 9 6 1 2 30 23 16 3 4 6 5 4 3 2 1
快速幂
大数? NO! 数字和的公式(x+8)%9+1 即(a^b+8)%%mod + b%mod )%mod (a*b)%mod=( (a%mod) * (b%mod) )%mod 同样a+b+c+…与a*b*c*…一样满足
快速幂
快速幂
hrbust1140_递归快速幂.cpp hrbust1140_循环快速幂.cpp
矩阵快速幂
矩阵快速幂
计算前1000 000 000项斐波那契数,结果MOD 10007 f[0]=0; f[1]=1; …… f[n]=f[n-1]+f[n-2]
如果循环1000 000 000次一定会超时!
]=
a1 b0
矩阵快速幂
[f(n-1),f(n-2)]*[ [f(n) ,f(n-1)] ]=
a1 b0
将[f(n-1),f(n-2)]看做为A,则A‘为 [f(n) ,f(n-1)],即将所有下标+1即可 现在求我们所需要的B矩阵,有A和A’求B就简单 了 f[n]与f[n-1]、f[n-2]有什么关系, 第一列就写什么。 f[n-1]与f[n-1]、f[n-2]有什么关系, 第二列就写什么
矩阵乘法
矩阵乘法
矩阵运算律 : 结合律:(AB)C=A(BC) 分配律:(A+B)C=AC+BC
C(A+B)=CA+CB
若A为m×s矩阵,B为s×n矩阵,则AB为 m×n矩阵 而BA无法进行矩阵乘法运算;即便是方阵( n×n)交换后乘得的结果也不一定相同,除 了相当特殊的,例如每个元素都是1的方阵
即(a^b+8)%9+1 边计算边取模,整个过程只有乘法操作,不影响最终结果 int pow(int a,int k) //计算a^k,并最终结果对9取摸 { if(k==0) return 1; if(k==1) return a%9; if(k%2==0) return (g((a%9)*(a%9),k/2)%9); if(k%2==1) return (a%9)*(g((a%9),k-1)%9); }
相关文档
最新文档