欧几里德 与 扩展欧几里得 学习笔记

最近学了学扩展欧几里得,总结一下

欧几里得算法

欧几里得算法主要用来求a,b的最大公约数,又称为gcd

代码

int Gcd(int a,int b)
{
    if(b==0) return a;
    else return Gcd(b,a%b); 
} 

就是用递归来求解,当 b==0 b == 0 时退出,证明也非常易懂

证明

就是证明 gcd(a,b)=gcd(b,a g c d ( a , b ) = g c d ( b , a mod m o d b) b )
d=gcd(a,b),d|a,d|b d = g c d ( a , b ) , 即 d | a , d | b
a mod m o d b=aba/b,d|a,d|b b = a − b ∗ ⌊ a / b ⌋ ) , d | a , d | b
d|aba/b ∴ d | ( a − b ∗ ⌊ a / b ⌋ )
d|b 又 ∵ d | b
d|gcd(b, ∴ d | g c d ( b , a a mod b) b )

应用

应用就是求 a,b a , b 的最大公约数。

扩展欧几里得算法

扩展欧几里得算法就是求一组 (x,y) ( x , y ) 使得 ax+by=gcd(a,b) a x + b y = g c d ( a , b ) ,又称为 ex e x _ gcd. g c d .

代码

我们就是在求 gcd g c d 的过程中对 x,y x , y 进行计算。
b=0 b = 0 时我们会发现 x=1,y=0 x = 1 , y = 0 时,满足gcd的计算
然后我们再倒着推回去,证明下面;

int Ex_Gcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    int ans=Ex_Gcd(b,a%b,x,y);
    int temp=x;
    x=y;
    y=temp-(a/b)*y;
    return ans;
} 

证明

我们就是来证明递归的时侯 x,y x , y 的计算式
首先我们设 ax+by=gcd(a,b) a x + b y = g c d ( a , b )
又因为 gcd(a,b)=gcd(b,a g c d ( a , b ) = g c d ( b , a mod m o d b)=ax+by b ) = a x + b y
gcd(b,a g c d ( b , a mod m o d b ) ) 代入得
bx1+(aba/b)y1=gcd(b,a mod m o d b) b )
去括号得 ay1+b(x1y1a/b)=gcd(a,b) a y 1 + b ( x 1 − y 1 ∗ ⌊ a / b ⌋ ) = g c d ( a , b )
证完了

通解

我们使用扩展欧几里得算法求出来的解 x,y x , y 只是 ax+by=gcd(a,b) a x + b y = g c d ( a , b ) 其中的一组可行解,有时候题目会要求我们求出一些有限制的解这时候我们就要根据这一组解来求出满足限制的解
通解:
我们设 x,y x , y 是方程的解
x1=x+tlcm(a,b)a,tZ x 1 = x + t ∗ l c m ( a , b ) a , t ∈ Z
y1=ytlcm(a,b)b,tZ y 1 = y − t ∗ l c m ( a , b ) b , t ∈ Z
lcm(a,b) l c m ( a , b ) 表示 a,b a , b 的最小公倍数 lcm(a,b)=abgcd(a,b) l c m ( a , b ) = a b g c d ( a , b )

应用

  1. 求解不定方程 ax+by=c a x + b y = c

    这个看着和上面那一个差不多一样,我们先设 d=gcd(a,b) d = g c d ( a , b )
    我们把方程两遍同时 /gcd(a,b) / g c d ( a , b ) 就可以得到
    a1x+b1y=c1 a 1 x + b 1 y = c 1
    这时候我们发现因为 x,y x , y 都是整数,所以方程有解得条件是 d|c d | c
    然后再同时 /c1 / c 1 得到
    a1xc1+b1yc1=1 a 1 x c 1 + b 1 y c 1 = 1
    我们用Ex_gcd求出一组解再乘回去就可以了.

  2. 求解逆元
    我们用 inv(x) i n v ( x ) 来表示x在 mod m o d p p 下的逆元
    扩展欧几里得还可以用来求解ax1((modp))
    转移一下得: axpk=1 a x − p k = 1 然后我们就可以用扩展欧几里得算法来求出x的值

有不懂的或者有错误的可以留言,谢谢

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值