0

0

C++怎么实现矩阵快速幂_C++线性递推优化【数学】

尼克

尼克

发布时间:2026-03-02 15:10:04

|

579人浏览过

|

来源于php中文网

原创

矩阵快速幂是将整数快速幂的二分乘法逻辑迁移到矩阵运算,需自定义矩阵乘法、正确初始化单位矩阵、按齐次线性递推构造转移矩阵,并在每步乘加中及时取模防溢出。

c++怎么实现矩阵快速幂_c++线性递推优化【数学】

矩阵快速幂的核心就是把 pow 换成矩阵版的二分乘法

普通整数快速幂是用二进制拆分指数,每次平方底数、按位累乘;矩阵快速幂完全照搬这个逻辑,只是把 int 乘法换成矩阵乘法。关键不是“怎么造轮子”,而是“怎么让矩阵乘法能套进快速幂框架里”。

  • 必须自己写 matmul 函数,不能依赖 std::vector 的默认行为——它不支持重载 *,且动态分配开销大
  • 单位矩阵初始化要写对:res[i][i] = 1,其他为 0;别用 memset(res, 1, sizeof(res)) 这种粗暴操作
  • 矩阵大小固定时(比如都是 2x23x3),优先用 std::array<:array long n>, N></:array>,比 vector<vector>></vector> 快 3–5 倍,也避免越界访问

递推式怎么转成转移矩阵?看齐次线性关系的“维数”

不是所有递推都能压成矩阵,只有形如 f(n) = a·f(n−1) + b·f(n−2) + ... 这种无常数项、系数固定的齐次线性递推才行。非齐次(比如带 +1)或非线性(比如 f(n) = f(n−1) * f(n−2))得先变形或放弃。

  • f(n) = f(n−1) + f(n−2) → 需要 2 维状态:[f(n), f(n−1)]^T,转移矩阵是 {{1,1},{1,0}}
  • f(n) = 2*f(n−1) − f(n−2) + 3 → 含常数项,得升一维:状态扩成 [f(n), f(n−1), 1]^T,最后一行补 [0,0,1] 来维持常数 1 不变
  • 初始向量顺序必须和转移矩阵行列严格对应,错一位结果全乱——常见错误是把 [f(1), f(0)] 写成 [f(0), f(1)]

模运算下容易爆 long long?乘法中间结果必须及时取模

矩阵乘法本质是大量 a[i][k] * b[k][j] 累加,哪怕单个元素 ≤ 1e9,相乘就可能到 1e18,再加几次直接溢出。C++ 没有自动模乘,必须手动控制。

达奇AI论文写作
达奇AI论文写作

达奇AI论文辅助写作平台,在校学生、职场精英都在用的AI论文辅助写作平台

下载
  • 不要只在最后 % MOD,要在每一步乘加后都做:sum = (sum + 1LL * a[i][k] * b[k][j]) % MOD
  • 1LL * 强制提升为 long long,否则 int * int 先溢出再转,没用
  • 如果 MOD 接近 2^31,连 1LL * a * b 都可能超 2^63−1,这时得用 __int128(GCC 支持)或龟速乘(不推荐,慢 10 倍)

为什么有时结果不对?检查这三个地方

矩阵快速幂代码短,但错一个下标或漏一次取模,输出就是错的,而且很难 debug。最常卡在:

立即学习C++免费学习笔记(深入)”;

  • 快速幂循环里写成了 while (n > 0) 却忘了 n >>= 1,死循环
  • 转移矩阵行列搞反了:左乘还是右乘?标准是 res = M^k * init,所以矩阵乘法实现必须是 A * B 表示“先 B 后 A”作用,别颠倒
  • 初始向量维度和矩阵不匹配:比如 3x3 矩阵配了 2x1 向量,编译不报错但运行时内存踩踏,值全乱

实际写的时候,先手算小样例(比如斐波那契第 5 项),把每一步矩阵和向量打印出来,比对着看哪步开始偏移,比瞎猜快得多。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

104

2023.09.25

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

596

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

46

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

42

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

37

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

21

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.5万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 20.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号