当前位置: 首页 > news >正文

记录:扩展欧几里得算法

本文遵循 CC BY-NC-ND 4.0 协议,作者: U•ェ•*U \texttt{U•ェ•*U} U*U,转载请获得作者授权。

前置知识

裴蜀定理/贝祖定理:若 a , b a,b a,b 是整数,且 gcd ⁡ ( a , b ) = d \gcd(a,b)=d gcd(a,b)=d,那么对于任意整数 x , y x,y x,y a × x + b × y = k a\times x + b\times y = k a×x+b×y=k 中的 k k k 一定是 d d d 的倍数。(特别地,如果 a , b a,b a,b 是整数,那么一定存在整数 x , y x,y x,y 使得 a × x + b × y = gcd ⁡ ( a , b ) a\times x + b\times y = \gcd(a,b) a×x+b×y=gcd(a,b)

引入

引入扩展欧几里得算法,可用于求解以下几种问题:

  • 给定两个非零的整数 a a a b b b,求一组整数解 ( x , y ) (x,y) (x,y) 使得 a × x + b × y = gcd ⁡ ( a , b ) a\times x + b\times y = \gcd(a,b) a×x+b×y=gcd(a,b) 成立,其中 gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b) 表示 a a a b b b 的最大公约数。
  • 逆元

从欧几里得算法推导:
gcd ⁡ ( x , y ) → gcd ⁡ ( y , x m o d y ) ⇓ ∀ x n = 1 , y n = 0 ∀ a × x 1 + b × x 1 = gcd ⁡ ⇓ ∀ b × x 2 + ( a m o d b ) × y 2 = gcd ⁡ ∀ a × x 1 + b × x 1 = b × x 2 + ( a m o d b ) × y 2 ∀ a × x 1 + b × y 1 = a × y 1 + b × ( x 2 × a b × y 2 ) \gcd(x, y) \to \gcd(y, x \mod y) \\ \Downarrow \\ \forall x_{n} = 1, y_{n} = 0 \\ \\ \forall a\times x_1 + b \times x_1 = \gcd \\ \Downarrow \\ \forall b\times x_2 + (a\mod b)\times y_2 = \gcd \\ \forall a\times x_1 + b \times x_1 = b\times x_2 + (a\mod b)\times y_2 \\ \forall a\times x_1 + b \times y_1 = a\times y_1 + b\times (x_2\times \frac{a}{b}\times y_2) gcd(x,y)gcd(y,xmody)xn=1,yn=0a×x1+b×x1=gcdb×x2+(amodb)×y2=gcda×x1+b×x1=b×x2+(amodb)×y2a×x1+b×y1=a×y1+b×(x2×ba×y2)

于是反推出原来的值( x 1 , y 1 x_1, y_1 x1,y1):

void exgcd(int a, int b, int &x, int &y) {if (a % b == 0) x = 0, y = 1;else {exgcd(b, a % b, y, x);y -= a / b * x;}
}

证明:
[TODO]

求同余式

对两个整数 a , b a, b a,b,如果它们除以 d d d 的余数相同,则称它们模 d d d 同余,记作 a ≡ b ( m o d d ) a\equiv b (\mod d) ab(modd)

在同余号两侧同时加、减、乘任意整数,同余式仍成立。

我们设一个同余式 a x ≡ c ( m o d m ) ax\equiv c (\mod m) axc(modm),那么可以分讨求解:

  • c m o d gcd ⁡ ( a , m ) ≠ 0 c\mod \gcd(a,m) \neq 0 cmodgcd(a,m)=0,则同余方程 a x ≡ c ( m o d m ) ax\equiv c(\mod\ m) axc(mod m) 无解。
  • c m o d gcd ⁡ ( a , m ) = 0 c\mod \gcd(a, m) = 0 cmodgcd(a,m)=0,则同余方程的解为 $x’ = x + \frac{\gcd(a, m)}{m}\times \mathbb{N} $。

求逆元

对任意给定的 x x x p p p,显然 x × x − 1 ≡ 1 ( m o d p ) x \times x ^ {-1} \equiv 1 (\mod p) x×x11(modp)。可以利用
这个式子计算 x − 1 x ^ {-1} x1

其中 x x x p p p 是已知量,所以上式是一个不定方程, x − 1 x ^ {−1} x1 k k k
是变量。用 exgcd \texttt{exgcd} exgcd 求解可以得到 x − 1 x ^ {−1} x1

C++ \texttt{C++} C++ 代码(线性求逆元):

int n, p, inv[3000010];
signed main() {cin >> n >> p;inv[1] = 1;cout << 1 << endl;for (int i = 2; i <= n; i ++) {inv[i] = (int)(p - p / i) * inv[p % i] % p;printf("%lld\n", inv[i]);}return 0;
}
http://www.xdnf.cn/news/86635.html

相关文章:

  • Spark2 之 memorypool
  • Lua 第7部分 输入输出
  • this._uid:Vue 内部为每个组件实例分配的唯一 ID
  • 基于DeepSeek的文献分析系统
  • 模型 螃蟹效应
  • 详解Windows(七)——更新管理
  • uView的u-modal不显示问题
  • 若依框架二次开发——若依 Vue3 版本前端样式优化指南
  • Spark-streaming(一)
  • 第 1.4 节: G1 人形机器人足球项目定义与课程路线
  • LSTM如何解决梯度消失问题
  • uv包管理器如何安装依赖?
  • 火语言RPA--Ftp删除目录
  • 衡石ChatBI:依托开放架构构建技术驱动的差异化数据服务
  • 现有一整型数组,a[8] = { 4,8,7,0,3,5,9,1},现使用堆排序的方式原地对该数组进行升序排列。那么在进行第一轮排序结束之后,数组的顺序为?
  • 示例:spring xml+注解混合配置
  • FastAPI WebSocket 聊天应用详细教程
  • 搭建 Spark - Local 模式:开启数据处理之旅
  • 掌握 Altium Designer:轻松定制“交换器件”工具栏
  • 智能电网第1期 | 工业交换机在变电站自动化系统中的作用
  • Python 获取淘宝买家订单列表(buyer_order_list)接口的详细指南
  • [创业之路-377]:企业法务 - 有限责任公司与股份有限公司的优缺点对比
  • 如何在 Element UI 中优雅地使用 `this.$loading` 显示和隐藏加载动画
  • PyQt5、NumPy、Pandas 及 ModelArts 综合笔记
  • # 基于PyTorch的食品图像分类系统:从训练到部署全流程指南
  • 第 2.1 节: 机器人仿真环境选择与配置 (Gazebo, MuJoCo, PyBullet)
  • 【Dv3Admin】从零搭建Git项目安装·配置·初始化
  • iPaaS集成平台相比传统集成技术有哪些优势?
  • ECharts中的markPoint使用,最大值,最小值,展示label数值
  • JavaScript 渲染内容爬取实践:Puppeteer 进阶技巧