【数论】—— 快速幂与扩展欧拉定理

快速幂与扩展欧拉定理

把这两个知识点放一起是因为扩展欧拉定理需要用到快速幂。

快速幂

定义

快速幂,即很快的做幂运算,并且在求幂的同时支持取模操作。但这个算法究竟是怎么实现的,我们来探究一下。

快速幂的原理

假设我们需要求 2 8 2^8 28 是多少?

最暴力的方法就是一个一个乘:

2 × 2 × ⋯ × 2 × 2 ⏟ 8 个 2 = 256 \underbrace{2\times 2\times \cdots \times 2\times 2}_{8 个 2}=256 82 2×2××2×2=256

这样的时间复杂度是: O ( n ) O(n) O(n)。当指数大时,这样的暴力一定 T 到飞起。

当然,聪明的你们(不是我)一定发现了一个简便的方法,那就是让底数不断平方,然后指数不断除以 2 2 2。即:

2 8 = 2 2 4 = 4 4 = 4 2 2 = 1 6 2 = 256 2^{8}=2^{2^4}=4^4=4^{2^2}=16^2=256 28=224=44=422=162=256

不难发现,这样求幂只运算了 3 3 3 次,是 log ⁡ \log log 级别的。但如果指数不是 2 2 2 的倍数怎么办呢?我们再来看一个例子:

2 10 2^{10} 210 是多少?

我们还是先按之前的方法做:

2 10 = 2 2 5 = 4 5 2^{10}=2^{2^5}=4^5 210=225=45

现在我们发现指数变成了奇数,不能再除以 2 2 2 了。对于这种情况,我们可以这样处理:把一个底数单独拿出来,使得指数减一而成为偶数。即:

4 5 = 4 4 × 4 4^5=4^4\times 4 45=44×4

经过处理,我们就可以继续重复原来的步骤了:

4 4 × 4 = 1 6 2 × 4 = 256 × 4 = 1024 4^4\times 4=16^2\times 4=256\times 4=1024 44×4=162×4=256×4=1024

这两个步骤就是快速幂算法的主要流程。

具体实现:

我们可以定义变量 result,记得一定要初始化为 1 1 1。然后如果指数变成了奇数,则令result乘上底数,否则指数除以二,底数平方。

代码实现

由上面的两个步骤,我们可以写出基本的算法框架:

int ksm(int base , int x) {int result = 1;while(x) {if(x % 2 == 1)result *= base;x /= 2;base *= base;}return result;
}

但这还不是最快的算法。我们可以将取模运算以及除法运算改成位运算:

inline int ksm(int base , int x) {int result = 1;while(x) {if(x & 1)result *= base;x >>= 1;base *= base;}return;
}

欧拉定理与扩展欧拉定理

欧拉定理

定义

对于 a a a m m m 两数,若 gcd ⁡ ( a , m ) = 1 \gcd(a,m)=1 gcd(a,m)=1 则有: a φ ( m ) ≡ 1 ( m o d m ) a^{\varphi(m)}\equiv 1\pmod m aφ(m)1(modm)

其实费马小定理就是欧拉定理的特殊情况,即当 m m m 为素数时。

欧拉定理的证明

A = { x 1 , x 2 , ⋯ , x φ ( m ) } A=\left\{x_1,x_2,\cdots,x_{\varphi(m)}\right\} A={x1,x2,,xφ(m)} 1 − m 1-m 1m 中与 m m m 互素的数的集合。

则这些数模 m m m 互不相同,且余数与 m m m 互素。

接下来,我们来证明集合 B = { a x 1 , a x 2 , ⋯ , a x φ ( m ) } B=\left\{ax_1,ax_2,\cdots,ax_{\varphi(m)}\right\} B={ax1,ax2,,axφ(m)} gcd ⁡ ( a , m ) = 1 \gcd(a,m)=1 gcd(a,m)=1 也有这样的性质。

我们先证这些数模 m m m 互不相同:

考虑反证法:

a x i ≡ a x j ( m o d m ) ax_i\equiv ax_j\pmod m axiaxj(modm) i ≠ j i\neq j i=j

