矩阵快速幂技巧练习(一)— 经典牛问题

上一篇文章简单介绍了斐波那契数列的矩阵乘法,并做了一个小推广,这篇文章来小试牛刀,做一个经典的练习题。
求斐波那契数列矩阵乘法的方法

题目
第一年农场有一只成熟的母牛A,往后的每年:

  1. 每一只成熟的母牛都会生一只母牛
  2. 每一只新出生的母牛都会在第三年成熟。
  3. 每一只母牛都不会死。

求n年后牛的数量。


先来看一下农场前6年牛的变化。
在这里插入图片描述解释一下,第一年只有牛A。
第二年牛A生了牛B。
第三年牛A生了牛C,因为牛B还不成熟,所以只能A生。
第四年依然是牛A生了牛D。
第五年,此时牛B也已经成熟,并且牛不会死,所以牛A继续生牛E,牛B生牛F。
第六年,前几年的牛继续保留,此时C也成熟可以生小牛,所以ABC分别生3只小牛。

根据题意可推导出:新的一年中,我每年都要保留前一年的所有牛,并且3年前的牛已经成熟可以生新的小牛,所以3年前有多少头牛,就生多少头牛。
所以: F ( n ) = F ( n − 1 ) + F ( n − 3 ) F(n) = F(n - 1) + F(n - 3) F(n)=F(n1)+F(n3)


根据上面公式可以看出它是一个3阶的递推式,所以下面的式子它一定满足:

∣ F 4 , F 3 , F 2 ∣ = ∣ F 3 , F 2 , F 1 ∣ × ∣ a b c d e f g h i ∣ |F_4,F_3,F_2| = |F_3,F_2,F_1| \times\left| \begin{matrix} a & b & c\\ d & e & f \\ g & h & i \end{matrix} \right| F4,F3,F2=F3,F2,F1× adgbehcfi

∣ F 5 , F 4 , F 3 ∣ = ∣ F 4 , F 3 , F 2 ∣ × ∣ a b c d e f g h i ∣ |F_5,F_4,F_3| = |F_4,F_3,F_2| \times\left| \begin{matrix} a & b & c\\ d & e & f \\ g & h & i \end{matrix} \right| F5,F4,F3=F4,F3,F2× adgbehcfi
∣ F n , F n − 1 , F n − 2 ∣ = ∣ F 3 , F 2 , F 1 ∣ × ∣ a b c d e f g h i ∣ n − 3 |F_n,F_{n-1},F_{n-2}| = |F_3,F_2,F_1| \times\left| \begin{matrix} a & b & c\\ d & e & f \\ g & h & i \end{matrix} \right|^{n-3} Fn,Fn1,Fn2=F3,F2,F1× adgbehcfi n3

所以我们只要先根据给定的初始值,来求出固定的 3 * 3矩阵,再将n- 2次方带入。就能够求出来Fn的值。


初始值我们知道 F(1) = 1,F(2) = 2,F(3) = 3,F(4) = 4,F(5) = 6,F(6) = 9,如果初始值不够求出矩阵,那就根据公式 F ( n ) = F ( n − 1 ) + F ( n − 3 ) F(n) = F(n - 1) + F(n - 3) F(n)=F(n1)+F(n3)继续带入,获取更多值的信息。

