二分幂,快速幂,矩阵快速幂,快速乘

快速幂+矩阵优化斐波那契数列(超详细教程) 文章目录前言一、快速幂二、矩阵优化斐波那契数列1.矩阵相关知识2.斐波那契数列用矩阵表示3.O(log2n)的斐波那契数列总结 前言 我们首先讲解快速幂,然后利用快速幂优化矩阵相乘,将O(n)算法变为O(log2n),紧接着我们用矩阵,优化斐波那契数列! 一、快速幂 通常我们算一个数(a)的n次幂,我们需要计算n次,也就是n个a相乘,这样难免太过缓慢,于是有了快速幂,即不需要n次操作就可以算出! 举例:计算A的9次幂 通过上述操作想必大家明白,快速幂的思想也就是二分的思想! 代码实现: #include 阅读详情

前言

二分幂,快速幂,矩阵快速幂在算大指数次方时是很高效的。

求 a^n 的值是多少?n是1到10^18次方的一个整数。
  求一个数的n次方,朴素的算法就是直接for循环,一遍一遍的乘,a*a*a*a*a*a… …,O(N)的复杂度。此时,如果n很小的话,并没有什么影响。
  但是当n非常大,n=10^18,O(N)也会超时,那么需要更快的算法,二分幂算法 和 快速幂算法。
而对于矩阵的高次幂,则将快速幂算法改进为矩阵快速幂算法。
最后讲一下,在大数情况下的乘法。

二分幂

要求 a^n,如果知道了 a^(n/2) 次方的话,再来个平方就可以了。
即
如果n是偶数,则A=a^(n/2) ; A=A*A.。
如果n是奇数 , 则A=a^((n-1)/2) ; A=a*A*A。
这就一下子差不多就节省了n/2-1次乘法运算
  那么按照这个思路就能运用分治的思想,那么复杂度就有原来的O(n),降低为O(lgn)。

long long int pow(int a,int n)//求a的n次幂
{
    if (n==0)
        return 1;
    if (n==1)
        return a;
    long long int ans=pow(a,n/2);//从函数的功能区理解递归
    ans*=ans;
    if (n%2==1)
        ans*=a;
    return ans;
}

快速幂算法

快速幂 , 矩阵快速幂 在算大指数次方时是很高效的,他的基本原理是二进制。快速乘也是用了二进制。

大家首先要认识到这一点:任何一个整数N,都能用二进制来表示。。
那么对于a^n , n一定可以用二进制表示。
比如a^156,而156(10)=10011100(2)
那么
A= a156=a10011100
= a27∗1+26∗0+25∗0+24∗1+23∗1+22∗1+21∗0+20∗0
= (a27∗1)∗(a26∗0)∗(a25∗0)∗(a24∗1)∗(a23∗1)∗(a22∗1)∗(a21∗0)∗(a20∗0)
我们就按照这个公式来求解 a156 ,原来要进行156-1=155次乘法运算,现在的差不多运算次数就是他 二进制的长度*二进制中1的个数=8*4=24次

long long int fun( int a, int b ) 
{
    long long int r = 1;
    int base = a;
    while( b != 0 ) 
    {
        if(b & 1)//判断奇偶性
        {
            r *= base;

        }
         base *= base; //注意:a^{2^7}=a^{2^6} * a^{2^6} ,而不是 a^{2^7}=a^{2^6} * a ,所以这是对的。
        b /= 2;//与b=b>>1相同
    }
    return r;
}

矩阵快速幂算法

可能你会问了这个算法有什么用呢?其实用的更多是使用矩阵快速幂,算递推式,注意是递推式 ,比如 f(n)=a*f(n-1)+b*f(n-2),简单的如斐波那契数列的第一亿项的结果模上10000000后是多少你还能用递推式去,逐项递推吗?当然不能,这里就可以发挥矩阵快速幂的神威了,那斐波那契数列和矩阵快速幂能有一毛钱的关系?答案是有而且很大
对于f(n)=a*f(n-1)+b*f(n-2) ,
我们可以考虑矩阵这种数学工具,构造矩阵
这里写图片描述

这样求f(n),f(n-1) 就相当于求左边矩阵的n-2次幂。这个时候就可以用上面的快速幂来计算了。
代码与快速幂类似,只是实数乘法变成了矩阵乘法。用个函数写就行了。

粘贴一个求斐波那契数列f(n) 的代码

# include<cstdio>  
# include<cstring>  
using namespace std;  
#define NUM 50  
int MAXN,n,mod;  
struct Matrix//矩阵的类  
{  
    int a[NUM][NUM];  
    void init()           //将其初始化为单位矩阵  
    {  
        memset(a,0,sizeof(a));  
        for(int i=0;i<MAXN;i++)  
            a[i][i]=1;  
    }  
} A;  
Matrix mul(Matrix a,Matrix b)  //(a*b)%mod  矩阵乘法  
{  
    Matrix ans;  
    for(int i=0;i<MAXN;i++)  
        for(int j=0;j<MAXN;j++)  
        {  
            ans.a[i][j]=0;  
            for(int k=0;k<MAXN;k++)  
                ans.a[i][j]+=a.a[i][k]*b.a[k][j];  
            ans.a[i][j]%=mod;  
        }  
    return ans;  
}  

Matrix add(Matrix a,Matrix b)  //(a+b)%mod  //矩阵加法  
{  
    int i,j,k;  
    Matrix ans;  
    for(i=0;i<MAXN;i++)  
        for(j=0;j<MAXN;j++)  
        {  
            ans.a[i][j]=a.a[i][j]+b.a[i][j];  
            ans.a[i][j]%=mod;  
        }  
    return ans;  
}  

Matrix pow(Matrix a,int n)    //(a^n)%mod  //矩阵快速幂  
{  
    Matrix ans;  
    ans.init();  
    while(n)  
    {  
        if(n%2)//n&1  
            ans=mul(ans,a);  
        n/=2;  
        a=mul(a,a);  
    }  
    return ans;  
}  

Matrix sum(Matrix a,int n)  //(a+a^2+a^3....+a^n)%mod// 矩阵的幂和  
{  
    int m;  
    Matrix ans,pre;  
    if(n==1)  
        return a;  
    m=n/2;  
    pre=sum(a,m);                      //[1,n/2]  
    ans=add(pre,mul(pre,pow(a,m)));   //ans=[1,n/2]+a^(n/2)*[1,n/2]  
    if(n&1)  
        ans=add(ans,pow(a,n));          //ans=ans+a^n  
    return ans;  
}  

void output(Matrix a)//输出矩阵  
{  
    for(int i=0;i<MAXN;i++)  
        for(int j=0;j<MAXN;j++)  
            printf("%d%c",a.a[i][j],j==MAXN-1?'\n':' ');  
}  
int main()  
{  
    freopen("in.txt","r",stdin);  
    Matrix ans;  
    scanf("%d%d%d",&MAXN,&n,&mod);  
    for(int i=0;i<MAXN;i++)  
        for(int j=0;j<MAXN;j++)  
        {  
            scanf("%d",&A.a[i][j]);  
            A.a[i][j]%=mod;  
        }  
    ans=sum(A,n);  
    output(ans);  
    return 0;  
}  

快速乘

求a*b%m , 当a*b结果很大,乘完后可能会移除。
可以用二进制来实现快速乘算法。
以前十进制的乘法是: 123*567=123*5*100 + 123*6*10 + 123 * 7 * 1
这里100,10, 100 都是十进制 的进制位数。那么如果考虑二进制的话,我们任选其他任意二进制数,就有
1001101∗11010=1001101∗24∗1+1001101∗23∗1+1001101∗22∗0+1001101∗21∗1+1001101∗20∗0
我们对上面的每一个加项进行取模,在加起来,就不会溢出了。

long long int fun(long long int a ,long long int b , long long int m)
{
    int sum=0;
    int k=1;
    while(b)
    {

        if(b&1)
        {
            sum=(sum+a*k)%m;
        }
        k=(k*2)%m;
        b=b/2;
    }
}

引用原句
在我就说下我对二进制的感想吧:
我们在做很多”连续“的问题的时候都会用到二进制将他们离散简化
1.多重背包问题
2.树状数组
3.状态压缩DP
……………还有很多。。。究其根本还是那句话:化连续为离散。。很多时候我们并不是为了解决一个问题而使用二进制,更多是时候是为了优化而使用它。所以如果你想让你的程序更加能适应大数据的情况,那么学习学习二进制及其算法思想将会对你有很大帮助。

