矩阵快速幂

要想知道矩阵快速幂,我们先了解一下什么叫快速幂和矩阵乘法


一、快速幂

快速幂算法是用来快速计算指数表达式的值的,例如 210000000,普通的计算方法 2*2*2*2…10000000次,如果一个数字的计算都要计算那么多次的话,那么这个程序一定是失败的。

快速幂思想及实现

快速幂思想其实很简单,就是公式的转换
1、当指数是偶数时,我们可以让指数除以2,底数乘以底数
2、当指数是奇数时,我们可以将指数变为偶数

#include <iostream>
using namespace std;
typedef long long LL;long long fpow(long long x, long long p)
{long long ans = 1;//完整代码//while (p) {//	if (p % 2 == 1) {//		ans *= x, p--;//	}//	else {//		p /= 2;//		x *= x;//	}//}//精简代码while (p) {if (p & 1) ans *= x ; //p为奇数p >>= 1;x *=x;}return ans;
}
int main()
{LL x, p;cin >> x >> p;cout << fpow(x, p) << endl;
}


二、矩阵乘法

图文演示:

#include <iostream>
#include <algorithm>
using namespace std;typedef long long int ll;
const int mod = (int)1e9 + 7;
const int N = 1e3;int a[N][N], b[N][N];
int temp[N][N];
// a = a * b
void MAXMP(int a[][N], int b[][N], int n, int p, int m) //第一个矩阵的行,两个矩阵相同的列行,第二个矩阵的列,
{for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++) temp[i][j] = 0;}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){for (int k = 1; k <= p; k++){temp[i][j] = (temp[i][j] + (a[i][k] * b[k][j]) % mod) % mod;}}}
}int main()
{int n, m, p;cin >> n >> p >> m; //行 列行 列for (int i = 1; i <= n; i++){for (int j = 1; j <= p; j++) cin >> a[i][j];}for (int i = 1; i <= p; i++){for (int j = 1; j <= m; j++) cin >> b[i][j];}MAXMP(a, b, n, p, m);for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++) cout << temp[i][j] << endl;}}

三、矩阵快速幂

        矩阵快速幂,即给定一个矩阵A(m*n)),快速计算A^n。一般来说,矩阵快速幂只会涉及方阵即A(n*n),所以下面以方阵为例。(一般来说,只有方阵存在矩阵幂值,故此时等行等列)

#include <iostream>
#include <algorithm>
using namespace std;typedef long long int ll;
const int mod = (int)1e9 + 7;
const int N = 1e3;int a[N][N], res[N][N];
int temp[N][N];// a = a * b
void MXMP(int a[][N], int b[][N], int n) 
{for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++) temp[i][j] = 0;}for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){for (int k = 1; k <= n; k++){temp[i][j] = (temp[i][j] + (a[i][k] * b[k][j]) % mod) % mod;}}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) a[i][j] = temp[i][j];}
}void PowerMod(int a[][N], int n, int x)//x为次幂,n为矩阵行,m为矩阵行
{memset(res, 0, sizeof(res));for (int i = 1; i <= n; i++) res[i][i] = 1;//初始化为单位矩阵while (x){if (x & 1) MXMP(res, a, n);MXMP(a, a, n);x >>= 1;}
}int main()
{int n, x;cin >> n >> x;for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++) cin >> a[i][j];}PowerMod(a, n, x);for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++) cout << res[i][j] <<" ";cout << endl;}return 0;
}

四、矩阵快速幂的应用

斐波拉契函数

  例如:斐波那契数列的递推计算的时间复杂度为O ( n ),f[0] = 1,f[1] = 1,f[i] = f[i-1]+f[i-2],(i>1),换成矩阵乘法的形式,即

  利用矩阵乘法和快速幂运算,时间复杂度可达到 O(2^3\ logn)O优于普通的O(n), 其中数字2 为抽象出的矩阵边长 2^32 为矩阵乘法运算的时间,logn为快速幂运算时间。

  注意:实现时为了简便可以把矩阵C的大小设置成等同于矩阵B的大小,空位用0填充

