• 【数论】如何证明gcd/exgcd


    我恨数论

    因为打这篇的时候以为a|b是a是b的倍数,但是懒得改了,索性定义 a|b 为 a是b的倍数

    咳咳,那么进入正题,如何证明gcd,也就是 gcd(a,b) = gcd(b,a%b)?

    首先,设

    p = a/b,c = a mod b

    则a = p*b + c

    m = gcd(a,b),n = gcd(b,c)

    因为m = gcd(a,b),所以 a | m 且 b | m

    因为 b | m

    所以 b * p | m                //  a|b,则a*k|b (k为整数)

    因为a | m

    所以a - b * p | m           //   a|b,则k*b - a | b (k为整数)

    因为 a = p*b + c

    所以 c = a - p*b

    所以 c | m

    因为c | m,且b | m

    所以m为 c,b的公约数

    因为n为 c,b的最大公约数

    所以m <= n

    因为n = gcd(b,c)

    所以 b | n , c | n

    因为 b | n

    所以 b * p | n

    因为 c | n

    所以 b * p + c | n

    因为 a = b * p + c

    所以a | n

    因为a | n,且 b | n

    则n为a,b的公约数

    因为m为a,b的最大公约数

    所以 n <= m

    因为m <= n

    所以m = n

    所以gcd(a,b) = gcd(b,c)

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

    整体思路是:

    先设出一个关系,然后通过关系证明它们的另一个关系

    从gcd(a,b)转换得到b,c是公约数关系,

    从gcd(b,c)转换得到a,b是公约数关系,

    分别得到它们的大小关系,最后求公共解集,得到两个gcd相等

    然后把c带上去,得到我们要证的式子

    证完了gcd,下面可以证exgcd

    exgcd 可以求

    ax + by = gcd(a,b) 中的x,y

    那么,我们设

    ax1 + by1 = gcd(a,b)

    由gcd得出

    ax1 + by1 = gcd(b,a mod b)

    设bx2 + a mod b y2 = gcd(b,a mod b)

    下面用x2开始化简:

    gcd(b, a mod b) = b * x2 + a mod b *y2 

    gcd(b, a mod b) = b * x2 + (a - floor(a/b) * b) * y2

    gcd(b, a mod b) = b * x2 + a * y2 - floor(a/b) * b * y2

    gcd(b, a mod b) = a * y2 + b * x2 - floor(a/b) * b * y2

    gcd(b, a mod b) = a * y2 + b * (x2 - floor(a/b) * y2)

    所以

    ax1 + by1 = gcd(b, a mod b) = bx2 + a mod b y2 = a * y2 + b * (x2 - floor(a/b) * y2)

    所以第一个式子与最后一个式子等量代换得到

    x1 = y2

    y1 = x2 - floor(a/b) * y2

    然后可以通过以上等价式子写出递归,得到x1、y1。

  • 相关阅读:
    github设置添加SSH
    解决方案 git@github.com出现Permission denied (publickey)
    Shell 获取进程号 规格严格
    转线程堆栈获取 规格严格
    NTP搭建(原创) 规格严格
    Ntp完整说明(转载) 规格严格
    JavaAgent(转载) 规格严格
    Location of javaagent jar in bootclasspath 规格严格
    Manifest(转) 规格严格
    分析一下shell(转) 规格严格
  • 原文地址:https://www.cnblogs.com/dudujerry/p/11620447.html
Copyright © 2020-2023  润新知