数学专题(2)、快速幂

矩阵快速幂专题(一) 最近闲来无事,准备集中精力刷一波数论与图论。矩阵快速幂是数论里面的重要组成部分,值得我好好学习一下。因为题目比较多,分析也比较多,所以将此专题分成几个部分。做完这一专题,可能会暂时转向图论部分,然后等我组合数学学得差不多了,再回过头来继续做数论题。 矩阵快速幂算法的核心思想是将问题建模转化为数学模型(有一些简单题目是裸的矩阵模型,但是大部分难题就是难在要构造矩阵,用矩阵方法解决问题),推倒递推式 阅读详情

嗯,今天是快速幂专题。


相信大家应该都会求幂,即求a^n.那么这个东西有什么可讲的呢?当然有!朴素的幂计算复杂度是O(n)的,而我们的快速幂则能够达到O(logn)级别。可能你会觉得线性复杂度已经够快了,但是在实际应用中,你就会发现快速幂的高效之处。

那什么是快速幂呢?

快速幂就是在计算a的b次方的时候,把b写成二进制和的形式。

比如说计算a^43,我们就可以把43写成二进制数101011,每一位乘以对应的权值,就变成了a^(2^0+2^1+2^3+2^5).

那么这么做有什么好处呢?我们的循环从原来的43次降为log(43)次,每次不再是n-=1而是n>>=1.这样就能大大降低复杂度了。

快速幂一般还可以搭配矩阵使用,成为矩阵快速幂。

我们在做矩阵乘法运算的时候,首先有个前提,就是矩阵A的列与矩阵B的行必须相同才能进行乘法运算。最后的结果C的行数等于A的行数,C的列数等于B的列数。C中某个元素等于A对应行向量与B对应列向量乘积之和。这种算法的时间复杂度为O(n^3).

实际上,在clrs里,介绍了一种O(n^2.81)复杂度的矩阵乘法,即Strassen算法,它的原理是利用分治,将矩阵分块,再计算分块矩阵的乘积,最后合并,在这儿不是重点表过不提,感兴趣的可以去看一下。

我们今天要将的是如何求矩阵的幂。我们可以很清楚地看到,如果用朴素矩阵乘法,复杂度会很令人厌恶,所以我们运用快速幂思想,将这个问题转化成了快速幂问题。矩阵快速幂有很多应用,例如给dp加速之类的,这儿我们讲一个最简单的应用。

想必大家都知道斐波那契数列(Fibonacci sequence)吧!她是数学史上最著名的数列之一,有着许多有趣的性质。那我们怎么计算第n项斐波那契数列是多少呢?我们至少有四种办法可以计算。

最朴素的计算方法就是递归计算。由于斐波那契数列的递推式是F(n)=F(n-1)+F(n-2)(n>2),所以我们可以递归计算F(n).但是这种方法的时间复杂度高达O(2^n),是无论如何不可能接受的。

我们可以使用非递归形式计算递推式,只要写一个一重循环就可以了。这种方法是线性复杂度,但仍不够好。

我们拥有一个常数复杂度的方法,就是计算它的通项公式。我们用特征方程与特征根求出通项公式直接计算,就可以把复杂度压缩到O(1),但是有个问题,这个整数数列的通项公式里含有大量的无理数,n一旦变大之后会对精度造成影响。

最后一种自然就是我们的矩阵快速幂。我们可以构造如下的矩阵递推式:

|Fn+1 Fn   |      | 1         1  |^n

                    = 

|Fn     Fn-1|      | 1          0 |    

这时候用到我们的矩阵快速幂就可以了。代码如下:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;

typedef long long ll;
const int mod=1e4;

struct mat{
    ll a[2][2];
};

mat mul(mat x,mat y){
    mat res;
    memset(res.a,0,sizeof(res.a));
    for(int i=0;i<2;i++)
        for(int j=0;j<2;j++)
            for(int k=0;k<2;k++)
                res.a[i][j]=(res.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
    return res;
}//矩阵乘法

void quickpow(int n){
    mat c,res;
    c.a[0][0]=c.a[0][1]=c.a[1][0]=1;
    c.a[1][1]=0;
    memset(res.a,0,sizeof(res.a));
    res.a[0][0]=res.a[1][1]=1;
    while(n){
        if(n&1)
            res=mul(res,c);
        c=mul(c,c);
        n>>=1;
    }//快速幂
    cout<<res.a[0][1]<<endl;
}

int main(){
    int n;
    while(cin>>n){
        if(n==-1) break;
        quickpow(n);
    }
    return 0;
}

【知识点】快速幂与矩阵快速幂 快速幂和快速矩阵的基本概念。 阅读详情

相关推荐

OpenCV实战:如何用Debevec算法搞定相机响应函数(附完整代码)

本文详细介绍了如何使用OpenCV实现Debevec算法计算相机响应函数(CRF),并应用于HDR图像合成。通过完整的代码示例和工程实践问题解决方案,帮助开发者掌握从原理到实现的关键步骤,提升高动态范围成像和计算机视觉任务的处理能力。

weixin_29061041的博客 229

【小航的算法日记】二分快速幂

目录一、概念二、模板三、例题题:50. Pow(x, n)解:题:372. 超级次方解:题:343. 整数拆分题:1969. 数组元素的最小非零乘积题:1808. 好因子的最大数目 内容摘自英雄哥,以下为Java版 一、概念 二分快速幂 二、模板 请看例题2 三、例题 题:50. Pow(x, n) 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn )。 示例 1: 输入:x = 2.00000, n = 10 输出:1024.00000 示例 2: 输入:x = 2.10000, n