#include <iostream>
#include <algorithm>
using namespace std;typedef long long int ll;
const int mod = (int)1e9 + 7;
const int N = 1e3;int a[N][N], res[N][N];
int temp[N][N];
int f[N][N];// a = a * b
void MXMP(int a[][N], int b[][N], int n) 
{for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++) temp[i][j] = 0;}for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){for (int k = 1; k <= n; k++){temp[i][j] = (temp[i][j] + (a[i][k] * b[k][j]) % mod) % mod;}}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) a[i][j] = temp[i][j];}
}void PowerMod(int a[][N], int n, int x)//x为次幂,n为矩阵行列
{memset(res, 0, sizeof(res));for (int i = 1; i <= n; i++) res[i][i] = 1;//初始化为单位矩阵while (x){if (x & 1) MXMP(res, a, n);MXMP(a, a, n);x >>= 1;}for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)a[i][j] = res[i][j];
}int solve(int n)
{if (n == 1 || n == 2) return 1;a[1][1] = 1, a[1][2] = 1;a[2][1] = 1, a[2][2] = 0;PowerMod(a, 2, n - 2);f[1][1] = 1, f[2][1] = 1;MXMP(a, f, 2);return a[1][1];
}int main()
{int n;cin >> n;cout << solve(n) << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3015720.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【LAMMPS学习】八、基础知识(5.9)LAMMPS 近场动力学

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各种模拟。 …

如何与精益生产咨询公司合作,确保项目的成功?

随着竞争的白热化&#xff0c;企业为了提升生产效率和降低成本&#xff0c;纷纷寻求精益生产咨询公司的帮助。然而&#xff0c;与咨询公司合作并不是一蹴而就的事情&#xff0c;需要双方共同努力&#xff0c;才能确保项目的成功。那么&#xff0c;如何与精益生产咨询公司合作&a…

使用开放式用户通信连接两台西门子S71200plc

步骤1.在项目中创建两台PLC。 步骤2.分别设置两个PLC的参数。 plc1 plc2 步骤3.对两个plc进行组态 步骤4.在plc1和plc2中各自创建DB块&#xff0c;用于通信。 须在块的属性中取消优化块的访问选项。 plc1 plc2 步骤5.往plc1的main块中编写代码。 步骤6.往plc2的main块中编写…

python学习笔记-02

变量和数据类型 程序中运用变量存储数据&#xff0c;python是一门强类型语言&#xff0c;赋值时不需要指定数据类型。 1.变量的定义 语法格式&#xff1a;变量名数据 a10 print(a) a哈哈 print(a)python中基本数据类型&#xff1a; 数字(num)&#xff1a;int(有符号整数)、lo…

如何用virtualbox 来跑openwrt 镜像?

1.下载好openwrt源代吗&#xff0c;编译之前先配置&#xff0c;让编译产生x86的virtualbox 镜像&#xff1a; 编译完成之后会产生vdi镜像文件&#xff0c; 在virtualbox 中创建一虚拟机&#xff0c;类型选择linux,版本other linux 64: 内存选择512&#xff1a; 这个地方把镜像…

LeetCode算法题:7. 整数反转

给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 1&#xff1a; 输…

iOS--runloop的初步认识

runloop的初步认识 简单认识runloopEvent looprunloop其实就是个对象NSRunloop和CFRunLoopRef的依赖关系runloop与线程runloop moderunloop sourceCFRunLoopSourceCFRunLoopObserverCFRunLoopTimer runloop的实现runloop的获取添加ModeCFRunLoopAddCommonMode 添加Run Loop Sou…

20240506 深度学习高级技术点

1.基于BN层剪枝 基于Batch Normalization (BN)层进行剪枝是一种常用的模型压缩方法&#xff0c;特别是在卷积神经网络(CNNs)中。BN层在训练期间用于加速收敛和提高模型的泛化能力&#xff0c;而在剪枝过程中&#xff0c;BN层提供的统计信息&#xff08;特别是均值(mean)和方差…

【vue-echarts】 报错问题解决 “Error: Component series.pie not exists. Load it first.“

目录 问题描述解决【解决1】【解决2】 问题描述 使用 vue-echarts 时导入的文件 import VChart from vue-echarts/components/ECharts import echarts/lib/chart/line import echarts/lib/chart/bar import echarts/lib/chart/pie import echarts/lib/component/legend impor…

AGI|基于LangChain实现的三种高级RAG检索方法

一、前言 RAG(Retrieval-Augmented Generation)检索增强生成&#xff0c;是现如今基于企业私域知识的问答应用所使用的主流技术之一。相较于重新训练基于私域知识的大模型来说&#xff0c;RAG没有额外的预训练成本&#xff0c;且回答效果与之相当。 但在实际应用场景中&#xf…

虚拟机文件夹共享操作(本地访问)

新建一个文件夹 右击文件夹点击属性 找到共享 点击共享 选择本地用户共享就可以了 本地winr 输入我们图片中的格式&#xff08;IP前加 “\\” &#xff09; 会弹一个窗口&#xff0c;输入虚拟机的入户名和密码就可以共享了&#xff08;一般默认用户名都是administrator&am…

[oeasy]python0015_键盘改造_将esc和capslock对调_hjkl_移动_双手正位

键盘改造 &#x1f94b; 回忆上次内容 上次练习了复制粘贴 按键 作用 <kbd>y</kbd><kbd>y</kbd> 复制光标行代码 到剪贴板 <kbd>p</kbd> 粘贴剪贴板中的内容 <kbd>i</kbd> 切换到 插入模式 <kbd>h</kbd>…

单调栈|84.柱状图中最大的矩形

力扣题目链接 // 版本一 class Solution { public:int largestRectangleArea(vector<int>& heights) {int result 0;stack<int> st;heights.insert(heights.begin(), 0); // 数组头部加入元素0heights.push_back(0); // 数组尾部加入元素0st.push(0);// 第一…

大模型外推能力

一、目录 定义如何提高模型的外推能力&#xff1f;分类测评方法各技术点&#xff0c;以及应用模型&#xff0c;优缺点支持模型长上下文的方案「NTK-aware interpolation」的思路是什么&#xff1f;LLM长度外推方案NTK-by-parts的思路是什么&#xff1f;LLM长度外推方案YaRN是怎…

Xinstall广告效果监测,助力广告主优化投放策略

在移动互联网时代&#xff0c;APP推广已成为企业营销的重要手段。然而&#xff0c;如何衡量推广效果&#xff0c;了解用户来源&#xff0c;优化投放策略&#xff0c;一直是广告主和开发者面临的难题。这时&#xff0c;Xinstall作为国内专业的App全渠道统计服务商&#xff0c;以…

铜价飙升,慧能泰HUSB332F带你狂飙

铜价&#xff0c;近期涨的很飘&#xff0c;涨到怀疑人生。继黄金后&#xff0c;铜成了另一个疯涨的明星&#xff01;作为电线电缆生产不可或缺的原材料&#xff0c;铜的身价暴涨直接拉响了成本警报&#xff0c;压缩了企业的利润空间。众多电线电缆制造商面临着严峻的挑战与考验…

电脑提示“无法定位程序输入点kernel32.dll”怎么解决?分享kernel32.dll丢失的五个修复方法

打开游戏或者软件的时候&#xff0c;电脑提示由于找不到kernel32.dll&#xff0c;无法继续执行此代码怎么办&#xff0c;其实修复起来不难。首先需要先知道怎么是dll文件&#xff0c;dll文件可以简单的把库文件看成一种代码仓库&#xff0c;它提供给使用者一些可以直接拿来用的…

2024抖音小店最新注册流程来了,快快收藏!

大家好&#xff0c;我是电商糖果 2024年想开一家抖音小店&#xff0c;但是不知道具体的开店流程。 不要着急&#xff0c;这篇文章就给大家详细的讲解一下。 首先&#xff0c;准备开店材料&#xff1a;5000左右的类目保证金&#xff0c;电脑&#xff0c;手机号&#xff0c;法…

黑马程序员HarmonyOS4+NEXT星河版入门到企业级实战教程笔记

HarmonyOS NEXT是纯血鸿蒙&#xff0c;鸿蒙原生应用&#xff0c;彻底摆脱安卓 本课程是基于harmony os4的&#xff0c;与next仅部分api有区别 套件 语言&框架 harmony os design ArkTs 语言 ArkUI 提供各种组件 ArkCompiler 方舟编译器 开发&测试 DevEco Studio 开发…

echarts学习笔记:柱状图+雷达图+双环形图+地图可视化+数据传递关系图+关键词条图+数据总览图+AntV/G2/DataV

GitHub - lgd8981289/imooc-visualization: https://www.bilibili.com/video/BV1yu411E7cm/?vd_source391a8dc379e0da60c77490e3221f097a 课程源码 国内echarts镜像站&#xff1a;ISQQW.COM x ECharts 文档&#xff08;国内同步镜像&#xff09; - 配置项 echarts图表集&…