快速幂

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


超级详细的基础算法和数据结构合集:
https://blog.youkuaiyun.com/GD_ONE/article/details/104061907

摘要

本文主要介绍快速幂算法,快速幂虽然代码简单,但是往往会与其他算法相结合,很重要。

引言

当我们计算 n k n^k nk时,常用的做法是对 n n n连乘 k k k次, 但如果 k k k特别大,假如 k = 1 e 6 k = 1e6 k=1e6, 如果仍然对 n 连 乘 1 e 6 n连乘1e6 n连乘1e6次的话,时间消耗就太大了。那么我们如何
在短时间内求出一个数的 k k k次方呢。

求 n k n^k nk

我们可以考虑对朴素方法进行优化。
1:当我们计算得到 n 2 n^2 n2时, 我们可以直接使用 n 2 n^2 n2连乘 k / 2 k/2 k/2次。 这样做时间复杂度变为了 O ( n / 2 ) O(n/2) O(n/2)
2:有人可能会问,我们既然可以用 n 2 连 乘 k / 2 n^2连乘k/2 n2连乘k/2次,为什么不用 n 4 n^4 n4连乘 k / 4 k/4 k/4次呢,当然可以这样做之后时间复杂度变为了 O ( n / 4 ) O(n/4) O(n/4);
3 : 我们当然也可以 n 8 , n 16 . . . 连 乘 n^8,n^{16}...连乘 n8,n16...连乘
4:所以我们可以用: n 1 ∗ n 2 ∗ n 4 ∗ n 8 . . . n p n^1 * n^2 * n^ 4 *n^8...n^p n1∗n2∗n4∗n8...np
快速幂就是类似的思想。

快速幂

先举个例子:
3 11 = 3 1 ∗ 3 1 ∗ 3 1 ∗ 3 1 ∗ 3 1 ∗ 3 1 ∗ 3 1 ∗ 3 1 ∗ 3 1 ∗ 3 1 ∗ 3 1 3^{11} = 3^1* 3^1 *3^1*3^1*3^1*3^1*3^1*3^1*3^1*3^1*3^1 311=31∗31∗31∗31∗31∗31∗31∗31∗31∗31∗31
11 的 二 进 制 表 示 为 : 1011 11的二进制表示为: 1011 11的二进制表示为:1011
怎么把一个二进制数转化为十进制数呢?
计算过程是: 11 = 1 ∗ 2 0 + 1 ∗ 2 1 + 0 ∗ 2 2 + 1 ∗ 2 3 = 1 + 2 + 0 + 8 11 = 1*2^0 + 1 * 2^1 + 0 * 2^2+ 1*2^3 = 1 + 2 + 0 + 8 11=1∗20+1∗21+0∗22+1∗23=1+2+0+8
我们可以发现:如果将最开始求 3 11 3^{11} 311变为: 3 11 = 3 1 ∗ 3 2 ∗ 3 0 ∗ 3 8 3^{11} = 3^1 * 3^2 * 3^0*3^8 311=31∗32∗30∗38, 计算量将会大大减少,原本需要乘11次,现在只需要乘4次。

另外,我们需要判断二进制数的某一位是不是0,我们可以使用位运算方便的解决该问题。

快速幂代码:

public static int qmi(int a, int b){ //求 a^b
	int res = 1; // res保存结果
	while(b != 0){
		if((b & 1) == 1){ //如果k的二进制数的最后一位是 1。 比如1011 & 1 = 1
			res = (res * a) % mod;//取模, 防止结果溢出。
		}
		a = a * a % mod;//得到 a^1, a^2, a^4, a^8, .....
		b = b >> 1; //将b右移一位,去掉最低位。为了开始判断下一位。
	}
	return res;
}

代码很简单,多看几遍就懂了。如果对位运算不熟悉可以翻看之前的博客。

一文彻底搞懂快速幂(原理、实现、矩阵快速幂) 前言 大家好,我是bigsai,之前有个小老弟问到一个剑指offer一道相关快速幂的题,这里梳理一下讲一下快速幂! 快速幂是什么? 顾名思义,快速幂就是快速算底数的n次幂。你可能疑问,求n次幂算n次叠乘不就行了?当n巨大无比时候,如果需要末尾有效尾数值等信息这个可能超出计算机运算范围。 有多快? 快速幂时间复杂度为 O(log₂n), 与朴素的O(n)相比效率有了极大的提高(int 范围10位长度数字32次之内就能搞定,long 范围20位长度数字64次之内也能搞定,你看有多快)。 用的多么? 快速幂属于数 阅读详情

