【复习】快速幂算法详解

快速幂算法
就是求一个高精度幂次取余时的一个快速算法
比如我们要求aba^bab%m的时候
应用于快速幂算法 也就是将O(n)转化为O(logn)的算法
他的原理就是:

252^525 = 2∗2∗2∗2∗22*2*2*2*222222 = 21012^{101}2101 = 21∗242^1 * 2^42124

相当于我们只需要遍历幂次的二进制位的长度就可以了
我们知道任意数x的二进制位长度是log2(x)
这样大大提升了求幂的效率

可是这样运算容易导致数据溢出
如何保证运算不超出数据范围还能正确求余呢?
我们需要借助同余定理 解决在这个求幂的运算过程中所产生的高精度问题
252^525%m

同余定理 就是给你定一个正整数m(m>1) 如果两个整数 a 和b 满足 a-b能够被m整除 则(a-b)/m
得到一个整数 则称a,b对模m同余

同余定理两个应用是
(a+b)%m = (a%m+b%m)%m
(a∗ba * bab)%m = (a%m ∗* b%m)%m

以上两条等式可以分别证明

这两条性质 可以应用在高精度运算中

实际上高精度就是说参与运算的数据和运算结果的范围, 超出标准数据类型能表示的数据大小范围的运算。
这个时候,如果要得到正确的计算结果,显然不能依靠普通方法实现了。 而要在普通运算原理的基础上,加以辅助算法来实现超大数据的计算。
例如:求两个100位的数据的和,或者计算两个100位的数字乘积。这时就要用到高精度算法了。

下面我们来看下代码

