首页 > 其他分享 >快速幂笔记

快速幂笔记

时间:2024-12-20 15:30:37浏览次数:7  
标签:二进制 res long int while 笔记 快速 mod

快速幂笔记

快速幂,可以优化指数计算,将朴素的 \(O(n^2)\) 的时间复杂度优化到 \(O(n\log n)\)

原理是,将幂通过二进制拆分,只需要计算拆分后的值,就能组合出完全幂的答案

举例如下:有 \(a^{14} = a^{1110_{(2)}} = a^{1*2^3}*a^{1*2^2}*a^{1*2^1}*a^{0*2^0}\)

又有 \(a^{2^i}=a^{2^{i-1}}*2\) ,于是我们可以倍增地计算指数积的因子,代码可以这样来实现

  • 二进制拆分幂
while (b)//当b的十进制不为0时,即二进制不全为0时
{
	if (b & 1){//按位与1,取出二进制的末尾值,
		......//操作过程
	}
	b >>= 1;//向右移一位
}
  • 倍增计算因子
while (b)
{
	if (b & 1) res *= a;//如果取出来的二进制末尾值为1,则将返回值乘上这个因子
	a *= a;//a倍增
	b >>= 1;
}
  • 最后返回指数计算答案即可

推广到一般情况,快速幂也可以应用到任意满足结合律的计算中,例如取模运算,矩阵乘法

即满足 \((x*y)*z = x*(y*z)\ \ \forall x,y,z\) 的运算成立

以洛谷P1226 取模运算为例:对于取模运算,这样两个等式显然成立

\((a*b)(mod)p=\{ a(mod)p*b(mod)p\}(mod)p\)

\((a+b)(mod)p=\{a(mod)p+b(mod)p\}(mod)p\)

可以推出以下变形:\(a^b (mod) p = \{ a^{i_1}(mod)p*a^{i_2}(mod)p*...*a^{i_k}(mod)p \}(mod)p,\sum_i^k=b\)

所以,可以对标准的快速幂函数内进行部分修改,满足上述的等式

long long quickpower_p(long long a, long long b, long long p) {
	int res = 1;
	while (b)
	{
		if (b & 1) res = res * a % p;//每个因子都对p取余
		a = a * a % p;//倍增因子同样需要对p取余
		b >>= 1;
	}
	return res;
}

该题完整代码:

#include <iostream>
using namespace std;

long long a, b, p;

int quickpower_p(long long a, long long b, long long p) {
	int res = 1;
	while (b)
	{
		if (b & 1) res = res * a % p;
		a = a * a;
		b >>= 1;
	}
	return res;
}

int main()
{
	cin >> a >> b >> p;
	cout << a << '^' << b << " mod " << p << "=" << quickpower_p(a, b, p) << endl;
	return 0;
}

标签:二进制,res,long,int,while,笔记,快速,mod
From: https://www.cnblogs.com/dianman/p/18619392

相关文章

  • 【Cadence射频仿真学习笔记】IC设计中电感的分析、建模与绘制(EMX电磁仿真,RFIC-GPT生成
    一、理论讲解1.电感设计的两个角度电感的设计可以从两个角度考虑,一个是外部特性,一个是内部特性。外部特性就是把电感视为一个黑盒子,带有两个端子,如果带有抽头的电感就有三个端子,需要去考虑其电感值、Q值和自谐振频率这三个参数电感的Q值表达式如下,可以发现当电感等效电阻......
  • Ubuntu 笔记本设置合盖不息屏
    编辑logind.conf文件你可以通过编辑/etc/systemd/logind.conf文件来控制盖子关闭时的行为:找到以下几行(如果不存在,可以手动添加):#HandleLidSwitch=suspend#HandleLidSwitchExternalPower=suspend#HandleLidSwitchDocked=ignore将它们修改为如下:HandleLidSwitch=ignore......
  • Web APIs - 第6章笔记
    正则表达式什么是正则表达式?正则表达式(RegularExpression)是一种字符串匹配的模式(规则)使用场景:例如验证表单:手机号表单要求用户只能输入11位的数字(匹配)过滤掉页面内容中的一些敏感词和高亮搜索关键字(替换)从字符串中获取我们想要的特定部分(提取)正则基本......
  • OSG开发笔记(四十):使用OSG自绘拟合球形顶点
    ​若该文为原创文章,未经允许不得转载本文章博客地址:https://blog.csdn.net/qq21497936/article/details/144609131各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、......
  • OSG开发笔记(四十):使用OSG自绘拟合球形顶点
    前言  OSG内置的几何图形并没有球面,那么绘制球面先要绘制球面的组成顶点,本篇解说绘制球面组成顶点的详细过程。 Demo    组成面的时候,为了看到是否正确,取中间的几个圆环:       回顾OSG坐标系理解  OSG的坐标系类似于Qt场景坐标系,场景......
  • nginx安装教程笔记(包含访问控制)
    目录一、nginx的安装二、访问控制基于授权访问控制基于客户端的访问控制一、nginx的安装1.安装组件yum-yinstallpcre-develzlib-develgccgcc-c++make2.创建用户useradd-M-s/sbin/nologinnginx3.解压源码包并编译安装tarzxvfnginx-1.12.0.tar.g......
  • fastq和fastqc测序格式介绍 | 生物专业最值得看的哈佛生信笔记01
    测序技术简介第一代测序技术,即Sanger测序,通过在四条不同的车道上进行反应,最终确定DNA序列。目前主流的第二代测序技术,即lllumina的测序技术,通过在玻璃片上进行大规模平行测序,实现快速、高效的DNA测序。第三代测序技术,虽然目前还处于原型阶段,但具有单分子测序的潜......
  • CopilotKit详解:用GPT-4快速集成AI,实现精准参数归纳与程序执行
    言简意赅的讲解CopilotKit解决的痛点使用AI提升项目体验:深入了解CopilotKit在现代软件开发中,融入AI的能力已经成为许多项目的亮点。然而,如何快速且优雅地实现这种能力,仍然困扰着许多开发者。让AI可以分析并帮助用户操作。今天,我要向大家推荐一个强大的工具:CopilotKit......
  • 笔记day4
    文章目录1复习2开发Search模块中的TypeNav商品分类菜单(过渡动画效果)3商品分类三级列表可以进行优化4合并params与query参数5开发Home首页中的ListContainer组件与Floor组件6swiper1复习商品分类的三级列表由静态变为动态形式【获取服务器数据:解决代理跨域问题......
  • 《程序员修炼之道:从小工到专家》读书笔记(五)
    第四章注重实效的偏执这一章节围绕着“偏执”这一独特视角展开,强调在软件开发领域,适当的偏执并非是无端的担忧,而是一种保障项目成功、提升软件质量、应对复杂多变环境的必备特质。它倡导开发者要时刻警惕潜在问题,对代码、系统、流程中的不确定性保持高度敏感,提前预防风险,以确......