讲师中心 微信公众号
AI工具推荐 视频效率加速

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

梦芳小哥_5516

梦芳小哥_5516

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

|

599人浏览过

|

来源于php中文网

原创

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

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

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

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

  • 必须自己写 matmul 函数,不能依赖 std::vector 的默认行为——它不支持重载 *,且动态分配开销大
  • 单位矩阵初始化要写对:res[i][i] = 1,其他为 0;别用 memset(res, 1, sizeof(res)) 这种粗暴操作
  • 矩阵大小固定时(比如都是 2x2 或 3x3),优先用 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++ 没有自动模乘,必须手动控制。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 不要只在最后 % 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工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
while的用法
while的用法

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

354

2023.09.25

string转int
string转int

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

6359

2023.08.02

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

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

3085

2024.08.29

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

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

3988

2025.08.29

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

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

2765

2025.08.29

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

40

2026.10.16

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

40

2026.10.16

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

20

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn