首页 > 其他分享 >矩阵快速幂

矩阵快速幂

时间:2024-04-26 19:14:45浏览次数:27  
标签:Ma int 矩阵 vector ans 快速 乘法

1.参考

参考: 【矩阵快速幂】简单题学「矩阵快速幂」

2.定义

2.1 定义



如果直接求取 M^n,时间复杂度是 O(n),可以定义矩阵乘法,然后用快速幂算法来加速这里 M^n的求取, 简化时间复杂度为 O(logn)
主体思路就是不求 M^n 而是求 M^(n/2), 然后先不求M^(n/2), 先求M^(n/4)

具体实现同样可以用二进制分解加位掩码来实现(具体可以参考快速幂),只是当某个位掩码为 1 表示该位需要的时候,做的是快速幂做的是乘法,矩阵快速幂做的是矩阵乘法。
实现矩阵快速幂,可以先写一个 struct Matrix 表示矩阵,之后的乘法,求幂都是针对这个类的运算。
其中用一个二维数组做数据成员,一个 init () 方法,将矩阵初始化为单位阵 \(\begin{bmatrix}1&0\\0&1\end{bmatrix}\)。然后重载 * 和 ^ 分别表示矩阵乘法和矩阵快速幂。代码如下:
其中 M 表示方阵的行数。

2.2 代码模板

代码模板1

using ll = long long;
const int M = 2;

struct Ma
{
    int a[M][M]; // 存取矩阵值
    Ma()
    {
        memset(a, 0, sizeof(a));
    }

    void init() // 初始化单位矩阵
    {
        a[0][0] = a[1][1] = 1;
        a[0][1] = a[1][1] = 0;
    }

    Ma operator*(const Ma& B) const // 矩阵乘法(结果固定为一个2*2的矩阵)
    {
        Ma ans;
        for(int i = 0; i < M; ++i)
            for(int j = 0; j < M; ++j)
                for(int k = 0; k < M; ++k)
                    ans.a[i][j] += a[i][k] * B.a[k][j];
        return ans;
    }

    Ma operator^(int n) const // 矩阵幂
    {
        Ma ans;
        ans.init(); // 初始化一个单位矩阵
        Ma A = *this; // 拷贝一个出来用于自乘
        while(n)
        {
            if(n & 1)
                ans = ans * A;
            A = A * A;
            n >>= 1;
        }
        return ans;
    }
};

3.例题

3.1 LCR 126. 斐波那契数

链接LCR 126. 斐波那契数
这个模板不如上面那个通用,更多是针对本题的,可以学习参考

代码模板

    vector<vector<long>> pow(vector<vector<long>>& a, int n) { // 矩阵幂
        vector<vector<long>> ret{{1, 0}, {0, 1}};
        while (n > 0) {
            if (n & 1) { // 使用二进制分解的方法, 进行矩阵快速幂运算
                ret = multiply(ret, a);
            }
            n >>= 1;
            a = multiply(a, a); // 平方自增
        }
        return ret;
    }

    vector<vector<long>> multiply(vector<vector<long>>& a, vector<vector<long>>& b) { // 矩阵乘法
        vector<vector<long>> c{{0, 0}, {0, 0}};
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) {
                c[i][j] = (a[i][0] * b[0][j] + a[i][1] * b[1][j]) % MOD; // 这里因为提前知道是一个2*2矩阵 乘 一个2*2矩阵 = 一个2*2矩阵
            }
        }
        return c;
    }

标签:Ma,int,矩阵,vector,ans,快速,乘法
From: https://www.cnblogs.com/trmbh12/p/18160349

相关文章

  • 抖音商单信息通过ETL工具快速同步
    一、抖音平台抖音是一款热门的短视频社交平台,拥有海量用户和高度活跃的商业生态。在抖音上,商家可以开设商铺并发布商品,消费者可以在平台上购买商品并获得优惠。同时,抖音也是一个广告平台,商家可以通过购买广告位来宣传产品。在这样一个大环境下,商家和消费者都需要保持良好的数据同......
  • 【刚度矩阵推导】2d frame 单元
    2dframe单元是x-y平面上的单元,每个节点上有2个平移自由度的和一个转动自由度.局部坐标系下,单元位移向量为:\(u=[u_1,u_2,u_3,u_4,u_5,u_6]^{T}\)其局部坐标系下的刚度矩阵可以由2dtruss单元和2dbornoulli-beam单元的刚度矩阵组合而成.使用matlab进行推导:%!b......
  • 【知识点】快速幂与矩阵快速幂
    什么是快速幂,为什么要使用快速幂?Macw:快速幂有好多好处。Penelope:例如?Macw:它比较快。见名知意,快速幂算法可以在非常短的时间内求出一个数的\(n\)次幂。虽然快速幂在初学阶段的应用不算太多,但是快速幂背后的思想是非常值得我们去理解的。举例而言,如果我们要求出\(3^......
  • ollama——快速上手Llama3部署使用
    ollama——快速上手Llama31.ollama安装#Linuxcurl-fsSLhttps://ollama.com/install.sh|sh#vi/etc/systemd/system/ollama.service[Unit]Description=OllamaServiceAfter=network-online.target[Service]ExecStart=/usr/local/bin/ollamaserveUser=ollamaGrou......
  • 如何3分钟,快速开发一个新功能
    背景关于为什么做这个代码生成器,其实主要有两点:参与的项目中有很多分析报表需要展示给业务部门,公司使用的商用产品,或多或少有些问题,这部分可能是历史选型导致的,这里撇开不不谈;项目里面也有很多CRUD的功能,而这些功能的实现代码基本上差不多,这些功能都去手写,也比较浪费时间而且......
  • 阿里云边缘容器云帮助AI推理应用快速落地
    近日,阿里云技术专家徐若晨在全球分布式云大会上,分享了《边缘容器云助力AI推理高效落地》的主题演讲,分享了阿里云边缘容器云如何助力开发者实现更快速的AI推理应用的迭代和部署。此外,他还分享了边缘AI推理应用在实际业务中的应用案例。 终端算力上移云端算力......
  • 矩阵树定理 BEST 定理
    矩阵树定理\(\text{BEST}\)定理证明很复杂,连\(\text{cmd}\)这种无敌神犇都不会,而且对定理本身的可扩展性几乎为\(0\),即每次套用的定理都跟模板一模一样。矩阵树无论任何情况,一定要不能有自环无论任何情况,一定要不能有自环无论任何情况,一定要不能有自环对于无向无权图,......
  • MinIO 常用 API 快速入门
    快速入门minio中文网minio官网minio有开源版和收费版,使用开源版时,若修改了minio的源代码,需要将修改后的源代码完全公开。启动miniominio文档提供了多个运行环境的安装流程,此处以windows为例,其它运行环境文档上都有介绍。相关文档下载minio.exe:https://dl.minio......
  • 矩阵树定理 BEST 定理
    矩阵树定理\(\text{BEST}\)定理证明很复杂,连\(\text{cmd}\)这种无敌神犇都不会,而且对定理本身的可扩展性几乎为\(0\),即每次套用的定理都跟模板一模一样。矩阵树无论任何情况,一定要不能有自环无论任何情况,一定要不能有自环无论任何情况,一定要不能有自环对于无向无权图,......
  • 洛谷题单指南-动态规划2-P1874 快速求和
    原题链接:https://www.luogu.com.cn/problem/P1874题意解读:一个数字字符串s,分解成几个整数,和为n,计算最少加号个数,也就是计算最少分解的整数个数-1。解题思路:此题虽然分类在动态规划,但数据量不大,DFS更加直观和易于理解,所以采用DFS暴搜+剪枝来解决。搜索思路是对数字字符串依次枚......