树莓派4B玩转ROS2 Humble:Ubuntu Desktop一键安装与配置教程 本文详细介绍了在树莓派4B上安装和配置ROS2 Humble的完整教程,包括硬件准备、Ubuntu Desktop系统安装、一键部署ROS2、网络配置优化以及常见问题解决方案。通过简化安装流程和性能调优技巧,帮助开发者快速搭建机器人开发环境,充分发挥树莓派4B在ROS2应用中的潜力。 阅读详情

相关推荐

即插即用!5分钟为你的SNN模型添加频谱注意力(DCT-SA模块实战)

本文介绍了如何为脉冲神经网络(SNN)快速集成即插即用的DCT-SA频谱注意力模块。该模块利用离散余弦变换(DCT)在频率域自适应加权特征,能有效提升模型对纹理、边缘的感知能力,并在CIFAR10-DVS等数据集上实现分类精度提升与脉冲发放率下降。文章以SpikingJelly框架和ResNet19为例,提供了详细的代码实现、集成步骤及参数调优实战指南。

kotlin6android的博客 609

快速幂算法详解

快速幂算法详解 前言 首先考虑这么一个问题 {% note info %} 给定三个正整数 a, b, m(a < 10910^9109,b < 10910^9109,1 < m < 10910^9109),求 aba^bab % m。 {% endnote %} 对于这个问题,只要写一个简单的循环就能够搞定 // 普通求幂 long long QuickPow(long long a, long long b, long long m) { long long ans =

Lamours的博客 1988

不刷机!Jetson AGX Orin无损更新内核与设备树的两种安全方法(附备份恢复脚本)

本文详细介绍了Jetson AGX Orin在不刷机的情况下安全更新内核与设备树的两种方法,包括extlinux.conf动态加载和分区精准刷新方案。通过备份恢复脚本和工业级灾备方案,确保零数据丢失,适用于边缘AI和机器人等关键场景。

weixin_40192258的博客 310

快速冥

#include int main() { long int n,m,a,sum=1; scanf("%ld%ld",&m,&n); while(m!=0) { if(m & 1)  sum*=n; n*=n; m/=2; } printf("%ld\n",sum); return 0; }

harderting的博客 906

【无人机设计与控制】基于PID控制的四旋翼无人机系统Matlab仿真

本文设计并仿真了基于PID控制的四旋翼无人机系统。首先,建立了四旋翼无人机的数学模型,涵盖了无人机的动力学和控制系统。通过PID控制器对四旋翼的姿态和位置进行控制,以实现其稳定飞行。使用MATLAB/Simulink对该系统进行仿真,验证了PID控制算法在四旋翼控制中的有效性。仿真结果表明,PID控制能够较好地调节四旋翼的飞行姿态,并有效抑制外部干扰,使得无人机能够保持平稳飞行。

2401_84610415的博客 1804

IC 时钟设计核心问题与高质量系统设计指南(附源码)

本文深入探讨了IC时钟设计的核心问题与高质量系统设计方法。时钟系统作为IC的"心脏",其性能直接影响时序稳定性、功耗效率和可靠性。文章从五个维度展开分析:时钟源选择与性能匹配、时钟分配网络设计、抖动抑制、多时钟域管理和功耗优化。针对高质量时钟系统设计,提出了时钟源优化、时钟树结构优化、干扰抑制与仿真验证等具体方法。同时,系统阐述了时钟与复位的协同设计关系,强调异步复位同步释放等技术的重要性。文章还总结了高质量IC系统设计的综合要点,包括电源/信号完整性、时序功耗平衡、可靠性设计及全流程验

Open 1060

快速矩阵乘法的算法实现

快速矩阵乘法

qq_42327795的博客 1万+

复合材料RVE建模与力学性能分析实战指南

代表体积元(RVE)建模是复合材料多尺度分析的核心技术,通过建立微观结构与宏观性能的定量关联,可准确预测材料力学行为。本文基于ABAQUS平台,详细解析三材料(纤维/基体/界面相)RVE建模全流程,包括参数化几何建模、周期性网格划分策略、材料属性定义技巧等关键技术环节。针对碳纤维增强环氧树脂等典型复合材料,提供网格控制参数建议和材料参数参考表,并重点说明周期性边界条件的实现方法与验证标准。通过Python脚本自动化处理和优化分析流程,可显著提升计算效率,为复合材料设计提供可靠仿真依据。