文艺倾年的博客 1264

从Chimera到ChimeraX:科研绘图升级指南,让你的论文配图更专业

本文详细介绍了从UCSF Chimera升级到ChimeraX的科研绘图指南,帮助研究者提升论文配图质量。ChimeraX在渲染引擎、大分子处理能力和动画功能上具有显著优势,特别适合生命科学和结构生物学领域。文章涵盖材质设置、专业配色、工作流程和期刊适配等核心技巧,助力产出出版级分子可视化图像。

weixin_33670786的博客 928

2的幂次方(快速幂+递归)

题目 2的幂次方表示: 任何一个正整数都可以用2的幂次方表示。例如: 137=27+23+20 同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为: 2(7)+2(3)+2(0) 进一步:7=22+2+20(21用2表示) 3=2+20 所以最后137可表示为: 2(2(2)+2+2(0))+2(2+2(0))+2(0) 又如: 1315=210+28+2...

weixin_46274692的博客 3354

Vite与Webpack路径配置大不同:从Vue2迁移到Vue3必须知道的public目录使用技巧

本文详细解析了Vite与Webpack在public目录路径配置上的核心差异,为Vue2迁移到Vue3的开发者提供实用指南。重点对比了两种构建工具的资源处理逻辑,给出典型编译警告的解决方案,并分享路径适配表与高级优化技巧,帮助开发者高效完成技术栈升级。

weixin_30836759的博客 485

关于石墨烯费米能级和偏置电压之间的关系问题

石墨烯费米能级与电压的关系问题

qq_37946542的博客 3514

2的n次方对照表

2的1次方:2 2的2次方:4 2的3次方:8 2的4次方:16 2的5次方:32 2的6次方:64 2的7次方:128 2的8次方:256 2的9次方:512 2的10次方:1024 2的11次方:2048 2的12次方:4096 2的13次方:8192 2的14次方:16384 2的15次方:32768 2的16次方:65536 2的17次方:131072 2的18次方:262144 2的19...

Rand Tsui 38万+

别再说Fortran过时了!手把手教你用VS Code + gfortran搭建现代开发环境(2024版)

本文打破Fortran过时的刻板印象,详细介绍如何利用VS Code和gfortran搭建现代开发环境。从编译器安装、VS Code插件配置到项目结构标准化,提供完整的2024版跨平台解决方案,并展示Fortran 2023标准的协程、并行计算等现代特性,助力科学计算与高性能开发。

weixin_42629815的博客 239

2的n次幂快速求法

从7的最低位开始,如果当前位为1,那么乘上当前位对应的二进制转10进制值。再一个,如果不用高精度,那么对答案取模。比如求2的7次方,7转换为二进制就是。

m0_60343477的博客 2178

解决Windows 10安装语言包时遇到的0x800F0954错误

在安装Windows 10操作系统的语言包时,如果遇到错误代码0x800F0954的提示,这无疑会让许多用户感到困惑和无助。这个错误通常意味着在安装过程中遇到了一些阻碍,导致无法正常完成语言包的安装。本文将为大家详细解析这个错误代码0x800F0954,并提供一系列有效的解决方法,帮助大家顺利安装所需的语言包。

nntxthml的博客 3793

Zynq/ZynqMP PL端以太网实战:手把手教你用GMII to RGMII IP和EMIO打通网络(附KSZ9031 PHY驱动修改)

本文详细介绍了在Zynq/ZynqMP平台上使用GMII to RGMII IP核和EMIO接口实现PL端以太网通信的全栈开发流程,特别针对KSZ9031 PHY芯片提供了定制化驱动修改方案。内容涵盖硬件设计、Vivado配置、裸机驱动开发、Linux系统集成及实战调试技巧,帮助开发者高效解决工业控制和边缘计算中的以太网连接问题。

weixin_30642561的博客 582

二分快速幂

对于a^b,普通的求法是用一个循环一直乘b个a,这样的方法对于某些题目来说可能显得比较慢。 二分快速幂是一种利用b的二进制特征来快速求a^b的算法。 例如: a = 2, b = 35 则b的二进制表示形式为100011 则 a^b = (2^32) * (2^2) * (2^1) 有了这样的思路之后,就不用循环b次了。 假设b的二进制表示有n位,从后往前依次为第1-n位,初始结果为