则有 a x i − a x j ≡ 0 ( m o d m ) ax_i-ax_j\equiv 0\pmod m axiaxj0(modm)

a ( x i − x j ) ≡ 0 ( m o d m ) a(x_i-x_j)\equiv 0\pmod m a(xixj)0(modm)

因为 a a a m m m 互素且 x i − x j ∤ m x_i-x_j\nmid m xixjm 所以这种情况不存在,得证。

接下来,我们证余数与 m m m 互素:

因为 a a a m m m 互素,且 x i x_i xi m m m 互素。

所以 a x i ax_i axi m m m 互素。得证。

所以 B B B 集合在模 m m m 后便于 A A A 集合相等。可得:

∏ i = 1 φ ( m ) a x i ≡ ∏ i = 1 φ ( m ) x i ( m o d m ) \prod_{i=1}^{\varphi(m)} ax_i\equiv \prod_{i=1}^{\varphi(m)} x_i\pmod m i=1φ(m)axii=1φ(m)xi(modm)

a a a 提出得:

a φ ( m ) ∏ i = 1 φ ( m ) x i ≡ ∏ i = 1 φ ( m ) x i ( m o d m ) a^{\varphi(m)}\prod_{i=1}^{\varphi(m)} x_i\equiv\prod_{i=1}^{\varphi(m)} x_i\pmod m aφ(m)i=1φ(m)xii=1φ(m)xi(modm)

同时约掉 ∏ i = 1 φ ( m ) x i \prod_{i=1}^{\varphi(m)} x_i i=1φ(m)xi 得:

a φ ( m ) ≡ 1 ( m o d m ) a^{\varphi(m)}\equiv 1\pmod m aφ(m)1(modm)

得证。

欧拉定理的推论与证明

a a a m m m 互素,则有 a b ≡ a b m o d φ ( m ) ( m o d m ) a^b\equiv a^{b\bmod \varphi(m)}\pmod m ababmodφ(m)(modm)

下面给出证明:

b = k × φ ( m ) + t b=k\times\varphi(m)+t b=k×φ(m)+t,其中 t = b m o d φ ( m ) t=b\bmod \varphi(m) t=bmodφ(m)

b b b 代入 a b a^b ab 得:

a b = a k × φ ( m ) + t = a k × φ ( m ) × a t = a φ ( m ) k × a t ≡ 1 k × a b m o d φ ( m ) ( m o d m ) ≡ a b m o d φ ( m ) ( m o d m ) \begin{aligned} a^b &= a^{k\times\varphi(m)+t}\\ &= a^{k\times \varphi(m)}\times a^t\\ &=a^{\varphi(m)^k}\times a^t\\ &\equiv 1^k\times a^{b\bmod \varphi(m)}\pmod m\\ &\equiv a^{b\bmod \varphi(m)}\pmod m\\ \end{aligned} ab=ak×φ(m)+t=ak×φ(m)×at=aφ(m)k×at1k×abmodφ(m)(modm)abmodφ(m)(modm)

得证。

扩展欧拉定理

在大部分情况下,我们都使用扩展欧拉定理,因为它可以处理的情况更多。

定义

对于 a b m o d m a^b\bmod m abmodm 这样一个式子,无论 a a a m m m 互不互素都有:

