首页 > 编程语言 >(算法)快速幂运算和取模的基本知识

(算法)快速幂运算和取模的基本知识

时间:2024-01-29 11:26:26浏览次数:27  
标签:右移 取模 运算 int 基本知识 算法 base ans

引子:在高精度中的麦森数中运用到了快速幂运算

求一个数的多少次方可以用到快速幂,原理a^11=a^1*a^3*a^8,而为什么是拆成1,3,8而不是其他的呢,是因为11转化为二进制码是1011,这就分别对应了他的权重,有了这个基本知识后,执行这种类似的运算就可以大幅度减少时间。实现这个代码还需要用到位运算&(比较每一位,相同才是1)和右移的基本知识(右移多少位就除2的多少次方),接下来看代码实现

int quick(int a, int b)//是求a的b次方
{
	int ans = 1, base = a;//ans为答案(ans为答案这个初始值肯定是1,base为a^(2^n)
	while(b > 0)//b会一直右移直到移完变成0
    {
		if(b & 1)//&是位运算,b&1表示b在二进制下最后一位是不是1,如果是:
			ans *= base;//把ans乘上对应的a^(2^n)
		
        base *= base;//base自乘,由a^(2^n)变成a^(2^(n+1))
		b >>= 1;//位运算,b右移一位,如101变成10(把最右边的1移掉了),10010变成1001。现在b在二进制下最后一位是刚刚的倒数第二位。结合上面b & 1食用更佳
	}
	return ans;
}

  快速幂也会用到取模运算:

(A+B)modb=(Amodb+Bmodb)modb

(A×B)mod  b=((A mod b)×(B mod  b)) * modb

 

标签:右移,取模,运算,int,基本知识,算法,base,ans
From: https://www.cnblogs.com/sixsix666/p/17994107

相关文章

  • 今日回顾-回溯算法-17. 电话号码的字母组合
    注意点&感悟:我知道为什么,当初有些学霸说要复习了。因为有的知识点,你一遍没学会,自然要重复学习。所为复习,就是再学一遍。而简单的知识点,就不需要复习了,你已经明显知道自己掌握了,就不需要复习了。而预习呢?是为了,让提前学一遍,更多的是针对那些上课时间有限,以及学生等不及的情况......
  • 算法笔记 pdf下载
    《算法笔记》内容包括:C/C++快速入门、入门模拟、算法初步、数学问题、C++标准模板库(STL)、数据结构专题(二章)、搜索专题、图算法专题、动态规划专题、字符串专题、专题扩展。《算法笔记》印有二维码,用来实时更新、补充内容及发布勘误的。《算法笔记》可作为计算机专业研究生入学考......
  • 莫队算法/分块思想
    莫队算法/分块思想引入对于区间问题,常常会使用线段树维护,但是对于一些数据合并复杂度无法\(O(1)\)解决。所以不能使用,应当使用莫队算法。定义对于离线处理的查询问题,通过合理安排这些计算的次序,得到一个较优的复杂度例题1一个长度为\(n\)的序列,询问\(m\)次\([L,R]\)......
  • 读论文-基于Python的协同过滤算法的研究与应用实现
    前言今天读的论文为一篇名为《基于Python的协同过滤算法的研究与应用实现》的论文,文章是在2019年9月发表于《电脑知识与技术》的一篇期刊论文。摘要随着科学技术的快速发展和知识产权的日益重要,大多数用户会选择在播放平台上看电影。例如腾讯视频、爱奇艺等,用户迫切需要一个合......
  • 补充:基于项目的协同过滤推荐算法(Item-Based Collaborative Filtering Recommendation
    前言继续上篇博客,继续读论文。想看上篇论文的同学可以点击这里相关工作Inthissectionwebrieflypresentsomeoftheresearchliteraturerelatedtocollaborativefiltering,recommendersystems,dataminingandpersonalization.在本节中,我们简要介绍了一些与协同......
  • 数据结构与算法:递归算法
    递归算法什么是递归?函数直接或间接调用自身的过程称为递归,相应的函数称为递归函数。使用递归算法,可以很容易地解决某些问题。此类问题的示例包括汉诺塔(TOH)、中序/先序/后序树遍历、图的DFS递归函数通过调用自身的副本并解决原始问题的较小子问题来解决特定问题。需要时可以生......
  • 生成一个满二叉数算法
    1、树结构类publicclassTreeNode<T>{Tval;TreeNode<T>parent;TreeNode<T>right;TreeNode<T>left;publicTreeNode(){}publicTreeNode(Tval){this.val=val;this.parent=nul......
  • 一些在刷js算法时常用的方法(1)
    Array.fromArray.from()静态方法从可迭代或类数组对象创建一个新的浅拷贝的数组实例String、Array、TypedArray、Map、Set以及Intl.Segments(en-US)都是内置的可迭代对象console.log(Array.from('foo'));//输出:Array["f","","o","o"]可以将字符串拆成数组,同时将......
  • 【学习笔记】部分树上算法(概念篇)
    本文包括:轻重链剖分(done)线段树合并(done)tobeupd:长链剖分DSUontree(树上启发式合并)点分治边分治LCT有待更新本文非例题代码大多未经过编译,谨慎使用本文本来只有重剖长剖dsu,但是发现不会写,另外几个甚至更简单就带歪了.jpgpart1轻重链剖分树剖是一类算法的总......
  • 单源最短路径算法之bellman-ford
    单源最短路径算法之\(bellman-ford\)以边为研究对象单起点多终允许有负边权\(bellman-ford\)的工作原理假设\(n\)个点\(m\)条有向边的图,求\(s\)为起点的最短路条以\(s\)出发的最短路,最多包含\(n\)个点,\(n-1\)条边对于一条边\((x,y,w)\),\(y\)可能被\(x\)......