Shuyu Fang 5299

HarmonyOS ArkTS开发实战:用Axios封装一个通用的网络请求工具类(附完整代码)

本文详细介绍了如何在HarmonyOS ArkTS开发中利用Axios封装一个通用的网络请求工具类,涵盖架构设计、核心模块实现、UI状态联动及高级功能扩展。通过单例控制器、拦截器链配置和Token自动刷新机制,提升网络请求的稳定性和可维护性,适用于各类HarmonyOS应用开发场景。

weixin_30772105的博客 491

数学专题——快速幂 & 唯一分解定理

数学专题——快速幂 & 唯一分解定理

as_asdf的博客 1160

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【专题】—【数学】—【矩阵快速幂】

参考文章: http://blog.youkuaiyun.com/shiwei408/article/details/8818386

ACer-TomatoFish 4886

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Java】数学专题训练

A - A^B Mod C B - 逆元 C - 判决素数个数 方法一:埃氏筛法 方法二:区间筛法 D - 矩阵乘法 E - Bash游戏 F - 取石子游戏 G - Matches Game H - 互质数的个数(一) I - Sumdiv J - The Lottery K - 组合数问题 L - 同余方程...

m0_51226527的博客 2435

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

快速幂和矩阵快速幂 数学原理+例题 详解

快速幂取模算法快速幂的数学原理代码 快速幂的数学原理 比如a^156,而156(10)=10011100(2) 我们就按照这个公式来求解a^156,原来要进行156-1=155次乘法运算,现在的差不多运算次数就是他 二进制的长度二进制中1的个数=84=24次 代码 普通快速幂的模板: int fastpow(int base,int n,int mod){ int ans=1; while(n){ if(n&1) ans*=base%mod; base*=base; n>&g

偶尔想看云飞的博客 587

Python中数学问题2-快速幂

详解了快速幂的相关知识点

a72024791的博客 939

快速幂算法

本篇文章详细介绍了快速幂的基本思想和实现算法。包括循环快速幂求解和递归分治快速幂求解。

xiaoxi_hahaha的博客 2321

数学专题:同余定理、gcd与lcm、中位数定理、筛法、快速幂等

数学专题:同余定理、gcd与lcm、中位数定理、筛法、快速幂等

qq_44709990的博客 1142

数学知识:快速幂

文章目录前言一、快速幂二、例题,代码AcWing 875. 快速幂本题解析AC代码AcWing 876. 快速幂求逆元本题解析AC代码三、时间复杂度 前言 复习acwing算法基础课的内容,本篇为讲解数学知识:快速幂,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。 一、快速幂 所谓快速幂就是用很短的时间去解决a^b % c,解决这类的问题,最传统的做法就是循环暴力枚举,但是一旦我们的范围在1e8+,这种暴力的枚举显然会TLE,这也是快速幂算法的独到之处. 二、例题,代码 AcWing 8.

佛系更新 1105

快速幂详解

快速幂的分析,思考,解析以及如何动手用代码进行实践。

每行代码都热烈滚烫。 1454

ch02 - 数学专题

Onlnlnn))

u011247863的博客 859

C数学基础专题

数学专题 数学是程序竞赛中常见的题目,并且很容易和其他题目一起出,作为基础,还是得尽快掌握。 高精度计算 洛谷P1601 A+B高精度 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #include <list> #include <map> #include <set>

qq_48344603的博客 975

数学/数论专题-学习笔记:矩阵小记#2(矩阵快速幂)

数学/数论专题-学习笔记:矩阵小记#2(矩阵快速幂)1. 前言2. 矩阵快速幂3. 例题4. 总结 1. 前言 本篇文章是作者学习矩阵时候的一些笔记。 注意作者是个 OIer,因此并不会涉及到专业的线性代数知识(或者说是极少)。 前置知识:矩阵定义+矩阵乘法,正整数快速幂。 2. 矩阵快速幂 我们知道复数(或者简单点,实数)中有幂的定义: 对于 a∈Ca \in Ca∈C,将 a×a×...×aa \times a \times ... \times aa×a×...×a(共 nnn 个 aaa)记作 an

Plozia 的小窝 332

数学---快速幂

1. 快速幂概念: 快速幂以及扩展的矩阵快速幂,由于场景比较 常见,因此竞赛常出现。 问题:高效的计算a的n次幂,这里n很大 分析:假如a=10,n=9,这样的情况就连自带高精度的Java也无法处理,一是数字太大,二是计算时间很长。 使用快速幂解法1:先算a²,之后再算(a²)²,巧妙的使用了分治法,时间复杂度为O(㏒₂n) 上代码: int fastPow(int a,int n){ if(n==1) return a; int temp=fastPow(a,n/2);/

Mr顺 752
上一篇: 数学专题(1)、基础数论
下一篇: 图论(1)、最短路径
Messhiro
博客等级 码龄9年 4粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值