扩展欧几里得算法、裴蜀定理与乘法逆元

扩展欧几里得算法

扩展欧几里得算法(扩O)能在求gcd(a,b)的同时求出丢番图方程ax+by=gcd(a, b)的解。

然而怎么求呢?我们观察gcd(a, b)=gcd(b, a%b),所以设如下两个方程:

ax+by = gcd(a,b) = d;

bx’+(a%b)y’ = gcd(b,a%b);

明显gcd(a,b) = gcd(b,a%b),也就是ax+by = bx’+(a%b)y’。

为了求得x与y,我们需要保证a,b不变,所以:ax+by = bx’+(a%b)y’ = bx’+(a-[a/b]*b)y’

=ay’ + b(x’ – [a/b]y’)  ([a/b]表示a/b的值向下取整。)

所以可得恒等关系: x = y’ , y = (x’ – [a/b]y’)。这样就求出了一组特解。

那么如何求全解呢?直接给出递推式:

x = x0 + (b/gcd)*t

y = y0 – (a/gcd)*t

明显,b/gcd与a/gcd是互素的,也就是说它们的gcd为1。如果它们再除以一个值,某些解可能就不是整数了。

裴蜀定理

扩O有什么卵用吗?其实它可以求线性丢番图方程(不定方程)。

对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程(称为裴蜀等式):

ax + by = m

有解当且仅当m是d的倍数。因为ax+by=gcd(a,b)。如果m不是d的整数倍的话,m就不是整数了。而因为是丢番图方程,所以a,b,x,y都为整数。m不为整数时方程无解。

裴蜀等式有解时必然有无穷多个整数解,每组解x、y都称为裴蜀数,可用扩O求得。只要将x与y同时乘上m/gcd(a,b)就行了。

特别来说,方程 ax + by = 1 有解当且仅当整数a和b互素。(因为gcd(a,b)=1)

乘法逆元

给定一个形如ax≡1 (mod m)的关于x的方程,x即为a关于m的乘法逆元。

怎么求呢?我们把它等价一下:ax mode m = 1 mod m = 1,ax=m(-y)+1,ax+my=1。

也就是说,只要求出ax+my=1这个方程的解就行了。是不是有点熟悉?对,用扩O+裴蜀求出x,y。

(注意要满足gcd(a,m)=1)

但是明显,一道题目出给你不可能让你输出无数解,通解也不现实,一般是让你求出x最小的正整数解。那怎么办呢?

x的通解是x0+m/gcd*t,在乘法逆元情况下gcd=1,所以不用考虑。所以x的通解是x0+mt。

因为通解是x0+mt,明显最小正整数解的区间是[ 0,m),所以似乎只要让x0%m就可以找到最小解了。

可是万一x0%m是负数呢?答案是取绝对值就好了。(我也不知道为什么)

下面贴代码:(待更)

时间: 2024-10-12 21:16:18

扩展欧几里得算法、裴蜀定理与乘法逆元的相关文章

关于欧几里得算法,裴蜀定理,扩展欧几里得算法证明与解析

