【蓝桥杯】Python算法——求逆元的两种算法

目录

  • 零、前言
  • 一、逆元
  • 二、扩展欧几里得算法
  • 三、费马小定理
  • 四、总结

零、前言

距离25年蓝桥杯还有大概三个月时间,接下来重点应该会放在蓝桥杯备考方向,一起努力,一起加油


一、逆元

什么是逆元?这是数论中的一个基本概念。如果存在 a x ≡ 1 ( m o d n ) ax\equiv1(mod \ n) ax1(mod n) x x x a a a在模 n n n意义下的逆元。可以简单地理解为,求一个 x x x使得 a x m o d n = 1 ax\ mod\ n=1 ax mod n=1
逆元的意义在哪呢?如果遇到需要求 a / b m o d n a/b\ mod\ n a/b mod n的情况,则可以转化为分子a乘以分母b的逆元的形式,这样我们将除法转化为乘法,提高了计算效率。


二、扩展欧几里得算法

那么怎么求解逆元呢?由前面给出的公式 a x ≡ 1 ( m o d n ) ax\equiv1(mod \ n) ax1(mod n),不难看出求逆元 x x x就是求解等式的解: a x + n y = 1 ax + ny = 1 ax+ny=1因为 ( a x + n y ) m o d n = a x m o d n (ax+ny)\ mod\ n = ax\ mod\ n (ax+ny) mod n=ax mod n,求出了 x x x y y y,那么 x x x就是 a a a的逆元。
为了方便推导,我们暂时把 n n n换成 b b b,等号右边换位 m m m,求解的更一般的形式。 a x + b y = m ax+by=m ax+by=m根据裴蜀定理:对于任意整数 a a a, b b b, m m m,求解未知整数 x x x, y y y时,必须满足 g c d ( a , b ) ∣ m gcd(a,b)|m gcd(a,b)m,即 m m m g c d ( a , b ) gcd(a,b) gcd(a,b)的倍数时才有解。
所以我们将计就计,如果 m m m g c d ( a , b ) gcd(a,b) gcd(a,b)的一倍,也就是 m = g c d ( a , b ) m = gcd(a,b) m=gcd(a,b),先解出方程 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)的解 x 1 x_1 x1, y 1 y_1 y1,然后两边乘以 m / g c d ( a , b ) m/gcd(a,b) m/gcd(a,b),不就能求出来我们想要的了吗? a m x 1 g c d ( a , b ) + b m y 1 g c d ( a , b ) = m a\frac{mx_1}{gcd(a,b)}+b\frac{my_1}{gcd(a,b)}=m agcd(a,b)mx1+bgcd(a,b)my1=m所以,我们进一步研究问题:解出方程 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)的解。
那么我们需要求出三个东西, x x x y y y g c d ( a , b ) gcd(a,b) gcd(a,b),这就是扩展欧几里得算法的根本研究问题。(By the way,欧几里得算法就是求解 g c d ( a , b ) gcd(a,b) gcd(a,b),方法就是我们熟知的辗转相除法。)
b = 0 b=0 b=0,有特解 x = 1 , y = 0 x=1,y = 0 x=1,y=0,这是迭代的初始条件。
b ≠ 0 b\neq0 b=0,假设 x 1 x_1 x1 y 1 y_1 y1 a x 1 + b y 1 = g c d ( a , b ) ax_1+by_1=gcd(a,b) ax1+by1=gcd(a,b)的解,根据欧几里得算法: g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b) = gcd(b,a\ mod\ b) gcd(a,b)=gcd(b,a mod b),下一步我们构造 b x 2 + ( a m o d b ) y 2 = g c d ( b , a m o d b ) bx_2+(a\ mod\ b)y_2 = gcd(b, a\ mod\ b) bx2+(a mod b)y2=gcd(b,a mod b),
a m o d b a\ mod\ b a mod b怎么表示?不就是 a / b a/b a/b的余数嘛,所以你细品:a%b = a - (a//b)*b,( a ÷ b = q … … r a \div b = q……r a÷b=q……r,则 a = b ∗ q + r a = b*q + r a=bq+r,其中q就是a整除b的结果a//b), 带入到上式则有 b x 2 + ( a m o d b ) y 2 = b x 2 + ( a − ( a / / b ) b ) y 2 = g c d ( b , a m o d b ) bx_2+(a\ mod\ b)y_2 = bx_2+(a - (a//b)b)y_2 = gcd(b,a\ mod\ b) bx2+(a mod b)y2=bx2+(a(a//b)b)y2=gcd(b,a mod b)
好乱,整理一下:
{ a x 1 + b y 1 = g c d ( a , b ) b x 2 + ( a − ( a / / b ) b ) y 2 = g c d ( b , a m o d b ) g c d ( a , b ) = g c d ( b , a m o d b ) \left\{ \begin{aligned} ax_1 + by_1 &= gcd(a,b) \\ bx_2+(a - (a//b)b)y_2 &= gcd(b,a\ mod\ b) \\ gcd(a,b) &= gcd(b,a\ mod\ b) \end{aligned} \right. ax1+by1bx2+(a(a//b)b)y2gcd(a,b)=gcd(a,b)=gcd(b,a mod b)=gcd(b,a mod b)这样我们就能找到 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 2 , y 2 ) (x_2,y_2) (x2,y2)的关系了: a x 1 + b y 1 = a y 2 + b ( x 2 − ( a / / b ) y 2 ) ax_1+by_1 = ay_2 + b(x_2 - (a//b)y_2) ax1+by1=ay2+b(x2(a//b)y2),所以有 { x 1 = y 2 y 1 = x 2 − ( a / / b ) y 2 \left\{ \begin{aligned} x_1 &= y_2\\ y_1 &= x_2 - (a//b)y_2 \end{aligned} \right. {x1y1=y2=x2(a//b)y2这就是递归的关系式。
有了初始值与递归关系,就可以写代码来求解了。

def exgcd(a,b):if b==0:return a,1,0gcd,x2,y2 = exgcd(b,a%b)x1,y1 = y2,x2-(a//b)*y2return gcd,x1,y1

别忘了我们求的是 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b),而我们要求的是 a x + b y = m ax+by=m ax+by=m,那么对于函数输出,还要再乘以 m / g c d m/gcd m/gcd

def Func(a,b,m):gcd,x1,y1 = exgcd(a,b)if m % gcd != 0:return None,None,Nonex0, y0 = x * m // gcd, y * m // gcdreturn gcd, x0, y0

汇总:

def exgcd(a,b):if b==0:return a,1,0gcd,x2,y2 = exgcd(b,a%b)x1,y1 = y2,x2-(a//b)*y2return gcd,x1,y1def Func(a,b,m):gcd,x1,y1 = exgcd(a,b)if m % gcd != 0:return None,None,Nonex0, y0 = x * m // gcd, y * m // gcdreturn gcd, x0, y0MOD = 1e9+7
a = int(input())
_, inv_a, _ = Func(a, MOD, 1)
print(inv_a)

三、费马小定理

费马小定理
如果 p p p是素数,且 a a a是一个不能被 p p p整除的整数,那么: a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv1({\mathrm{mod}}p) ap11(modp)

这给了我们一个求逆元的好方法: a a p − 2 ≡ 1 ( m o d p ) aa^{p-2}\equiv1(mod\ p) aap21(mod p)注意前提:模数为素数,且 a a a不能被 p p p整除。
这时我们只需要算一下 a p − 2 a^{p-2} ap2就行了,很方便吧。可以用快速幂来求。

def KSM(a, b, mod):if b == 0: return 1if b == 1: return a % modres = KSM(a, b//2, mod)res = res * res % modif b % 2 == 1:res = res * a % modreturn resdef INV(a):return KSM(a, MOD-2, MOD)MOD = 1e9+7
a = int(input())
print(INV(a))

四、总结

介绍了两种方法求解逆元:扩展欧几里得算法和费马小定理算法,前者实用性广,而后者有一个前提,即模数必须为素数,不过一般用费马小定理的情况要多一些。

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

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

相关文章

Android CustomTextField

在 Compose 中开发用户界面时,需要处理输入框和键盘的交互,例如在键盘弹出时调整布局位置,避免遮挡重要内容。本篇博客将通过一个完整的示例展示如何实现这一功能。 功能概述 本例实现了一个简单的输入框。当输入框获得焦点或输入文字时&…

[0242].第4-3章:SpringBoot2核心技术笔记

Java学习大纲 1、笔记 第1步:框架初识 [0242-01].第01节:SpringBoot初识 第2步:入门项目 [0242-02].第02节:SpringBoot入门项目[0242-03].第03节:SpringBoot开发技巧 第3步:开发应用 配置文件&#xff1a…

2025.1.15——四、布尔注入

题目来源:ctfhub技能树 目录 一、基本操作:整理已知信息,得到本题为布尔注入 方法一:手工盲注(不推荐) step 1:判断具体形式 step 2:查询字段数 step 3:通过回显判…

Vue2.0的安装

1.首先查看是否已经安装了node.js 选择以管理员方式打开命令提示符(权限较高),或者通过cmd的方式打开 打开后输入node -v 查看自己电脑是否安装node,以及版本号 node -v 如果没有的话,请查看Node.js的安装 2.Vue和脚…

SQL Server 导入Excel数据

1、选中指定要导入到哪个数据库,右键选择 》任务 》导入数据 2、数据源 选择Excel,点击 下一步(Next) 3、目前 选择OLE DB Provider ,点击 下一步(Next) 4、默认 ,点击 下一步(Next)…

迅为RK3576开发板Android 多屏显示

迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片,集成了4个Cortex-A72和4个Cortex-A53核心,以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。 1.1 Android 多屏同显 iTOP-RK3576 开发板支持…

如何保证光谱相机的稳定性和可靠性

光学系统设计与制造 高质量光学元件:采用高精度研磨和镀膜的透镜、棱镜、光栅等光学元件。优质的透镜可以减少像差和色差,确保光线准确聚焦;高质量的镀膜能够提高光学元件的透光率,降低反射损失,并且增强对不同波段光…

Python GUI Pyside6 实例笔记

例【1】 好的!我们将通过一个简单的案例来学习如何使用 PySide6 创建一个基本的桌面应用程序。这个案例将展示如何创建一个带有按钮的窗口,当点击按钮时,会弹出一个消息框。 1. 安装 PySide6 首先,确保你已经安装了 PySide6。如…

CIA-Access V2.5_9_2_10G EPON技术原理_关键技术

10G EPON关键技术,主要包含测距,突发光电技术,DBA以及线路加密。 关键技术之MPCP测距 第一个仍然是测距,每一个ONU到OLT的逻辑距离是不相等的,另外OLT与ONU之间的环路时间也会随着时间和环境的变化而变化,…

PDF文件提取开源工具调研总结

概述 PDF是一种日常工作中广泛使用的跨平台文档格式,常常包含丰富的内容:包括文本、图表、表格、公式、图像。在现代信息处理工作流中发挥了重要的作用,尤其是RAG项目中,通过将非结构化数据转化为结构化和可访问的信息&#xff0…

计算机网络 (43)万维网WWW

前言 万维网(World Wide Web,WWW)是Internet上集文本、声音、动画、视频等多种媒体信息于一身的信息服务系统。 一、基本概念与组成 定义:万维网是一个分布式、联机式的信息存储空间,通过超文本链接的方式将分散的信息…

ubuntu18.04开发环境下samba服务器的搭建

嵌入式linux的发展很快,最近准备在一个新项目上采用新一代的linux核心板,发现linux内核的版本已经更新到5.4以上甚至6.0以上;之前常用的linux内核版本是2.6.4,虽然在某些项目上还能用但是明显跟不上时代的步伐了,所以要…

HTML5+Canvas实现的鼠标跟随自定义发光线条源码

源码介绍 HTML5Canvas实现的鼠标跟随自定义发光线条特效源码非常炫酷&#xff0c;在黑色的背景中&#xff0c;鼠标滑过即产生彩色变换的发光线条效果&#xff0c;且线条周围散发出火花飞射四溅的粒子光点特效。 效果预览 源码如下 <!DOCTYPE html PUBLIC "-//W3C//D…

【论文阅读】基于空间相关性与Stacking集成学习的风电功率预测方法

文章目录 摘要0. 引言1. 空间相关性分析2. 风电功率预测模型2.1 Stacking 集成策略2.2 基学习器2.2.1 基于机器学习算法的基学习器2.2.2 基于神经网络的基学习器2.2.3 基于粒子群优化算法的超参数优化 2.3 元学习器2.4 基于空间相关性与Stacking集成学习的风电功率预测方法 3 算…

GMM高斯混合聚类算法(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GMM高斯混合聚类算法 matlab2023b语言&#xff0c;一键出图&#xff0c;直接运行 1.代码注释清晰&#xff0c;自行解读容易。 2…输出图例如图所示包括&#xff1a;聚类图(聚类结果图)&#xff0c;协方差矩阵类型…

LabVIEW实车四轮轮速信号再现系统

开发了一个基于LabVIEW的实车四轮轮速信号再现系统。该系统解决现有电机驱动传感器成本高、重复性差、真实性差和精度低等问题&#xff0c;提供一种高精度、低成本的轮速信号再现解决方案。 项目背景 ABS轮速传感器在现代汽车安全系统中发挥着至关重要的作用。为保证其准确性和…

计算机网络常见协议

目录 OSPF(Open Shortest Path First) NAT(Network Address Translation) ICMP (Internet Control Message Protocol) HTTPS&#xff08;SSL/TLS加密&#xff09; HTTPS协议 1. 对称加密 2. 非对称加密 3. 证书验证 4. 回顾https协议传输流程 HTTP TCP UDP 1. TCP&a…

算法面试准备 - 手撕系列第七期 - MLP(利用FashionMNIST数据集)

算法面试准备 - 手撕系列第七期 - MLP(利用FashionMNIST数据集) 目录 算法面试准备 - 手撕系列第七期 - MLP(利用FashionMNIST数据集)FashionMINIST 图像分类原理解析1. 全连接的原理图2. 背景介绍3.引入相关库函数4. 数据预处理5. 模型设计6. 初始化网络&#xff0c;损失函数与…

单元测试与unittest框架

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 单元测试的定义 1. 什么是单元测试&#xff1f; 单元测试是指&#xff0c;对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&am…

【Hugging Face】下载开源大模型步骤

Mac M1 1、国内镜像站 模型基本都可以在国内镜像站 https://hf-mirror.com/ 下载。 部分 Gated Repo 需登录申请许可&#xff0c;需先前往 Hugging Face 官网登录、申请许可&#xff0c;在官网这里获取 Access Token 后回镜像站用命令行下载。 2、注册登陆 Hugging Face 2.1…