相关推荐

算法基础 - 数论 | 快速幂、矩阵快速幂、快速乘

文章目录一、快速幂快速幂模版(迭代,非递归)快速幂模版(递归)AcWing 875. 快速幂LeetCode 50. Pow(x, n)(快速幂 C++)LeetCode 372. 超级次方二、矩阵快速幂矩阵快速幂模版例题:求斐波那契数列的第 1e9 项例题: S=A+A2+A3+…+AkS = A + A^2 + A^3 + … + A^kS=A+A2+A3+…+AkREFERENCES 一、快速幂 快速幂:快速计算某个数的幂次( ana^nan ) 快速幂时间复杂度为 O(logn)O(logn)O(l

捡起一束光的博客 1964

快速幂 矩阵快速幂

前言:好像没啥好写的,链接可能还没有更新完 快速幂 快速幂,用于解决当n很大时的情况。通常与取模同时应用。 用最笨的方法求,即。时间复杂度为,而快速幂(附带取模),可以将时间复杂度降低为。 利用倍增的思想,例如,等于,又等于,即,如果n为奇数,,那么换成代码就是: ll Powermod(ll a,ll b) { ll ans=1; a=a%mod; while(b>0) { if(b%2==1) ans=(ans*a)%...

issey的博客 8276

俄罗斯方块 C++控制台版

一、创建方块 wstring tetromino[7]; tetromino[0].append(L"..X...X...X...X."); // Tetronimos 4x4 tetromino[1].append(L"..X..XX...X....."); tetromino[2].append(L".....XX..XX....."); tetromino[3].append(L"..X..XX..X......"); tetromino...

一只大鸽子的博客 1625

快速幂和矩阵快速幂详解+模板

1.快速幂 一般的,我们都知道求只需要连续乘3次2就能得到,那么等于多少呢?其实这个一很简单,不就是13个2相乘吗,连续乘13次2就行了。那么,呢? 是不是要连续乘100次、1000次,我们将这类问题归结为求。那么当b很大的时候,是很浪费时间的,往往会造成超时,那有没有更快的计算方法呢?当然了,接下来就是这篇文章的重点:快速幂。 我们以b=13为例,将b表示为二进制:那么:那么我们观察只要b的...

ityanger的技术栈 1万+

STM32异常与中断过程详解

1. 异常与中断概念引入 异常主要是指来自CPU内部的意外事件,比如执行了未定义指令、算术溢出、除零运算等发生在CPU内部的意外事件,这些异常的发生,会引起CPU运行相应的异常处理程序;中断一般来自硬件(如片上外设、外部I/O输入等)发生的事件,当这些硬件产生中断信号时,CPU会暂停当前运行的程序,转而去处理相关硬件的中断服务程序。但无论是异常还是中断,都会引起程序执行偏离正常的流程,转而去执行异常/中断的处理函数。 下面对异常和中断的介绍,如果中断信号的产生原因来自CPU内部,则称之为异常;如果中断信号来

luobeihai的博客 1万+

贴片二极管SOD封装详解:SOD-123/323/523尺寸焊盘设计要点

表面贴装技术中,二极管封装尺寸直接决定PCB布局与焊接可靠性。SOD封装作为小外形二极管的主流形态,其SOD-123、SOD-323、SOD-523三种规格分别对应不同的功耗与占板面积权衡。理解封装尺寸、焊盘设计计算逻辑和钢网开窗原理,是避免立碑、虚焊等工艺缺陷的关键。在可穿戴设备、电源保护等空间受限场景中,合理选择封装不仅能优化散热路径,还能提升量产良率。本文从焊盘计算、工艺要点到选型策略,全面解析SOD封装的工程实践。

weixin_42520780的博客 307

快速幂和矩阵快速幂

前言 新年第一篇技术类的文章,应该算是算法方面的文章的。看标题:快速幂和矩阵快速幂,好像挺高大上。其实并不是很难,快速幂就是快速求一个数的幂(一个数的 n 次方)。 快速幂 首先,来看一下幂,我们知道,假设有一个整数 x, 如果我们要求出 x^n (即为 x 的 n 次方)的值,最容易想到的办法就是循环相乘(这里不考虑整数溢出的情况下),于是我们很容易就可以写出下面的代码: ...

指点 4679

Proteus仿真AT89C51驱动DHT11:温湿度数据采集与LCD1602显示的5个调试坑点总结

本文总结了在Proteus仿真环境下使用AT89C51驱动DHT11温湿度传感器并通过LCD1602显示的5个常见调试坑点,包括DHT11时序问题、LCD1602初始化错误、数据校验失败、仿真特有差异及系统稳定性问题,提供了详细的解决方案和优化代码示例,帮助开发者高效完成温湿度采集项目。

weixin_30335575的博客 356

快速幂+矩阵快速幂(总结+例题)

1.快速幂 以求a的b次方来介绍: 首先把b转换成二进制数 该二进制数第i位的权为 2^i - 1 . 比如 : 11的二进制是1011 11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1 所以假设我们要求a^b,那么其实b是可以拆成二进制的,该二进制数第i位的权为2^(i-1),例如当b==11时           a^11=a^(2^0+2^1+2^3)模板: ll p...

red_red_red的博客 1万+

Gamit10.71添加新的天线类型

添加新的天线类型需要涉及到四个文件:antmod.dat,rcvant.dat,guess_rcvant.dat,hi.dat。 注意:格式要一致!!! 举例说明,我要添加一个JCA229的天线(带JCAD天线罩),对应接收机使用的是南方的South Net-S9。

Penny的博客 2713

机器人环境仿真软件:Gazebo_(6).传感器仿真

通过 Gazebo 和 ROS,我们可以方便地配置和使用多种传感器,进行机器人环境的仿真和调试。传感器仿真不仅帮助我们验证和测试机器人的感知能力,还可以在真实部署前发现和解决潜在的问题。本节详细介绍了如何在 Gazebo 中配置激光雷达、摄像头、IMU、声纳和 GPS 传感器,并展示了如何在 ROS 中接收和处理这些传感器数据。此外,还介绍了多传感器融合的基本方法和调试工具,希望这些内容能对你的机器人仿真工作有所帮助。

kkchenjj的博客 1389

备战蓝桥杯--快速幂、矩阵快速幂、逆元

矩阵快速幂快速幂实现方法递归实现思路和方法非递归实现快速幂快速幂的应用一、费马小和快速幂求逆元二、矩阵快速幂 快速幂实现方法 待解决的基本问题: 给你a,b,p 求a^b % p , a,b,p<=10^9 此时a b p均在int 范围内,用int表示 如果用简单循环累乘的方法,时间复杂度为O(N),基本上就运行超时了 int ans=1; for(int i=0;i<b;i++) { ans=ans*a%p; //循环累乘,会超时 } 快速幂就

m0_58642116的博客 7315

echarts 饼图(加载进度条动画效果)

1、外侧动画细线效果运动“custom”自定义系列中“renderItem”属性来实现,动态修改起始角度和终止角度。2、圆环使用" pie "类型添加两个data值来画百分比圆环,动态修改data中的值。

God's asylum的博客 1631

快速幂,矩阵快速幂

分清一维k阶和k维一阶下面这个是k维一阶,依赖同级别好几个维度,但是只依赖一个同级别k维一阶是每个对应每一列竖着的3.矩阵的幂不同,一维k阶是n-(k-1)的幂,k维1阶是n-1次幂注意:vector一定要用传引用作为参数,否则会很慢!!!

2401_87050480的博客 1747

电容式三点式振荡电路/电感式三点振荡电路基础知识及Multisim电路仿真

摘要:三极管振荡电路利用放大特性与正反馈实现自激振荡,需满足巴克豪森条件(增益≥1,相位匹配)。核心由放大级、反馈网络、选频网络和稳幅环节构成。主要分为三类:1)LC/RC正弦波振荡电路(如电容三点式、电感三点式),输出高频/低频正弦波;2)多谐振荡电路,通过电容充放电产生方波;3)张弛振荡电路,生成锯齿波等。设计需关注相位匹配、增益控制和元件适配。LC振荡频率由谐振参数决定,RC振荡由时间常数控制。稳幅机制通过非线性或主动元件维持等幅输出。该电路在信号发生、时钟源等领域有广泛应用。

XU157303764的博客 2039

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

快速幂或者矩阵快速幂

快速幂或者矩阵快速幂在算指数时是很高效的,他的基本原理是二进制,下面的A可以是一个数也可以是一个矩阵(本文特指方阵),若是数就是快速幂算法,若是矩阵就是矩阵快速幂算法,用c++只需把矩阵设成一个类就可以,然后重载一下乘法就可以,注意为矩阵是则ANS=1,应该是ANS=E,E是单位矩阵,即主对角线是1其余的部分都是0的特殊方阵了。  举个例子若你要算A^7你会怎么算一般你会用O(N)的算法A^7=

柯安的专栏 1万+

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

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

快速幂与矩阵快速幂

快速幂与矩阵快速幂

Mr_huoge的博客 744

老版QQ原生表情gif动态

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

矩阵快速幂

昨天晚上矩阵小王子给我们讲了一下矩阵快速幂,学习了一下,

大神养成中..... 2万+

快速幂【快速幂】

不得不说,快速幂真的很爱出题。今天又做到了,get到几个新点。特此记录。当然了,做法没有任何差别 2、补一下取余的公式 3、关于分式的取余 今天遇到的问题是:如果c并不是质数,那么就不好用上面两种方法(如:上帝造裸题的七分钟)。今天遇到的这题是:快速求解斐波那契数列的前n项。当然在时间空间足够的情况下,直接上数组就行。但是在比赛中,时间有限,而空间也仅支撑到106次方,对于动不动1018的测试点真的伤不起。解法:矩阵快速幂。(所以在这里提是因为:明明之前都写过了,就下面例题里面那个,但是太久了,而且看快

ebatudou的博客 553

整数快速幂 & 快速幂取模

整数快速幂 & 快速幂取模快速幂a^b^的朴素算法快速幂的原理快速幂【代码】快速幂取模幂取模的朴素的实现快速幂取模原理快速幂取模【代码】矩阵快速幂矩阵快速幂【代码】例题P1226 【模板】快速幂||取余运算P3390 【模板】矩阵快速幂 快速幂 所谓的快速幂,其目的是为了快速求幂,将时间复杂度从O(n)朴素算法的降到O(logn)。 假如现在要求ab,按照朴素算法,就是将a连乘b次,时间复杂度为O(b),即O(n)级别。 ab的朴素算法 // O(n) #include<cstdio>

qq_43232556的博客 1114

数论 —— 快速幂

【概述】 快速幂就是利用二进制的性质来快速计算底数的 n 次幂,时间复杂度为 O(log₂N), 与朴素的 O(N) 相比效率有了极大的提高。 但有时指数十分大,利用高精来写可能会超时,此时就需要十进制快速幂。 【求位数公式】 有时仅要求求 2 的 n 次幂的位数,这里有一个神奇的求位数公式:floor(log(2)/log(10)*n+1) double res=n*log10(2)...

Alex_McAvoy的博客 1592

快速幂+快速幂经典例题

快速幂取模算法所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余)。在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快、计算范围更大的算法,产生了快速幂取模算法。我们先从简单的例子入手:求a^b mod c 算法1.直接设计这个算法: int ans = 1; for(int i = 1;i<=b;i++) { ans = ans * a; }

8725

从快速幂到矩阵快速幂入门

个人博客链接: 从快速幂到矩阵快速幂入门 快速幂 假设大家已经快忘记了快速幂这个东西 一般对于aba^bab我们只需要连续乘bbb次aaa就能得到答案了: 例如 232^323只需要连续乘333次222即可,23=2∗2∗22^3=2*2*223=2∗2∗2 2132^{13}213只需要连续乘131313次222即可,213=2∗2∗2∗2∗2∗2∗2∗2∗2∗2∗2∗2∗22^{1...

nuoyanli的博客 1687

矩阵快速幂总结

基础知识:(会基础的直接看应用部分)(1)矩阵乘法简单的说矩阵就是二维数组,数存在里面,矩阵乘法的规则:A*B=C其中c[i][j]为A的第i行与B的第j列对应乘积的和,即:代码:const int N=100; int c[N][N]; void multi(int a[][N],int b[][N],int n)//n是矩阵大小,n&lt;N { memset(c,0,sizeof c...

努力 4万+
上一篇: 素数筛法详解:埃氏筛和欧拉筛
下一篇: 欧几里得算法和扩展欧几里得算法
Androids_lost_Sheep
博客等级 码龄8年 1022粉丝 86原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值