weixin_34062469的博客 549

Pow(x,n)快速冥算法

快速冥算法

喻师傅的学习笔记 735

【麒麟系统】Rsync文件复制与同步工具

本文摘要: Rsync是一款Linux/Unix系统标配的高效文件同步工具,支持增量传输、SSH加密、断点续传等核心功能,相比SCP具有显著优势。文章详细解析了Rsync的五种标准语法格式和常用参数组合,重点介绍了本地同步、远程SSH同步(推送/拉取)的实操方法,并提供了密钥免密登录配置方案。针对企业运维场景,还讲解了文件过滤、镜像同步(--delete)、迁移同步(--remove-source-files)、空运行预校验(--dry-run)等高级功能,以及带宽限速等优化技巧,帮助用户安全高效地完成各类

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 999

基于深度学习YOLOv8的商品识别系统(深度学习 + UI界面 + 训练数据集 + Python代码)

如果使用自定义数据集,可以通过图像标注工具如LabelImg来标注每个商品的类别和边界框,并保存为YOLO格式的文本文件。bash复制编辑/dataset/images/train/val/labels/train/val这样,我们就准备好了数据集,可以开始训练YOLOv8模型。本文介绍了如何使用YOLOv8构建一个商品识别系统,包括从数据准备到模型训练,再到UI界面的开发。通过深度学习技术,尤其是YOLOv8的高效目标检测能力,我们能够快速实现商品识别并集成到实际应用中。

YOLO 303

并行实现快速排序

1:环境:Linux 系统CentOS 7。openMP 快排

weixin_56273009的博客 2003

C# 与 PaddleOCR:一行代码实现高效图片文字识别的实战指南

本文介绍了如何使用 PaddleOCRSharp 进行图像文字识别,涵盖了从环境准备到高级功能的完整流程。首先,通过 NuGet 安装 PaddleOCRSharp 并下载预训练模型。接着,展示了单张图片识别的最小化示例和详细实现,包括模型配置、图片预处理和结果输出。进阶功能部分介绍了多语言和竖排文本识别的实现方法。此外,文章还提供了 WinForms 图形界面开发的完整示例,展示了如何通过界面加载图片、执行识别并展示结果。最后,探讨了批量处理优化策略,如并行处理多张图片以提高性能。通过这些步骤,开发者可以

墨夶的博客 1004

快速幂,矩阵快速幂,二分幂,快速乘

快速幂,矩阵快速幂,二分幂,快速乘

李典金 566

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

POJ 3233 Matrix Power Series 矩阵快速幂+二分求和

矩阵快速幂,请参照模板 http://www.cnblogs.com/pach/p/5978475.html 直接sum=A+A2+A3...+Ak这样累加肯定会超时,但是 sum=A+A2+...+Ak/2+A(k/2)*(A+A2+...+Ak/2) k为偶数时; sum=A+A2+...+A(k-1)/2+A((k-1)/2)*(A+A2+...+A(k-1)/2)+Ak ...

weixin_34232617的博客 143

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

POJ-3233 Matrix Power Series

题意:给出n、k、m和n*n的矩阵,求S = A + A^2 + A^3 + … + A^k,结果modm。 思路: 构造一个矩阵 A I O I 自乘后 A^2 I+A O I 乘3次为 A^3 I+A+A^2 O I 直接二分幂。(神奇的构造~) 题目链接:http://poj.org/problem?id=3233 View Code 1 #includ...

bancaidun1539的博客 108

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数论(快速幂跟矩阵快速幂)

