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

news2025/1/11 15:36:08

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

题目
第一年农场有一只成熟的母牛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;
    }

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

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

相关文章

websocket项目 聊天室

1.项目概述 这个项目是一个基本的实时聊天应用&#xff0c;适用于小型团队或群体。提供了多个聊天室供用户选择。可以通过该代码进行进一步的扩展和定制&#xff0c;例如添加聊天机器人、改进界面等。 2.技术栈 flask&#xff0c;boostrapt&#xff0c;websocket&#xff0c…

【Rust】get_local_info 0.2.4发布

发布0.2.4&#xff0c;修正0.2.3&#xff08;[我的Rust库更新]get_local_info 0.2.3-CSDN博客&#xff09;中存在的峰值算法bug&#xff0c;现已提交力扣并通过&#xff0c;耗时0ms

[笔记]深度学习入门 基于Python的理论与实现(二)

2. 感知机 感知机(perceptron)是由美国学者 Frank Rosenblatt 在 1957 年提出的。它作为神经网络&#xff08;深度学习&#xff09;的起源的算法&#xff0c;是学习神经网络和深度学习的重要一环 严格地说&#xff0c;本章所说的感知机应该称为‘人工神经元’或‘朴素感知机’&…

排序算法8----归并排序(非递归)(C)

1、介绍 归并排序既可以是内排序&#xff08;在内存上的数据排序&#xff09;&#xff0c;也可以是外排序&#xff08;磁盘上&#xff09;&#xff08;硬盘&#xff09;&#xff08;在文件中的数据排序&#xff09;。 其他排序一般都是内排序。 区别于快速排序的非递归&#xf…

uni-app的学习【第三节】

五 运行环境判断与跨端兼容 uniapp为开发者提供了一系列基础组件,类似HTML里的基础标签元素,但uni-app的组件与HTML不同,而是与小程序相同,更适合手机端使用。 虽然不推荐使用 HTML 标签,但实际上如果开发者写了`div`等标签,在编译到非H5平台时也会被编译器转换为 `view`…

爬虫-8-数据存储-mysql

#mysql占空间最小吧&#xff0c;数据存储没问题吧 (//∇//)

Flowable:BpmnModel API

之前都是使用工具在绘制流程图&#xff0c;但是还是很少去认真的去看这个xml&#xff0c;有时候我们要从xml中分析获取一些结果&#xff0c;这个时候就要对xml及对应的api有足够的认识。 一&#xff1a;重新认识bpmn definitions&#xff1a;根节点用于定义流程。 bpmndi:BPMND…

台式OLED透明屏的6大基本要素

台式 OLED 透明屏作为一种创新的显示技术&#xff0c;正逐渐走进人们的视野。本文将为您全面介绍台式 OLED 透明屏的各个方面&#xff0c;包括类别、尺寸、技术参数原理、应用、主要厂家&#xff08;尼伽&#xff09;以及价格因素。 一、类别台式 OLED 透明屏根据不同的需求和应…

Java 实现双链表

文章目录 双链表&#xff08;Doubly Linked List&#xff09;是一种常用的数据结构&#xff0c;它与单链表相似&#xff0c;但每个节点除了包含指向下一个节点的指针外&#xff0c;还包含一个指向前一个节点的指针。 双链表的节点由三部分组成&#xff1a;数据域&#xff08;存…

帆软报表11.0.19增加postgres数据源方案

项目使用postgres数据库&#xff0c;帆软报表集成开发时需要手工增加该数据源。 https://help.fanruan.com/finereport/doc-view-2563.html 但增加数据源后测试报告无此驱动&#xff0c;经查看文档&#xff0c;现在是通过驱动管理来上传&#xff0c; 但新版又不允许上传驱动JAR…

威尔·库尔特《趣学贝叶斯统计:橡皮鸭、乐高和星球大战中的统计学》学习笔记(1):以A/B测试为例学习贝叶斯统计

主要是新学期的概率论的作业要求&#xff1a;Write a summary (no more than of a page) of your experience with an application of probability to a real-life situation (e.g., an engineering problem. –How was probability used to model the phenomena/situation?…

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

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

【Emgu.CV教程】5.3、几何变换之金字塔变换

这一段文字描述来自百度百科&#xff1a; 图像金字塔是图像多尺度表达的一种&#xff0c;是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的图像金字塔是一系列以金字塔形状&#xff08;自下而上&#xff09;逐步降低&#xff0c;且来源于同一张原始图的图像分辨率…

6、CLIP:连接文本和视觉世界的预训练模型

目录 一、论文题目 二、背景与动机 三、创新与卖点 四、技术细节 模型结构 简易代码 clip实现zero shot分类 五、为什么是CLIP?为什么是对比学习&#xff1f; 六、一些资料 在人工智能领域&#xff0c;文本和图像是两个极其重要的数据形式。传统上&#xff0c;机器学…

python 集合的详细用法

当前版本&#xff1a; Python 3.8.4 简介 Python中的集合是一种无序、可哈希的且不重复的数据类型&#xff0c;用于存储唯一的元素。集合的实现基于哈希表&#xff0c;因此在插入、查找和删除元素时具有高效性能。集合的每个元素都必须是不可变的&#xff0c;可以是数字、字符…

阿里AnyText:多语种图像文字嵌入的突破

模型简介 随着Midjourney、Stable Difusion等产品的兴起&#xff0c;文生图像技术迅速发展。然而&#xff0c;在图像中生成或嵌入精准文本一直是一个挑战&#xff0c;尤其是对中文的支持。阿里巴巴的研究人员开发了AnyText&#xff0c;这是一个多语言视觉文字生成与编辑模型&a…

SpringBoot 全局异常统一处理:BindException(绑定异常)

概述 在Spring Boot应用中&#xff0c;数据绑定是一个至关重要的环节&#xff0c;它负责将HTTP请求中的参数映射到控制器方法的入参对象上。在这个过程中如果遇到任何问题&#xff0c;如参数缺失、类型不匹配或验证失败等&#xff0c;Spring MVC将会抛出一个org.springframewo…

安达发|APS工序排程甘特图功能介绍

工序排程甘特图的主要功能 1. 显示工序时间安排&#xff1a;工序排程甘特图可以清晰地展示生产过程中各个工序的开始时间、结束时间和持续时间&#xff0c;从而帮助企业了解生产过程中各个环节的时间安排。 2. 显示工序进度情况&#xff1a;通过工序排程甘特图&#xff0c;企业…

通过myBatis将sql语句返回的值自动包装成一个java对象(3)

1.如果sql字段和java字段名字不一样怎么办&#xff1f; 之前我们将sql返回值转换为java对象时&#xff0c;每条sql的返回值的字段名和java类中的字段名是一一对应的&#xff0c;ie&#xff1a;sql选择的user有username和password两个字段&#xff0c;java中的user对象也有两个…

开源项目CuteSqlite开发笔记(七):CuteSqlite释放BETA版本啦

经过大半年的开发&#xff0c;CuteSqlite程序代码不知不觉来到了6万行&#xff0c;有效行数4万行&#xff0c;CuteSqlite开发完成了一个小版本&#xff0c;进入下一个阶段&#xff0c;并于2024元旦释放BETA版本&#xff0c;有兴趣的朋友可以下载试用。 GitHub下载https://gith…