`
从此醉
  • 浏览: 1044666 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

矩阵的快速幂及应用

 
阅读更多

以二阶矩阵为例。典型的斐波那契数列,就可以使用矩阵相乘来求解。

如果不考虑乘法的话,复杂度应该是lgn.

下面只给出计算矩阵快速幂的方法

#include <iostream>
#define L 10000
using namespace std;


class MyMatrix{
public:
	long long a00,a01,a10,a11;
	MyMatrix();
	MyMatrix(long long _a00, long long _a01, long long _a10, long long _a11):a00(_a00), a01(_a01), a10(_a10), a11(_a11) { }
	void print_matrix();
};


void MyMatrix::print_matrix(){
	cout << a00 << " " << a01 << endl << a10 << " " << a11 << endl;
}


const MyMatrix operator * (const MyMatrix & m1, const MyMatrix & m2){
	return MyMatrix(
		m1.a00 * m2.a00 + m1.a01 * m2.a10,
		m1.a00 * m2.a01 + m1.a01 * m2.a11,
		m1.a10 * m2.a00 + m1.a11 * m2.a10,
		m1.a10 * m2.a01 + m1.a11 * m2.a11
	);
}


//用 递归实现分治求解
const MyMatrix pow_matrix(const MyMatrix & m, long long n){
	if( n <= 1)
		return m;
	else{
		if( n & 1){ //奇数
			MyMatrix temp = pow_matrix(m, n/2);
			temp = temp * temp * m;
			return temp;
		}else{
			MyMatrix temp = pow_matrix(m, n/2);
			temp = temp * temp;
			return temp;
		}
	}
}


//不实用递归优化求解
MyMatrix ans2(1,0,0,1); //定义一个单位阵,存数最终结果
void pow_matrix_fast(const MyMatrix & m,long long n){
	MyMatrix temp = m;
//	temp.print_matrix();
	while(n){
		if(n & 1){ //奇数
			ans2 = ans2 * temp;
		}
		temp = temp * temp;
		n >>= 1;
		//temp.print_matrix();
	}
}


MyMatrix ans3(1,2,3,4);
void pow_matrix_fast2(const MyMatrix & m,long long n){
	MyMatrix temp = m;
//	temp.print_matrix();
	n--;
	while(n){
		if(n & 1){ //奇数
			ans3 = ans3 * temp;
		}
		temp = temp * temp;
		n >>= 1;
		//temp.print_matrix();
	}
}


int main() {
	MyMatrix m(1, 2, 3 ,4);
	MyMatrix ans = pow_matrix(m,6);
	ans.print_matrix();


	pow_matrix_fast(m, 6);
	ans2.print_matrix();


	pow_matrix_fast2(m, 6);
	ans3.print_matrix();
	return 0;
}


分享到:
评论

相关推荐

    矩阵快速幂

    PPT中简单讲解了一下矩阵的基础,以及矩阵快速幂的写法和简单应用,练习题网上有很多

    快速幂入门文献-用于旋翼飞行器的控制

    快速幂算法在旋翼飞行器控制中的应用并非直接关联,快速幂作为一种高效的数学算法,主要用于计算大整数的幂次,尤其是在计算机科学和密码学中有广泛应用。不过,考虑到控制理论中的数学建模和优化计算也可能用到类似...

    快速幂详解.md 快速幂算法是一种高效的计算幂运算的算法

    需要注意的是,快速幂算法不仅可以用于求解正整数的幂运算,还可以扩展到负整数、小数甚至矩阵的幂运算中。此外,在实际应用中,还需要注意处理底数为0或指数为0的特殊情况,以及考虑取模运算的需求,以满足不同的...

    矩阵乘法在信息学中的应用

    矩阵在数学中应用很广,而在信息学中同样有很广的应用。本文将阐述 矩阵的乘法这一运算在三个方面的一些应用。...关键字:快速幂矩阵乘法优化动态规划图的邻接矩阵折半递归 原创:浙江省杭州二中俞华程

    论文研究-基于粒子群算法的判断矩阵一致性修正.pdf

    自从RSA算法提出后,方幂模快速算法一直是研究重点之一,方幂模算法的改进和速度的提高直接影响RSA算法的整体性能和广泛应用。深入分析了方幂模计算的秦九韶算法、分块算法、二进制自适应分组查表法和最短加法链算法...

    计算机考研机试攻略 - 满分篇.pdf

    目录 写在前面的话 2 ...4.5 矩阵快速幂 51 4.6 区间类型动态规划 52 4.7 数位类型动态规划 52 4.8 树上的动态规划 53 4.9平衡二叉树的问题 54 完结撒花 56 N诺考研系列图书 58 N诺网校招募令 59

    论文研究-基于子空间逼近的特征空间波束形成算法.pdf

    特征空间波束形成(ESB)算法为了得到信号子空间需要对采样协方差矩阵进行特征值分解,运算量十分巨大,这大大限制了其应用。为了减低ESB算法的运算量,利用有理子空间逼近的原理,提出一种不需要估计信号源个数的...

    IOI国家集训队论文集1999-2019

    高寒蕊 -《递推关系的建立及在信息学竞赛中的应用》 郭 一 -《数学模型及其在信息学竞赛中的应用》 江 鹏 -《探索构造法解题模式》 李 刚 -《动态规划的深入讨论》 龙 翀 -《解决空间规模问题的几种常用的存储...

    应用数值线性代数 英文版 Applied Numerical Linear Algebra / James W. Demmel

    全书共分7章,包括引论、线性方程组求解、线性最小二乘问题、非对称特征值问题、对称特征问题和奇异值分解、线性方程组迭代方法及特征值问题迭代方法,本书不仅给出了数值线性代数的常用算法,而且也介绍了多重网格法...

    分数阶差分方程理论 [程金发 著] 2011年版

    本分支系统而快速的发展是因为1974年以来由极其广泛的应用背景推动的.这几十年涌现了大量的论文、专著,举行了多次分数微积分与分数微分方程理论和应用的国际会议.美国“数学评论”(MR)的分类目录中已列出专项....

    国家集训队2019论文集.zip

    我们只需要类似快速幂地倍增k,每次把多项式对S(x)取模。 x' mod s(x) 的次数不超过m-2,我们再由定义带入a的前m-1项求出G即可。 求两个次数O(m)的多项式取模结果在模域下可以做到O(mlog(m))-时间复东度(可 以参见...

    cpmoptimize:优化了用于计算线性递归的Python字节码,将时间复杂度从O(n)降低到O(log n)

    cpmoptimize 通过快速矩阵求幂进行自动算法优化的装饰器例子假设我们要使用Python中的程序来计算十分之一的。 简单算法的功能相当慢: def fib ( n ): a = 0 b = 1 for i in xrange ( n ): a , b = b , a + b return...

    Advanced_Calculator_FX_Pro_v4.4.2_build_1095.apk

    它用途广泛,可用于从基础预代数到微积分的课程,还可以应用于物理,工程,生物学和统计学。一站式计算器,离线工作,快速而强大。科学计算器支持fx 500,fx500、570vn plus,82ms和82ms,82es和82es,fx 4500、...

    挑战程序设计竞赛(第2版)

    2.6.4 快速幂运算 2.7 一起来挑战GCJ的题目(1) 2.7.1 Minimum Scalar Product 2.7.2 Crazy Rows 2.7.3 Bribe the Prisoners 2.7.4 Millionaire 阅读 第3章 出类拔萃——中级篇 3.1 不光是查找值!“二分搜索” ...

    C程序范例宝典(基础代码详解)

    3.6 图及图的应用 169 实例115 图的邻接表存储 170 实例116 图的深度优先搜索 172 实例117 图的广度优先搜索 175 实例118 Prim算法求最小生成树 177 实例119 迪杰斯特拉算法 180 第4章 算法 183 4.1...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    《C/C++常用算法手册》对每一个知识点都给出了相应的算法及应用示例。虽然这些例子都是以C语言来编写的,但是算法并不局限于C语言。如果读者采用其他编程语言,例如C++、C#、VB、Java等,根据其语法格式进行适当的...

    基于多DSP+FPGA的卫星遥感图像压缩系统设计

    1基于双正交叠式变换的低复杂度图像压缩方法1.1双正交重叠变换的快速整数实现在有损压缩中,通常先对图像矩阵进行正交/双正交变换,使能量分布集中,表示更为稀疏。离散余弦变换(DCT)由于具有良好的去相关效果,并且...

    MATLAB中sin用代码咋写-AsuMathLabG17:这是一个大学项目,旨在制作一个可以像matlab一样工作的C++库

    ++控制台应用程序。 这是类似于MATLAB的数学软件,主要执行大部分操作。 它分为两个阶段。 规格 它可以在linux上运行。 它具有与MATLAB相同的接口。 对于大型输入,它具有快速响应时间。 提供与MATLAB相同的结果。 ...

    算法导论(part1)

    4.4.1 取正合幂时的证明 4.4.2 上取整函数和下取整函数 第5章 概率分析和随机算法 5.1 雇用问题 5.2 指示器随机变量 5.3 随机算法 *5.4 概率分析和指示器随机变量的进一步使用 5.4.1 生日悖论 ...

    算法导论(part2)

    4.4.1 取正合幂时的证明 4.4.2 上取整函数和下取整函数 第5章 概率分析和随机算法 5.1 雇用问题 5.2 指示器随机变量 5.3 随机算法 *5.4 概率分析和指示器随机变量的进一步使用 5.4.1 生日悖论 ...

Global site tag (gtag.js) - Google Analytics