数论-快速幂

news2024/9/24 0:02:28

快速幂

  • 模板代码
  • 推导过程

求 A^B mod C,时间复杂度 O(logB)

模板代码

using ll = long long;  // 可以在头文件中添加这行

ll qmi(ll a, ll b, ll c)
{
    ll ans = 1;       // 初始化结果为 1
    a %= c;           // 将 a 取模 c,确保 a 小于 c

    while (b)         // 当 b 不为零时循环
    {
        if (b & 1)    // 如果 b 是奇数
        {
            ans = (ans * a) % c;  // 更新结果
        }
        a = (a * a) % c;  // 将 a 平方并取模 c
        b >>= 1;          // 将 b 右移一位(相当于除以 2)
    }
    return ans;          // 返回结果
}

推导过程

在这里插入图片描述

要计算 ( a × b )   m o d   p (a \times b) \bmod p (a×b)modp ,我们已经知道 a = k 1 p + q 1 a=k_1 p+q_1 a=k1p+q1 b = k 2 p + q 2 b=k_2 p+q_2 b=k2p+q2 。接下来我们先回顾一下 a × b a \times b a×b 的表达式:

a × b = k 1 k 2 p 2 + ( k 1 q 2 + q 1 k 2 ) p + q 1 q 2 a \times b=k_1 k_2 p^2+\left(k_1 q_2+q_1 k_2\right) p+q_1 q_2 a×b=k1k2p2+(k1q2+q1k2)p+q1q2

现在我们需要对这个结果取模 p p p ,即计算 ( a × b )   m o d   p (a \times b) \bmod p (a×b)modp
逐项取模:

  1. k 1 k 2 p 2   m o d   p : k_1 k_2 p^2 \bmod p: k1k2p2modp:
  • p 2 p^2 p2 p p p 的倍数,所以 k 1 k 2 p 2   m o d   p = 0 k_1 k_2 p^2 \bmod p=0 k1k2p2modp=0
  1. ( k 1 q 2 + q 1 k 2 ) p   m o d   p \left(k_1 q_2+q_1 k_2\right) p \bmod p (k1q2+q1k2)pmodp :
  • 这一项中有一个 p p p ,所以也是 p p p 的倍数,因此 ( k 1 q 2 + q 1 k 2 ) p   m o d   p = 0 \left(k_1 q_2+q_1 k_2\right) p \bmod p=0 (k1q2+q1k2)pmodp=0
  1. q 1 q 2   m o d   p : q_1 q_2 \bmod p: q1q2modp:
  • 这项中不含 p p p ,所以我们直接取模, q 1 q 2   m o d   p q_1 q_2 \bmod p q1q2modp 就是结果。

结论:

( a × b )   m o d   p = q 1 q 2   m o d   p (a \times b) \bmod p=q_1 q_2 \bmod p (a×b)modp=q1q2modp

因此, ( a × b )   m o d   p (a \times b) \bmod p (a×b)modp 等于 q 1 q 2   m o d   p ∘ ↓ q_1 q_2 \bmod p_{\circ} \downarrow q1q2modp

例如计算310
在这里插入图片描述

计算步骤:

  1. 初始化:
  • ans = 1 , a = 3 , b = 10 =1, a=3, b=10 =1,a=3,b=10 (二进制 101 0 2 1010_2 10102 ) 。
  1. 第一步 ( b = 1010 _ 2 ) : \left(b=1010 \_2\right): (b=1010_2):
  • 最低位为 0 ,跳过乘法。
  • 更新 a = 9 ( 3 2 ) a=9\left(3^2\right) a=9(32)
  1. 第二步 ( b = 101 _ 2 ) \left(b=101 \_2\right) (b=101_2) :
  • 最低位为 1 ,乘以 ans = 9 × 3 = 27 =9 \times 3=27 =9×3=27
  • 更新 a = 81 ( 9 2 ) a=81\left(9^2\right) a=81(92)
  1. 第三步 ( b = 10 _ 2 ) : \left(b=10 \_2\right): (b=10_2):
  • 最低位为 0 ,跳过乘法。
  • 更新 a = 6561 ( 8 1 2 ) a=6561\left(81^2\right) a=6561(812)
  1. 第四步 ( b = 1 _ 2 ) : \left(b=1 \_2\right): (b=1_2):
  • 最低位为 1 ,乘以 ans = 27 × 6561 = 177147 =27 \times 6561=177147 =27×6561=177147
  • 更新 a = 43046721 ( 656 1 2 ) a=43046721\left(6561^2\right) a=43046721(65612)
    1. 结果:
  • 3 10 = 177147 3^{10}=177147 310=177147

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

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

相关文章

【chrony安装】安装chrony服务作为NTP客户端(linux版)

文章目录 前言一、介绍chrony二、安装前准备三、安装chrony3.1. 在线安装chrony3.2. 离线安装chrony 四、服务端配置4.1. 配置服务端4.1.1. 服务端4.1.2. 客户端 4.2. 设置开机自启 五、常用命令六、安装验证七、国内常用NTP服务器总结 前言 本文章主要介绍在Centos系统&#…

高通Linux 交叉编译应用程序

1. 前提条件 Ubuntu 20.04 系统 高通RB3 Gen2开发板 2.下载并安装 eSDK 平台 1.从高通发布存档平台下载 eSDK。 wget https://artifacts.codelinaro.org/artifactory/qli-ci/flashable-binaries/qimpsdk/qcm6490/x86/qcom-6.6.28-QLI.1.1-Ver.1.1_qim-product-sdk-1.1.3.z…

各类元器件调试记录-E+H