欧几里得算法 注:欧几里得算法是用来计算最大公约数的一个算法.主要的代码实现如下: int gcd(int a,int b){ return !b?a:gcd(b,a%b); } 如果这个式子成立的话,不断重复利用这个式子来计算,直到a和b中有一个数变为 0的时候,就可以求出了他们的最大公约数. 举个例子:我们要求gcd(15,30) 运行如下:gcd(15,30)=gcd(30,15)=gcd(15,0)此时的15便是gcd(15,30) 证明过程: 设g = gcd(a,b), 若使gcd(

【bzoj1441】Min 扩展裴蜀定理

题目描述 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1*X1+...An*Xn>0,且S的值最小 输入 第一行给出数字N,代表有N个数 下面一行给出N个数 输出 S的最小值 样例输入 2 4059 -1782 样例输出 99 题解 扩展裴蜀定理 裴蜀定理:二元一次不定方程 $ax+by=c$ 存在整数解的充分必要条件是 $\gcd(a,b)|c$. 扩展裴蜀定理:改成n元一次不定方程,结论依然成立. 证明: $a_1x_1+a_2x_2$ 的取值范围为 $k·\gc

同余|欧拉定理|费马小定理|扩展欧拉定理|扩展欧几里得算法

目录 同余 基本定理 欧拉定理 费马小定理 扩展欧拉定理 扩展欧几里得算法 同余 基本定理 欧拉定理 若a,m互质,则 \[ a^{\varphi\left ( m \right )}\equiv 1\left ( mod \ m \right ) \] 应用 令,,这两个数是互素的.比5小的正整数中与5互素的数有1.2.3和4,所以.计算:,而.与定理结果相符. 计算的个位数,实际是求被10除的余数.7和10互素,且.由欧拉定理知.所以. 费马小定理 若p是质数,则对于任意整数a,都有 \[

noip知识点总结之--欧几里得算法和扩展欧几里得算法

一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a mod b) (其中a mod b != 0)  或  b (其中a mod b == 0) 证明: 后半部分呢...是废话,于是只要证明前半部分即可. 不妨设g = gcd(a, b),于是有 a = g * A, b = g * B 且 (A, B) = 1 故gcd(b, a mod b) =

Wannafly挑战赛22 A-计数器(gcd,裴蜀定理)

原题地址 题目描述 有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an中的任意一个整数,操作次数不限(可以为0次),问计数器的值对m取模后有几种可能. 输入描述: 第一行两个整数n,m接下来一行n个整数表示a1,a2,...,an1≤n≤1001≤m,a1,a2,...,an≤1000000000 输出描述: 输出一个整数表示答案 示例1 输入 复制 3 6 6 4 8 输出 复制 3 题解:假设K1为A1取的个数:根据题意题目变成a1*k1+a2*k2+a

扩展欧几里得算法(exgcd)

Bezout定理: 对于任意整数a,b,存在一对整数x,y满足:a*x+b*y=gcd(a,b) 证明如下: 在欧几里得算法的最后一步:b=0,即:gcd(a,0)=a 对于b>0,根据欧几里得算法gcd(a,b)=gcd(b,a%b).假设存在一对x,y满足:b*x+(a%b)*y=gcd(b,a%b) 因为b*x+(a%b)*y=b*x+(a-b*(a/b))*y=a*y+b*(x-(a/b)*y)   //规定这里和下一行的除号'/'是向下取整. 所以令x'=y,y'=x-(a/b)*y,

扩展欧几里得算法的模板实现

我居然现在还记不住扩欧的板子,我太弱啦! 扩展欧几里得算法解决的是这样的问题: 给定一个不定方程组ax+by=gcd(a,b),求他的一组整数解 先给出实现代码 void exgcd(int a,int b,int &x,int &y) { if(!b) { x=1,y=0;//gcd(a,0)显然等于1*a-0*0=a return a; } int ans=exgcd(b,a%b,x,y); int tem=x; x=y; y-=tem-(a/b)*y; return ans;} 但实

扩展欧几里得算法详解

一:欧几里得算法(辗转相除法) 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a = kb +r 因此d也是(a,b)的公约数 因此(a

扩展欧几里得算法求解不定方程【例 poj 1061】

扩展欧几里得算法是数论当中一种常用的算法,他可以用如下的姿势来表达: 设a, b为不全为0的整数,则存在整数x和y,使得 gcd(a, b) = a*x + b*y. 证明就略去. 树上还有一个拉梅定理:用欧几里得算法计算两个正整数的最大公因子时,所需要的除法次数不会超过两个整数中较小的那个十进制数的倍数的5倍. 拉梅定理的一个推论:求两个正整数a, b, a > b的最大公因子需要O(log2a)3次的位运算. 至于拉梅定理有什么用,暂时还没有研究=—=. 例1 求225和21的最大公因子s,