首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

快速幂和矩阵快速幂

前言 新年第一篇技术类的文章,应该算是算法方面的文章的。看标题:快速幂和矩阵快速幂,好像挺高大上。其实并不是很难,快速幂就是快速求一个数的幂(一个数的 n 次方)。...理解了上面的几点,相信快速幂就难不到你了。下面来看看矩阵快速幂: 矩阵快速幂 其实矩阵快速幂的思想是和快速幂一样的,矩阵快速幂是用于快速求出一个矩阵的 n 次方的方法。...矩阵相乘结果也是一个矩阵,具体的规则为:如果矩阵 A 的列数等于矩阵 B 的行数,假设矩阵 C = A*B, 那么矩阵 C 的行数和矩阵 A 的行数相等,矩阵 C 的列数和矩阵 B 相等。...看代码不难理解利用矩阵快速幂求方阵的幂的时间复杂度为O(m^3*logn),m为方阵的行数和列数(方阵相乘的复杂度为 O(m^3),快速幂的复杂度为 O(logn) )。...这两种方法都可以求解,但是可以有更高效的方法,就是利用矩阵快速幂。 不过咋一看这怎么和矩阵快速幂联系到一起呢?

2.5K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    疯子的算法总结(五) 矩阵乘法 (矩阵快速幂)

    学过线性代数的都知道矩阵的乘法,矩阵乘法条件第为一个矩阵的行数等与第二个矩阵的列数,乘法为第一个矩阵的第一行乘以第二个矩阵的第一列的对应元素的和作为结果矩阵的第一行第一列的元素。...我们参考快速幂,将数字的乘法换成矩阵的乘法,可以得出矩阵快速幂的代码; #include using namespace std; const int MOD=1e8+5;...{ if(k &1) ans =muti(ans,a,mod); a = muti(a,a,mod); k >>=1; } return ans; } 应用:矩阵快速幂求斐波那契数列...我们定义一个矩阵A |0 1| |1 1| 定义F(0)=0,F(1)=1。 构成矩阵F矩阵|0 1| A矩阵的N次幂,乘以F矩阵的第一项就是第N个斐波那契数列。...证明: F矩阵乘以A矩阵代表将右侧元素给左侧,右侧元素等于右侧加左侧。矩阵的乘法满足结合律,所以FXX*……N……X = F (XXX……*X) 所以定义不同的F矩阵可以得到不同的斐波那契数列。

    69240

    客户端基本不用的算法系列:矩阵快速幂

    回顾 在上一篇文章中,我们对快速幂算法进行了如下的分析: int qpow(int x, int n, int m) { int res = 1; while (n) {...cout << qpow(10, 3, 997) << endl; // 3 cout << qpow(10, 2, 997) << endl; // 100 return 0; } 我们的快速幂算法其实并没有真正的优化乘法效率...我们换一个角度来想,如果有这么一种东西,它也支持乘法和幂运算,同样也拥有像数的乘法一样的规律,是不是也可以进行快速幂的优化? 斐波那契,万物之源 看到这个小标题是不是一脸蒙圈?...既然我们已经对矩阵的 matrix 的结构体做了乘法符号重载,那么我们的快速幂算法实现直接对类型做修改即可: matrix qpow(matrix x, int n) { matrix res...在对左边的零一矩阵做 n - 1 的幂运算,乘以 base 矩阵,返回结果矩阵的 res[0][0] 就是我们要求的 Fib[n]。

    93610

    挑战程序竞赛系列(30):3.4矩阵的幂

    https://blog.csdn.net/u014688145/article/details/76310181 挑战程序竞赛系列(30):3.4矩阵的幂 详细代码可以fork下Github...练习题如下: POJ 3734: Blocks POJ 3420: Quad Tiling POJ 3735: Training Little cats POJ 3734: Blocks 矩阵的幂入门题...状态转移方程: a = 2a + b; b = 2a + 2b + 2c; c = 2c + b; 矩阵幂技术在于把上述转移状态写成矩阵的形式,因为每个状态只和前几个状态相关而不是所有状态,这点很关键,...pmatrix}^i \begin{pmatrix} a_0 \\ b_0 \\ c_0 \\ \end{pmatrix} 当然可以思考下为什么矩阵的幂的时间复杂度为...0 1 0 1 0 b = 1 0 0 0 * 0 c 0 0 0 0 0 1 0 0 0 1 1 得 c = 0 每个操作可以单独和初始向量相乘,保证矩阵相乘的正确性,最后构造的最先乘

    41340

    算法系列-----矩阵(二)-------------单位矩阵的加法和减法

    矩阵的加法和减法很简单,唯一的要求就是:行列相等 首先我们看一维的相加(其实就是数组的相加): /** * 两个一维数组相加 * * @param args *...(矩阵a与b的和) */ public static double[][] plus(double[][] a, double[][] b) { int hang = a.length;...-3.0 -1.0 最基本的操作:加和减 还是要说的。...很简单 只是想说明一点:我看过很多网上的代码,有的人在加法和减法中把结果直接存在 第一个参数中返回,这让我很是犹豫,我常常会想到交换函数时并没有改变他们的值 或者是当同一个参数同时调用两个矩阵方法时...,发现了a和b都变了,让我很是气恼 故而我觉得还是在代码中再定义一个局部变量比较好,尽管这样的代码不够优化,但是我看的很清楚。

    69020

    算法系列-----矩阵(三)-------------矩阵的子矩阵

    矩阵的子矩阵 注意矩阵的下标是从 0开始的到n-1和m-1 获取某一列的子矩阵: /** * 矩阵的子矩阵函数 * * @param args *...参数a是个浮点型(double)的二维数组,n是去掉的列号 * @return 返回值是一个浮点型二维数组(矩阵去掉第n列后的矩阵) */ public static double[][] zjz...获取去掉某一行和某一行的子矩阵: /** * 矩阵的子矩阵函数 * * @param args *...参数a是个浮点型(double)的二维数组,m是要去掉的行号,n是去掉的列号 * @return 返回值是一个浮点型二维数组(矩阵去掉第m行和n列后的矩阵) */ public static...----- 3.0 2.0 4.0 矩阵的子矩阵 -------------------------------- 1.0 3.0 矩阵的子矩阵 -------------------------

    1.1K50

    矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)

    矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率。...先分析一下下边的 将一个矩阵分成四块 如上图,A和B矩阵都被分成了四块,该算法复杂度依然是n3,于是上边那位老哥不服,他觉得这不是最优的解,还有更优的,于是他分析了上边是四个等式,四个等式中有八个乘法...ABCDEFGH原来两个相乘矩阵里边划分好的八个小矩阵 图三 或者看这个图,总之七个矩阵变量是要求的(PPT上和这差不多,只是变量顺序换了) 图四 求出则七个矩阵,就能求出A*B的值 这个图就是...如对于上边图六那个公式,a=7,k=2,b=2  显然7>2^2,所以套第三个T(n) 动态规划算法 动态规划和分治法相似,都是通过组合字问题来求解原问题,不同之处在于分治法的子问题互不干涉、互不交叉...,也就是其标量乘法次数之和最少(这块最好参照一下算法导论211页很详细),说白了,就是在乘法式子中如何打括号 官方的话就不说了,直接上一串矩阵,你应该干什么和怎么干,哈哈,怎么干 图中给出了6个矩阵相乘

    4K60

    算法训练 2的次幂表示

    问题描述   任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。   ...将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0   现在约定幂次用括号来表示,即a^b表示为a(b)   此时,137可表示为:2(...最后可表示为:   2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) 输入格式   正整数(1<=n<=20000) 输出格式   符合约定的n...的0,2表示(在表示中不能有空格) 样例输入 137 样例输出 2(2(2)+2+2(0))+2(2+2(0))+2(0) 样例输入 1315 样例输出 2(2(2+2(...0)))+2(2(2)+2(0))+2+2(0) 提示   用递归实现会比较简单,可以一边递归一边输出 import java.util.Scanner; /* * 用数组保存二进制数中1的位置

    48420

    算法系列-----矩阵(七)-------------矩阵的除法

    计算矩阵的除法,其实就是将被除的矩阵先转化为它的逆矩阵,它的逆矩阵相当于被除的矩阵分之一, 那么矩阵的除法就相当于前面的矩阵和后面的矩阵的逆矩阵相乘的乘积。...百度经验:http://jingyan.baidu.com/article/d45ad14897fece69542b8077.html 接下来就是代码的实现过程: /** * 矩阵除法的函数...* * @param args * 参数a,b是两个浮点型(double)的二维数组, * @return 返回值是一个浮点型二维数组(矩阵a除以b的结果) */...multi(double[][],double[][])和矩阵的求逆inv(double[][])请参考前面的代码 测试矩阵: a------------------------------- 1.0...: /** * 矩阵除数的函数 * * @param args * 参数a,是个浮点型(double)的二维数组,b是浮点数 * @return 返回值是一个浮点型二维数组

    1.2K20

    幂迭代法求矩阵特征值的Fortran程序

    昨天所发布的迭代法称为正迭代法,用于求矩阵的主特征值,也就是指矩阵的所有特征值中最大的一个。其算法如下: 满足精度要求后停止迭代,xj是特征向量,λj是特征值。...后记 正迭代法,用于求矩阵的主特征值,也就是指矩阵的所有特征值中最大的一个。有正迭代法就有逆迭代法,逆迭代法可以求矩阵的最小特征值以及对应的特征向量。...幂迭代法是子空间迭代,Lancos迭代等方法求结构自振频率的基础。 稍后会推出逆迭代法,敬请关注。 对于计算特征值,没有直接的方法。2阶或3阶矩阵可以采用特征多项式来求。...当这些步骤提供了求特征向量的方法后,如何求近似特征值?换句话说,假设矩阵A和近似特征向量已经知道,如何求相应近似特征值?考虑特征方程 xξ = Ax 这里x是近似特征向量,ξ是特征值,且ξ未知。...借助于最小二乘,得到: 以上求特征值的方法叫幂迭代法。

    4K51

    算法系列-----矩阵(五)-------------矩阵的求逆

    首先要明确一点:非方阵不能求逆 也就是 n == m需要去判断的,a.length == a[0].length 为了更好的看清代码,我们先看下数学过程: /** * 矩阵求逆 *...* @param args * 参数a是个浮点型(double)的二维数组, * @return 返回值是一个浮点型二维数组(矩阵a的逆矩阵) */ public...; y < n * 2; y++) { result[x][y - n] = matrix1[x][y]; } } return result; } 现在我们先来跟踪代码输出的四个主...for循环的结果分别是什么: -------------------------------- 1.0 2.00.0 0.0 3.0 4.00.0 0.0 --------------------...编代码就非常的清楚了 接下来我们再看看:过程处理是怎么样的一个过程: -------------------------------- 1.02.01.00.0 0.0-2.0-3.01.0 --

    92220
    领券