一、EH压力传感器 适用型号为: Cerabar S PMC71, PMP71/75 Deltabar S FMD76/77/78, PMD70/75 Deltapilot S FMB70 调试过程:(后续补上图片) 一、湿标(湿调) 1、前提条件:罐体可以灌满和实际水箱水位高度 2、调试步骤: A、调节语…

电信网络携手大模型:AI赋能网络运维的新范式

当电信网络用上大模型,会带来怎样的体验? 过去,网络出现问题时,运维人员需要依赖经验反复排查,找到“病根”后再“对症下药”。但在大模型的加持下,问题的解决方式发生了颠覆性的改变。 如今,…

java中,怎么使用反射?

在Java中,反射(Reflection)是指在运行时能够获取类、方法、字段、构造函数等信息,并且能够在运行时动态调用类的方法、创建对象或访问字段。Java中的反射机制主要通过java.lang.reflect包中的类来实现。反射可以为开发者提供强大的…

上海泗博EtherNet/IP转PROFIBUS DP网关EPS-320IP成都地铁项目应用案例

背景: 地铁,作为城市的活力脉搏,不仅是衔接城市生活的关键纽带,更是现代城市交通体系中不可或缺的核心组成部分。因此,确保地铁的稳定运行对任何一座城市都至关重要。 上海泗博自动化,作为与成都地铁项目合…

C语言自定义类型结构体(24)

文章目录 前言一、结构体类型的声明结构体回顾结构体的特殊声明结构体的自引用 二、结构体的内存对齐对齐规则为什么存在内存对齐?修改默认对齐数 三、结构体传参四、结构体实现位段什么是位段位段的内存分配位段的跨平台问题位段的应用位段使用的注意事项 总结 前言…

安全区域边界等保测评

1.边界防护 应保证跨越边界的访问和数据流通过边界设备提供的受控接口进行通信。 [测评方法] 1)应核查在网络边界处是否部署访问控制设备;网闸和防火墙2)应核查设备配置信息是否指定端口进行跨越边界的网络通信,指定端口是否配置并启用了安全策略acl 3)应采用其他技术手…

C盘垃圾一个你不能忽视的问题!电脑小白学用这方法最简单好用!

C盘垃圾一个你不能忽视的问题!电脑小白学用这方法最简单好用!大家的电脑有没经常看到下图这样?C盘变成红色的了,这个因为是太多的垃圾文件堆积,而你又不经常清理这些垃圾。 所以就直接的导致了这些垃圾的堆积&#xff…

FloodFill算法(DFS+BFS)【上】

文章目录 FloodFill算法733. 图像渲染题目解析算法原理代码实现 200. 岛屿数量题目解析算法原理代码实现 695. 岛屿的最大面积题目解析算法原理代码实现 130. 被围绕的区域题目解析算法原理代码实现 FloodFill算法 FloodFill算法,中文名叫洪水灌溉 这些模拟一块区域…

SQL进阶技巧:火车票相邻座位预定一起可能情况查询算法 ?

目录 0 场景描述 1 数据准备 2 问题分析 2.1 分析函数法 2.2 自关联求解 3 小结 如果觉得本文对你有帮助,那么不妨也可以选择去看看我的数字化建设通关指南博客专栏 ,或许对你更有用。专栏原价99,现在活动价29.9,按照阶梯…

深圳前海港湾学校天桥下的免费停车点探寻

​最近开车去桂湾公园停车场的路上,看到有个天桥下有很多车停着,关键是这个地方离我搬砖的前海卓越写字楼还近,要是有时候桂湾公园停车位满了,停不进去的时候,是不是可以去这个天气下薅免费停车的羊毛?哈哈…

基于YOLO深度学习和百度AI接口的手势识别与控制项目

基于YOLO深度学习和百度AI接口的手势识别与控制项目 项目描述 本项目旨在开发一个手势识别与控制系统,该系统能够通过摄像头捕捉用户的手势,并通过YOLO深度学习模型或调用百度AI接口进行手势识别。识别到的手势可以用来控制计算机界面的操作&#xff0…

【OJ刷题】双指针问题4

这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:OJ刷题入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1…

Google宣布所有英语语种的Gemini Live用户现可免费使用

谷歌在Pixel 9系列手机的发布会上,同步推出了Gemini Live,该服务提供了一种移动对话体验,让用户和Gemini展开自由流畅的对话。Google现在宣布,所有使用英语的Gemini Live用户,可免费使用,此前为需要Advance…

RockyLinux-软件实现RAID5

一、背景 RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)是一种将多个物理硬盘驱动器组合成单一逻辑单元的技术,目的是提高存储性能、可靠性和/或数据冗余度。虽然早期的名字中包含“独立”(Independen…

【C++】stack 和 queue 以及 容器适配器

文章目录 一、stack1.1 stack的使用1.2 stack的模拟实现 二、queue2.1 queue的使用2.2 queue的模拟实现 三、优先级队列1.优先级队列的介绍2. priority_queue的使用的使用3.模拟实现优先级队列 四、 容器适配器1.STL标准库中stack和queue的底层结构2.deque(双端对列…

Unity3D 发布后去除Development Build显示

问题描述: Build后在视野右下角看到“Development Build”白色小字 解决方法: build时不勾选Development Build项 PS: 游戏开发unity杂项知识系列:build时Development Build的作用_unity development build-CSDN博客

结构体的内存对齐

对⻬规则: 1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处 2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。 对⻬数编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。 但一些编译器下并没有默认对其数 3.结…

ElK 8 收集 Nginx 日志

1. 说明 elk 版本:8.15.0 2. 启个 nginx 有 nginx 可以直接使用。我这里是在之前环境下 docker-compose.yml 中启动了个 nginx: nginx:restart: alwaysimage: nginx:1.26.1ports:- "80:80"- "443:443"volumes:#- ./nginx/html:/…