(A1B1+A2B2+ ... +AHBH)mod M. 高次幂取模 乘方取模问题  计算x的值, a^n=x(mod(m))。 显然 a^n = a*(a^n-1(mod(m)))(mod(m)). ans = 1; for(int i = 0 ; i < n ; i++) { ans *= a; ans %=m

多啦A梦也会有好多的烦恼 881

矩阵快速幂总结

第一部分:矩阵的基础知识1.结合性 (AB)C=A(BC).2.对加法的分配性 (A+B)C=AC+BC,C(A+B)=CA+CB .3.对数乘的结合性 k(AB)=(kA)B =A(kB).4.关于转置 (AB)'=B'A'.一个矩阵就是一个二维数组,为了方便声明多个矩阵,我们一般会将矩阵封装一个类或定义一个矩阵的结构体,我采用的是后者。第二部分:矩阵相乘矩阵相乘的规则:矩阵与矩阵相乘 第一个矩...

路途遥远,初心难忘,道阻且长,愿君走出半生,归来仍是少年 723

快速幂乘

快速幂乘用的是二分的思想 a^b%c,当b比较大时可将其分解 当b为偶数时,a^b%c=(a^(b/2)*a^(b/2))%c;当b为奇数时,a^b%c=(a^(b/2)*a^(b/2)*a)%c AOJ-569-乘的更快 http://icpc.ahu.edu.cn/OJ/Problem.aspx?id=569 赤裸裸的快速幂乘 #include #include #include

菜鸟的程序人生 5781

快速乘、快速幂和矩阵快速幂

O(1) 快速乘 首先看看最基本的乘法: #include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; cout << a * b << endl; return 0; } 如果题目需要求出的 a *b...

左云帆 407

快速幂与矩阵快速幂【入门+基础】

快速幂 如果我们要计算???????? mod p,我们首先能想到的便是for循环: int ans=1; for(int i=1;i<=b;i++) ans*=a; return ans%p; 下面我们来看看两个例子,想一想会出现什么奇葩结果呢? 奇葩结果1: 2100 mod 1000 = 0 奇葩结果2: 52????12 mod 1000 …… 那第一个奇葩结果就是 2^100 已经溢出了。 第二个结果我们能一眼看出来,就是循环次数太多了。所以说解决这个问题O(n)是不行的。 1

qq_45249273的博客 1011

矩阵快速幂

先贴一个博主写的,偷个懒先: 快速幂的思路就是: 设A为矩阵,求A的N次方,N很大,1000000左右吧。。。 先看小一点的,A的9次方 A^9 = A*A*A*A*A*A*A*A*A 【一个一个乘,要乘9次】 = A*(A*A)*(A*A)*(A*A)*(A*A) 【保持格式的上下统一,所以加上这句】 = A*(A^2)^4 【A平方后,再四次方,还要乘上剩下的一个A,要乘6...

Cheney的博客 938

矩阵乘法与矩阵二分幂

一、矩阵乘法 乘法运算: matrix matrixmult(matrix A,matrix B) { matrix res; res.n=A.n; res.m=B.m; memset(res.a,0,sizeof(res.a)); for(int i=0;i<res.n;i++) { for(int j=0;j<res.m;j++) { for(int...

qq_41706331的博客 532

线性代数 —— 矩阵快速幂

【概述】 矩阵快速幂利用矩阵的乘法与整数快速幂的结合,能够快速的算出n 阶方阵A 的 M 次幂 A^b,其结果仍是一个矩阵,无具体含义,在信息学竞赛中,矩阵快速幂常用于求解线性递推关系。 关于矩阵的基础知识:点击这里 关于线性递推关系:点击这里 【n*m 矩阵的快速幂】 struct Matrix{ LL s[N][N]; }; Matrix e;//单位矩阵E Matri...

Alex_McAvoy的博客 1647

数论基础——矩阵快速幂模板

1.矩阵简介: 2.单位矩阵: 3.矩阵的加减: 4.常数k与矩阵相乘: 5.矩阵与矩阵相乘: 矩阵乘矩阵就是要我们模拟线性代数中矩阵求矩阵的公式,新的矩阵的第一个数就等于矩阵A的第一行的每一个元素乘上矩阵B的每一列的元素相加起来得到,那么新的矩阵的第m个元素就等于矩阵A的m行的每一个元素乘以矩阵B的m列每一个元素相加即可。 Code: struct matrix { int n,...

ly's Blog 1077

算法技巧:矩阵快速幂

算法技巧:矩阵快速幂

闲余知道 1156
上一篇: nyoj ACM:zb的生日(DFS 递归 回溯)
下一篇: nyoj ACM:点的变换(矩阵运算)
丁磊_Ml
博客等级 码龄11年 95粉丝 139原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值