a b m o d m ≡ { b ≥ φ ( m ) , a b m o d φ ( m ) + φ ( m ) ( m o d m ) b < φ ( m ) , a b ( m o d m ) a^b\bmod m\equiv \begin{cases} b\ge \varphi(m),a^{b\bmod \varphi(m)+\varphi(m)}\pmod m\\ b<\varphi(m),a^b\pmod m \end{cases} abmodm{bφ(m),abmodφ(m)+φ(m)(modm)b<φ(m),ab(modm)

  • 对于第一种情况,即 b ≥ φ ( m ) b\ge\varphi(m) bφ(m) 时我们可以用公式化简来求解。

  • 对于第二种情况,我们可以直接使用快速幂算出结果。

算法流程十分简单,我们只需要判断 b b b φ ( m ) \varphi(m) φ(m) 的大小,然后按照对应的公式计算即可。

代码
inline int phi(int x) {int ans = x;for(register int i = 2;i <= sqrt(x);i ++)if(x % i == 0) {ans = ans / i * (i - 1);while(x % i == 0)x /= i;}if(x > 0)ans = ans / x * (x - 1);return ans;
}inline int ksm(int base , int x , int m) {int result = 1;while(x) {if(x & 1)result = result * base % m;x >>= 1;base = base * base % m;}return result;
}inline int solve(int a , int b , int m) {int phi_m = phi(m);if(b >= phi_m)return ksm(a , b % phi_m + phi_m , m);elsereturn ksm(a , b , m);
}

证明不放了,以后再 update 吧。

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

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

相关文章

Grok 3与GPT-4.5的“智能天花板”争夺战——谁才是大模型时代的算力之王?

2025年2月18日&#xff0c;马斯克旗下 xAI 高调发布新一代大模型Grok 3&#xff0c;号称“地球上最聪明AI”&#xff0c;在数学推理、代码生成等核心能力上碾压 GPT-4o、DeepSeek-V3 等对手。而就在同一天&#xff0c;OpenAI创始人 Sam Altman 暗示 GPT-4.5 即将登场&#xff0…

ubuntu新系统使用指南

1. 更新源 2. 配置rime 输入法 sudo apt install ibus-rimeibus-setup #打开配置界面添加雾凇拼音 cd ~/Documents/Tool/input_source/plumgit clone --depth 1 https://github.com/rime/plum plum #没有梯子就劝退cd plum/bash rime-install iDvel/rime-ice:others/recipe…

C#贪心算法

贪心算法&#xff1a;生活与代码中的 “最优选择大师” 在生活里&#xff0c;我们常常面临各种选择&#xff0c;都希望能做出最有利的决策。比如在超市大促销时&#xff0c;面对琳琅满目的商品&#xff0c;你总想用有限的预算买到价值最高的东西。贪心算法&#xff0c;就像是一…

3、Kubernetes 集群部署 Prometheus 和 Grafana

Kubernetes 集群部署 Prometheus 和 Grafana node-exporter 安装Prometheus 安装和配置Prometheus 配置热加载Grafana 安装部署Grafana 配置 实验环境 控制节点/master01 192.168.110.10 工作节点/node01 192.168.110.20 工作节点/node02 192.168.110.30 node-exporter 安装 #…

MySQL中Binlog Redolog Undolog区别?

MySQL中Binlog Redolog Undolog区别 在学习MySQL数据库管理和优化的过程中&#xff0c;理解和区分Binlog&#xff08;二进制日志&#xff09;、RedoLog&#xff08;重做日志&#xff09;和UndoLog&#xff08;撤销日志&#xff09;是至关重要的。这三种日志在MySQL中扮演着不同…

C++中结构体与结构体变量 和 类与对象的区别

具体区别如下&#xff1a; 结构体 -> 结构体变量 { 结构体&#xff1a;struct student{ 具体是多少&#xff0c;年龄&#xff0c;名字&#xff0c;性别&#xff0c;成绩 } 结构体变量&#xff1a; stu{ 名字&#xff1a;张三&#xff0c;年龄&#xff1a;18&#…

小迪安全23-php后台模块

cookie技术 cookie就是身份验证表示&#xff0c;通过cookie好区分每个用户的个人数据和权限&#xff0c;第一次登陆之后正常的网站都会赋予一个cookie 写写一个后台界面&#xff0c;直接让ai去写就可以 然后自己需要的提交方式&#xff0c;和表单值自己修改即可 生成cookie的…

(面试经典问题之连接池篇)连接池构成、作用及其基本原理详解

一、什么是连接池 连接池一般指的是数据库连接池&#xff08;connection pooling&#xff09;&#xff0c;是指程序启动时建立足够的数据库连接&#xff0c;并将这些连接组成一个连接池&#xff0c;由程序动态的对池中的连接进行申请&#xff0c;使用&#xff0c;释放&#xf…

Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当今社会&#xff0c;随着人们生活水平的不断提高和健康意识的日益增强&#xff0c;健…

echarts找不到了?echarts社区最新地址

前言&#xff1a;在之前使用echarts的时候&#xff0c;还可以通过上边的导航栏找到echarts社区&#xff0c;但是如今的echarts变更之后&#xff0c;就找不到echarts社区了。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 如今…

Jenkins 配置 Credentials 凭证

Jenkins 配置 Credentials 凭证 一、创建凭证 Dashboard -> Manage Jenkins -> Manage Credentials 在 Domain 列随便点击一个 (global) 二、添加 凭证 点击左侧 Add Credentials 四、填写凭证 Kind&#xff1a;凭证类型 Username with password&#xff1a; 配置 用…

【Nacos】从零开始启动Nacos服务(windows/linux)

文章目录 前言前置条件官方网址一、Nacos下载1.1 选择Nacos版本1.2 下载 二、解压2.1 解压到某个文件夹 三、 启动3.1 方式一&#xff1a;直接使用命令启动3.1.1 进入bin文件夹3.1.2 进入命令行工具3.1.3 执行命令 3.2 方式二&#xff1a;修改配置文件后启动3.2.1 修改启动脚本…

Microsoft 365 Copilot中使用人数最多的是哪些应用

今天在浏览Microsoft 365 admin center时发现&#xff0c;copilot会自动整理过去30天内所有用户使用copilot的概况&#xff1a; 直接把这个图丢给copilot让它去分析&#xff0c;结果如下&#xff1a; 总用户情况 总用户数在各应用中均为 561 人&#xff0c;说明此次统计的样本…

AI学习第一天-什么是AI

AI的发展可以被分为四次浪潮&#xff0c;这包括符号主义、机器学习与神经网络&#xff0c;以及深度学习。在这些发展中&#xff0c;深度学习凭借其在处理非结构化复杂数据、强大的学习能力和可解释性方面的优势备受关注。深度学习技术的应用不仅提升了AI系统的性能&#xff0c;…

计算机视觉:经典数据格式(VOC、YOLO、COCO)解析与转换(附代码)

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络(附代码) 第五章&#xff1…

解决本地模拟IP的DHCP冲突问题

解决 DHCP 冲突导致的多 IP 绑定失效问题 前言 续接上一篇在本机上模拟IP地址。 在实际操作中&#xff0c;如果本机原有 IP&#xff08;如 192.168.2.7&#xff09;是通过 DHCP 自动获取的&#xff0c;直接添加新 IP&#xff08;如 10.0.11.11&#xff09;可能会导致 DHCP 服…

安全生产月安全知识竞赛主持稿串词

女:尊敬的各位领导、各位来宾 男:各位参赛选手、观众朋友们 合:大家好&#xff5e; 女:安全是天&#xff0c;有了这一份天&#xff0c;我们的员工就会多一份幸福&#xff0c; 我们的企业就会多一丝光彩。 男:安全是地&#xff0c;有了这一片地&#xff0c;我们的员工就多了一…

JDBC学习

背景&#xff1a;主机正在运行mysql服务 在cmd输入 mysql -u root -p 之后&#xff0c;输入密码&#xff08;我的用户名是root&#xff0c;密码是root&#xff09;&#xff0c;成功登录到mysql。 输入&#xff1a;SHOW GLOBAL VARIABLES LIKE port; 检查mysql服务的端口号 …

前端js进阶,ES6语法,包详细

进阶ES6 作用域的概念加深对js理解 let、const申明的变量&#xff0c;在花括号中会生成块作用域&#xff0c;而var就不会生成块作用域 作用域链本质上就是底层的变量查找机制 作用域链查找的规则是:优先查找当前作用域先把的变量&#xff0c;再依次逐级找父级作用域直到全局…

IDEA通过Maven使用JBLJavaToWeb插件创建Web项目

第一步&#xff1a;IDEA下载JBLJavaToWeb插件 File--->Settings--->Plugins--->Marketplace搜索: JBLJavaToWeb 第二步&#xff1a;创建普通Maven工程 第三步&#xff1a; 将普通Maven项目转换为Web项目