typedef long long ll;
ll quickpow(ll a,ll b,ll m){ll ans = 1;while(b){if(b%2)ans*=a;a*=a,a%=m;//套括号取模ans%=m;//套括号取模b>>=1;}return ans%m;//套括号取模
}

以上代码如果用表达式表达出来的话 就是

((ans∗aans*aansa) % m ∗(a∗a)* ( a * a )(aa) % m ∗(a∗a)* ( a * a )(aa) % m ) % m = 1∗251 *2^5125 %m
这个完全就是我们上面写的那个同余定理的应用中对高精度取余的处理方式
那么也就是 ((1∗2)∗(2∗2)∗(2∗2))((1*2)*(2*2)*(2*2))((12)(22)(22))%m = [(1∗2)[(1*2)[(12)%m ∗((2∗2)* (( 2*2)((22)%m∗(2∗2)*(2*2)(22)%m)))%m]]]%m
所以在这个过程中既不会低效 也不会导致数据溢出

这就是快速幂算法

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

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

相关文章

vue监听移动设备的返回事件

在公共方法文件common.js中实现一个存储当前历史记录的方法 common.js // 存储当前历史记录点,实现控制手机物理返回键的按钮事件 var pushHistory function () {let state {title: ,url: }window.history.pushState(state, state.title, state.url) } vue页面 mounted () {p…

[剑指offer]面试题第[36]题[JAVA][二叉搜索树与双向链表][递归]

【问题描述】[中等] 【解答思路】 中序遍历 时间复杂度:O(N) 空间复杂度:O(N) class Solution {Node pre, head;public Node treeToDoublyList(Node root) {if(root null) return null;dfs(root);head.left pre;pre.right head;return head;}void …

深度学习第一次课-数学

说明:本文是七月算法5月深度学习班第一次课听课笔记。只记录关键知识点,有些没具体展开。帮助复习用。文中使用了老师课件中的公式。 微积分 导数 定义常用函数导数导数法则加法 乘法 除法 链式法则一元函数与多元函数一阶导 一元函数 f(x) 多元函…

使用CUPS打印服务

目录1. 测试环境 22. CUPS介绍 32.1 CUPS的配置文件 32.1.1 cupsd.conf 32.1.2 cups-files.conf 32.1.3 printcap 32.1.4 printers.conf 32.2 SPOOL假脱机 42.3 CUPS 支持各种打印机,包括: 42.4 CUPS的beh 42.5 使用beh 52.6 安装cups,并激活…

深度学习第三次课-梯度下降与反向传播

梯度下降 损失函数可视化 得分函数 fW*X损失函数 cW*X-y 目标 损失函数最小 最优化过程可视化 一维二维 热力图如果损失函数是一个凸函数,例如SVM。凸函数 正系数加和凸函数神经网络 costfunction 非凸 因为系数有正有负。凸优化与最优化…

[Leetcode][第1025题][JAVA][除数博弈][数学][递推]

【问题描述】[中等] 【解答思路】 1. 数学证明 找规律 时间复杂度:O(1) 空间复杂度:O(1) 2. 递推 时间复杂度:O(N) 空间复杂度:O(1) class Solution {public boolean divisorGame(int N) {boolean[] f new boolean[N 5];f[1]…

《App后台开发运维与架构实践》第2章 App后台基础技术

2.1 從App業務邏輯中提煉API接口    業務邏輯思維導圖    功能-業務邏輯思維導圖    基本功能模塊關系    功能模塊接口UML(設計出API)    在設計稿標注API    編寫API文檔    2.2 設計API的要點    根據對象設計API  …

[Leetcode][第410题][JAVA][分割数组的最大值][动态规划][二分]

【问题描述】[中等] 【解答思路】 1. 动态规划 第 1 步:设计状态 令 f[i][j] 表示将数组的前 i 个数分割为 j 段所能得到的最大连续子数组和的最小值。 ( i ≥ j ) 第 2 步:状态转移方程 第 3 步:考虑初始化 f[i][…

深度学习第二课--图像识别与KNN

图像分类的难点 视角不同尺寸不同变形光影背景干扰同类内的差异 例如躺椅、座椅、 图像识别的核心 数据驱动学习。就像人看过很多猫以后,就知道什么是猫。把很多同一类的图片“喂给”计算机,让计算机自己去学习该类图片的特征。之后做出评估。KNN解决…

Vasya and Multisets CodeForces - 1051C 模拟|分类讨论

题意:把数组分成两个集合 每个集合中元素数量为1的个数相同(此个数可以是0) 分析: 这类问题就是要各种可能情况考虑到 然后分类讨论 完整地正确分类就AC 否则gg 如果数量为1的元素数为偶数个 对半分 如果元素数量…

centos安装多个tomcat

1.参考前文安装jdk、第一个tomcat 2.安装第二个tomcat后,修改/etc/profile vi /etc/profile #tomcat1  export CATALINA_BASE/opt/tomcat1  export CATALINA_HOME/opt/tomcat1  export TOMCAT_HOME/opt/tomcat1 #tomcat2  export CATALINA_BASE2/opt/tomcat…

[小技巧][Java]Arrays.fill() 初始化 二维数组

Arrays.fill()并不能提高赋值的效率&#xff0c;在函数的内部也是用for循环的方式 实现的。 fill()函数源码&#xff1a; public static void fill(Object[] a, Object val) {for (int i 0, len a.length; i < len; i)a[i] val;}for (int i 0; i < n; i) {Arrays.fil…

Grid game CodeForces - 1104C 放格子|思维|找规律

题意&#xff1a;4*4的格子中输入0放 2*1的图案输入1放1*2的图案 当摆满一行或一列后此行列图案清空 就想毛熊方块一样 分析&#xff1a;开始感觉很唬人 要搜索还是要dp啥的 后来发现原来2*1就放左下 1*2就放左上 然后来啥清空啥 就能够循环不断地放下去 然后变成了一道巨水题…

团队开发之团队介绍

团队名&#xff1a;又双叒叕队 团队口号&#xff1a;Bug不死&#xff0c;我们不休&#xff01; 团队成员&#xff1a;符满迪该团队成员拥有个人公众平台&#xff0c;对公众平台的运营有良好的实践经验。而且具有较好的编程能力&#xff0c;精通Java语言&#xff0c;对微信小程序…

数据结构与算法分析

本系列的笔记基于七月算法的《求职面试》课程以及《数据结构域算法分析-java语言描述》第2版&#xff0c;做学习笔记。 以下是这系列的目录。每个专题只做笔记&#xff0c;不求每个专题都要深入到很深很深。算法分析 表 栈 队列 并查集 哈希表 树 堆 图论 递归 深度优…

[算法][算法复杂度]常用算法复杂度速查表

复杂度通常会使用大 -O记号来表示&#xff0c;比如快速排序的平均时间复杂度是 O(nlog(n))。虽然我们应该做「理解派」&#xff0c;但是即使每个算法/数据结构都理解了&#xff0c;不时仍有可能忘记具体某个算法/数据结构的复杂度&#xff08;特别是在最好、最坏和平均情形下的…

十张伟大的科学瞬间

题图&#xff1a; 搭载 ORBCOMM OG2-M1 卫星的猎鹰 9 号运载火箭发射&#xff0c;人类一直很渺小。 ▎2019 更新 北京时间 2019 年 4 月 10 日 21 点&#xff0c;人类首张黑洞照片正式发布&#xff01; 这次的直接成像除了帮助我们直接确认了黑洞的存在&#xff0c;同时也通过模…

为什么gets如此危险?

这一段搬运自stackoverflow: Why is gets() dangerous The first internet worm (the Morris Internet Worm) escaped about 30 years ago (1988-11-02), and it used gets() and a buffer overflow as one of its methods of propagating from system to system. The basic pr…

[Leetcode][第329题][JAVA][矩阵中的最长递增路径][DFS][拓扑排序]

【问题描述】[中等] 【解答思路】 1. 记忆化深度优先搜索 复杂度 class Solution {public int[][] dirs {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public int rows, columns;public int longestIncreasingPath(int[][] matrix) {if (matrix null || matrix.length 0 || matri…

code1928: 日期差值 技巧模拟

1928: 日期差值 时间限制: 1 Sec 内存限制: 32 MB 题目描述 有两个日期&#xff0c;求两个日期之间的天数&#xff0c;如果两个日期是连续的我们规定他们之间的天数为两天。 输入 有多组数据&#xff0c;每组数据有两行&#xff0c;分别表示两个日期&#xff0c;形式为YYYYMMD…