【学习笔记】扩展欧几里得

扩展欧几里得算法(exgcd)

简介

扩展欧几里得算法基于辗转相除法构建,主要用于求方程

ax+by=c

最小正整数解

步骤

1.求方程ax+by=gcd(a,b)的解


我们构造两个方程

{ax+by=gcd(a,b)bx+(a%b)y=gcd(b,a%b)

因为由欧几里得算法易于得到

gcd(a,b)=gcd(b,a%b)

所以

ax+by=bx+(a%b)y

由此递推易得方程

ax+0y=1

此时方程解为

x=1a

对于a%b我们可以表示为

a%b=abab

将此式带入原方程即可得

ax+by=bx+aybaby

整理可得

ax+by=ay+b(xaby)

因为a=a,b=b
所以

{x=yy=xaby

在写代码时可以用递归实现,先往下递归直到a%b=0得到方程的一个解,然后返回利用x,y和x',y'的关系得到原方程的解

2.求方程ax+by=gcd(a,b)的最小整数解


因为有方程ax+by=gcd(a,b),所以

a(x+b/a)+b(ya/b)=gcd(a,b)

显然x+b/a,ya/b也为方程的一组解
此时,我们把

b/a,a/b

分别称为x,y的一个周期,一般用字母T表示
在步骤1里我们已经得到了方程的一个解x,y
因为

{x=x+kT1y=y+kT2

也为方程的一组解,所以

{x=x%T1y=y%T2

因为无法保证x,y同时都为正整数
所以对于x的最小正整数解为

x=(x%T1+T1)%T1

3.求普遍方程ax+by=c的最小正整数解


我们已经得到了普遍方城ax+by=gcd(a,b)的最小正整数解
我们设

p=c/gcd(a,b)

那么有

apx+bpy=pgcd(a,b)

对比系数易于得到,ax+by=c的对于x的最小正整数解为

{x=pxy=py

显然如果c%gcd(a,b)!=0那么方程无最小正整数解

求逆元

对于求有理数的模运算

(ab)%p

我们可以将其转化为

a%p(1b%p)

1b%p就可以转化为求方程

ax1(%p)

的解
因为1%p=1,所以x就可以看做方程

ax+py=1

最小正整数解,其中x被称为a的逆元
特别的如果p是一个质数,那么根据费马小定律

ap11(%p)aap21(%p)

所以

x=ap2

posted @   GuoSN0410  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示