∣ F 4 , F 3 , F 2 ∣ = ∣ F 3 , F 2 , F 1 ∣ × ∣ a b c d e f g h i ∣ − > ∣ 4 , 3 , 2 ∣ = ∣ 3 , 2 , 1 ∣ × ∣ a b c d e f g h i ∣ |F_4,F_3,F_2| = |F_3,F_2,F_1| \times\left| \begin{matrix} a & b & c\\ d & e & f \\ g & h & i \end{matrix} \right| ->|4,3,2| = |3,2,1| \times\left| \begin{matrix} a & b & c\\ d & e & f \\ g & h & i \end{matrix} \right| F4,F3,F2=F3,F2,F1× adgbehcfi >∣4,3,2∣=∣3,2,1∣× adgbehcfi
继续带入
{ 3 a + 2 d + g = 4 3 b + 2 e + h = 3 3 c + 2 f + i = 2 (1) \begin{cases} 3a + 2d + g = 4 \\ 3b + 2e + h= 3\\ 3c + 2f + i = 2 \end{cases} \tag{1} 3a+2d+g=43b+2e+h=33c+2f+i=2(1)
一个式子求不出来,在带入其他式子
∣ F 5 , F 4 , F 3 ∣ = ∣ F 4 , F 3 , F 2 ∣ × ∣ a b c d e f g h i ∣ − > ∣ 6 , 4 , 3 ∣ = ∣ 4 , 3 , 2 ∣ × ∣ a b c d e f g h i ∣ |F_5,F_4,F_3| = |F_4,F_3,F_2| \times\left| \begin{matrix} a & b & c\\ d & e & f \\ g & h & i \end{matrix} \right| ->|6,4,3| = |4,3,2| \times\left| \begin{matrix} a & b & c\\ d & e & f \\ g & h & i \end{matrix} \right| F5,F4,F3=F4,F3,F2× adgbehcfi >∣6,4,3∣=∣4,3,2∣× adgbehcfi
{ 4 a + 3 d + 2 g = 6 4 b + 3 e + 2 h = 4 4 c + 3 f + 2 i = 3 (2) \begin{cases} 4a + 3d + 2g = 6 \\ 4b + 3e + 2h= 4\\ 4c + 3f + 2i = 3 \end{cases} \tag{2} 4a+3d+2g=64b+3e+2h=44c+3f+2i=3(2)
以此类推,不一一列举,最后求出来矩阵的值为:
∣ 1 1 0 1 0 1 0 0 1 ∣ \left| \begin{matrix} 1 & 1 & 0 \\ 1 & 0 & 1\\ 0 & 0 & 1 \end{matrix} \right| 110100011


接下来求矩阵的n - 2次方的值。

代码

public static int c1(int n){
        if(n < 1){
            return 0;
        }

        if (n == 1 || n == 2 || n == 3){
            return n;
        }
        int[][] base = {{1,1,0},
                        {1,0,1},
                        {0,0,1}};

        int[][] res = matrixPower(base,n - 3);
        return 3 * res[0][0] + 2 * res[1][0] + res[2][0];
    }
    
public static int[][] matrixPower(int[][] m, int p) {
        int[][] res = new int[m.length][m[0].length];
        for (int i = 0; i < res.length; i++) {
            res[i][i] = 1;
        }
        // res = 矩阵中的1
        int[][] t = m;// 矩阵1次方
        for (; p != 0; p >>= 1) {
            if ((p & 1) != 0) {
                res = product(res, t);
            }
            t = product(t, t);
        }
        return res;
    }

    // 两个矩阵乘完之后的结果返回
    public static int[][] product(int[][] a, int[][] b) {
        int n = a.length;
        int m = b[0].length;
        int k = a[0].length; // a的列数同时也是b的行数
        int[][] ans = new int[n][m];
        for(int i = 0 ; i < n; i++) {
            for(int j = 0 ; j < m;j++) {
                for(int c = 0; c < k; c++) {
                    ans[i][j] += a[i][c] * b[c][j];
                }
            }
        }
        return ans;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL面试题 | 09.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【Debian】非图形界面Debian10.0.0安装xfce和lxde桌面

一、安装 1. Debian10.0.0安装xfce桌面 sudo apt update sudo apt install xfce4 startxfce4 2. Debian10.0.0安装lxde桌面 sudo apt-get install lxde安装后重启电脑。 二、说明 XFCE、LXDE 和 GNOME 是三个流行的桌面环境&#xff0c;它们都是为类 Unix 操作系统设计…

C语言:编译和链接

目录 一&#xff1a;翻译环境和运行环境 二&#xff1a;翻译环境 2.1预处理&#xff08;预编译&#xff09; 2.2编译 2.2.1 词法分析&#xff1a; 2.2.2语法分析 2.2.3语义分析 2.3 汇编 三&#xff1a;运行环境 一&#xff1a;翻译环境和运行环境 在ANSI C的任何一种…

微信小程序------WXML模板语法之条件渲染和列表渲染

目录 前言 一、条件渲染 1.wx:if 2. 结合 使用 wx:if 3. hidden 4. wx:if 与 hidden 的对比 二、列表渲染 1. wx:for 2. 手动指定索引和当前项的变量名* 3. wx:key 的使用 前言 上一期我们讲解wxml模版语法中的数据绑定和事件绑定&#xff08;上一期链接&#xff1a;…

MATLAB - 使用运动学 DH 参数构建机械臂

系列文章目录 前言 一、 使用 Puma560 机械手机器人的 Denavit-Hartenberg (DH) 参数&#xff0c;逐步建立刚体树形机器人模型。在连接每个关节时&#xff0c;指定其相对 DH 参数。可视化机器人坐标系&#xff0c;并与最终模型进行交互。 DH 参数定义了每个刚体通过关节与其父…

Go-gin-example 第二部分 jwt验证

文章目录 使用 JWT 进行身份校验jwt知识点补充认识JWTTOKEN是什么jwt的使用场景jwt的组成headerpayloadsignature 下载依赖包编写 jwt 工具包jwt中间件编写如何获取token 编写获取token的Apimodels逻辑编写路由逻辑编写修改路由逻辑 验证token将中间件接入Gin功能验证模块 续接…

gitlab 命令执行漏洞(CVE-2022-2992)

1.漏洞影响版本 GitLab CE/EE 中的一个漏洞影响从 11.10 开始到 15.1.6 之前的所有版本、从 15.2 开始到 15.2.4 之前的所有版本、从 15.3 开始到 15.3.2 之前的所有版本。允许经过身份验证的用户通过从 GitHub API 端点导入实现远程代码执行。 查看 gitlab 版本。(登录后才能…

【目标检测】YOLOv7算法实现(一):模型搭建

本系列文章记录本人硕士阶段YOLO系列目标检测算法自学及其代码实现的过程。其中算法具体实现借鉴于ultralytics YOLO源码Github&#xff0c;删减了源码中部分内容&#xff0c;满足个人科研需求。   本系列文章在YOLOv5算法实现的基础上&#xff0c;进一步完成YOLOv7算法的实现…

使用STM32Cube库开发USB虚拟串口设备

开发基于STM32Cube库的USB虚拟串口设备需要了解USB通信协议、虚拟串口设备的基本原理以及STM32Cube库的使用。在这篇文章中&#xff0c;我们将介绍如何利用STM32Cube库开发一个USB虚拟串口设备&#xff0c;并提供相应的代码示例。 1. USB虚拟串口设备概述 USB虚拟串口设备是指…

力扣刷题(无重复字符的最长子串)

3. 无重复字符的最长子串https://leetcode.cn/problems/longest-substring-without-repeating-characters/ 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是…

使用vue快速开发一个带弹窗的Chrome插件

vue-chrome-extension-quickstart 说在前面 &#x1f388;平时我们使用Chrome插件通常都只是用来编写简单的js注入脚本&#xff0c;大家有没有遇到过需要插件在页面上注入一个弹窗呢&#xff1f;比如我们希望可以通过快捷键快速唤起ChatGPT面板或者快速唤起一个翻译面板&#x…

动态规划:01背包问题(一)

本题力扣上没有&#xff0c;是刷的卡码网第46题感兴趣的小伙伴可以去刷一下&#xff0c;是ACM模式。本篇讲解二维dp数组来解决01背包问题&#xff0c;下篇博客将用一维dp数组来解决01背包问题。 题目&#xff1a; 46. 携带研究材料 时间限制&#xff1a;5.000S 空间限制&…

Spark---RDD持久化

文章目录 1.RDD持久化1.1 RDD Cache 缓存1.2 RDD CheckPoint 检查点1.3 缓存和检查点区别 2.RDD分区器2.1 Hash 分区&#xff1a;2.2 Range 分区&#xff1a;2.3 用户自定义分区 1.RDD持久化 在Spark中&#xff0c;持久化是将RDD存储在内存中&#xff0c;以便在多次计算之间重…

HDFS WebHDFS 读写文件分析及HTTP Chunk Transfer Encoding相关问题探究

文章目录 前言需要回答的首要问题DataNode端基于Netty的WebHDFS Service的实现基于重定向的文件写入流程写入一个大文件时WebHDFS和Hadoop Native的块分布差异 基于重定向的数据读取流程尝试读取一个小文件尝试读取一个大文件 读写过程中的Chunk Transfer-Encoding支持写文件使…

快慢指针-Floyd判圈算法

对于环形链表是否存在环的做法&#xff0c;普通算法可以通过额外Hash数组来存储链表元素&#xff0c;直到Hash数组中出现重复元素。时间复杂度O(n)&#xff0c;空间复杂度O(n) Floyd判圈算法通过利用快慢指针的移动来实现&#xff0c;时间复杂度O&#xff08;n&#xff09;&am…

Elasticsearch:聊天机器人教程(二)

这是继上一篇文章 “Elasticsearch&#xff1a;聊天机器人教程&#xff08;一&#xff09;”的续篇。本教程的这一部分讨论聊天机器人实现中最有趣的方面&#xff0c;以帮助你理解它并对其进行自定义。 数据摄入 在此应用程序中&#xff0c;所有示例文档的摄取都是通过 flask …

搭建知识付费小程序平台:如何避免被坑,选择最佳方案?

随着知识经济的兴起&#xff0c;知识付费已经成为一种趋势。越来越多的人开始将自己的知识和技能进行变现&#xff0c;而知识付费小程序平台则成为了一个重要的渠道。然而&#xff0c;市面上的知识付费小程序平台琳琅满目&#xff0c;其中不乏一些不良平台&#xff0c;让老实人…

git提交报错:remote: Please remove the file from history and try again.

1. 报错信息 remote: error: File: fba7046b22fd74b77425aa3e4eae0ea992d44998 500.28 MB, exceeds 100.00 MB. remote: Please remove the file from history and try again. git rev-list --objects --all | grep fba7046b22fd74b77425aa3e4eae0ea992d44998 2. 分析原因 e…

单例模式实现最好的方式即枚举实现

单例类作为23种设计模式当中最常用的设计模式&#xff0c;实现方式有很多种&#xff0c;比较流行的是DCL(DoubleCheckLock)双重检查的实现&#xff0c;线程安全&#xff0c;又比较好&#xff0c;除了存在序列化的问题之外&#xff0c;还算不错&#xff0c;如果对DCL模式还不熟悉…

UE5 RPG使用GAS技能系统

之前也介绍过GAS的使用&#xff1a; UE 5 GAS Gameplay Ability System UE 5 GAS 在项目中处理AttributeSet相关 UE 5 GAS 在项目中通过数据初始化 基础的讲解这里不再诉说&#xff0c;有兴趣的可以翻我之前的博客。 接下来&#xff0c;在RPG游戏中实现GAS系统的使用。 GAS系统…