扩展欧几里德数学分析

扩展欧几里德数学分析

此文献给那些对于算法背后的数学知识真正热爱的人,一贯的只谈数学部分的内容,共勉
写这类文章的目的是为了使数学不在那么吓人,网上搜索资料时,有适合我这种对数学不太敏感的人能看懂的博客,所以内容在确保正确性的前提下尽量保证简单易懂
int exgcd(int a, int b, int &x, int &y) {
	if (b == 0) {
    	x = 1; y = 0; return a;
    }
    int ans = exgcd(b, a%b, y, x);
    y -= a / b * x;
    return ans;
}

本文不会过多涉及到代码,只对一些操作说明数学上的正确性

数学分析

引理:存在 x , y 使得 g c d ( a , b ) = a × x + b × y gcd(a,b) = a\times x+b\times y gcd(a,b)=a×x+b×y

证明:

  1. b = 0 b=0 b=0 时,
    a × x + b × y = g c d ( a , b ) = a a\times x + b\times y = gcd(a,b) = a a×x+b×y=gcd(a,b)=a
    易得
    { x = 1 y = 0 \begin{cases} x=1\\ y=0 \end{cases} {x=1y=0
  2. b ≠ 0 b\neq0 b̸=0 时,
    a × x 1 + b × y 1 = g c d ( a , b ) a\times x_1+b\times y_1 = gcd(a,b) a×x1+b×y1=gcd(a,b)
    b × x 2 + ( a % b ) × y 2 = g c d ( b , a % b ) b\times x_2+(a\%b)\times y_2 = gcd(b,a\%b) b×x2+(a%b)×y2=gcd(b,a%b)
    由欧几里德算法(辗转相除法)易得
    g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b) = gcd(b,a\%b) gcd(a,b)=gcd(b,a%b)
    由上式得出
    a × x 1 + b × y 1 = b × x 2 + ( a % b ) × y 2 a\times x_1+b\times y_1 = b\times x_2+(a\%b)\times y_2 a×x1+b×y1=b×x2+(a%b)×y2

    a % b = a − ⌊ a b ⌋ × b a\%b = a-\lfloor\frac{a}{b}\rfloor\times b a%b=aba×b
    则带入式子可得
    a × x 1 + b × y 1 = b × x 2 + ( a − ⌊ a b ⌋ × b ) × y 2 a\times x_1+b\times y_1 = b\times x_2+(a-\lfloor\frac{a}{b}\rfloor\times b)\times y_2 a×x1+b×y1=b×x2+(aba×b)×y2
    进一步整理
    a × x 1 + b × y 1 = a × y 2 + b × ( x 2 − ⌊ a b ⌋ × y 2 ) a\times x_1+b\times y_1 = a\times y_2+b\times(x_2-\lfloor\frac{a}{b}\rfloor\times y_2) a×x1+b×y1=a×y2+b×(x2ba×y2)
    可以解得
    { x 1 = y 2 y 1 = x 2 − ⌊ a b ⌋ × y 2 \begin{cases} x_1=y_2\\ y_1=x_2-\lfloor\frac{a}{b}\rfloor\times y_2 \end{cases} {x1=y2y1=x2ba×y2
    上式即为代码中int ans = exgcd(b, a%b, y, x);y -= a / b * x;关键所在。
    所以在能得出方程解的情况下缩小第二项的系数,即该试的第二项系数成功缩小
    a × x 1 + b × y 1 = b × x 2 + ( a % b ) × y 2 a\times x_1+b\times y_1 = b\times x_2+(a\%b)\times y_2 a×x1+b×y1=b×x2+(a%b)×y2
    递归进行下去,第二项系数会变成 0 ,此时就回到了第一种情况,然后递归地返回答案

应用

解不定方程

经过上面的分析,可以十分确定地知道扩展欧几里德可以解决
a × x + b × y = g c d ( a , b ) a\times x+b\times y=gcd(a,b) a×x+b×y=gcd(a,b)
略微推广一下,同样可以解决下面这样的式子
a × x + b × y = d g c d ( a , b ) ∣ d a\times x+b\times y=d_{gcd(a,b)|d} a×x+b×y=dgcd(a,b)d
注意,解得的 x 和 y 可能为负数,可以对求出来的 x 和 y 进行变形
{ x 0 = x + k × b y 0 = y − k × a \begin{cases} x_0=x+k\times b\\ y_0=y-k\times a \end{cases} {x0=x+k×by0=yk×a
变形的正确性如下,如果一对解 x 和 y 符合原式
a × x + b × y = d a\times x+b\times y=d a×x+b×y=d
则对 x 加上 k 倍的 b,对 y 减去 k 倍的 a ,代入
因Katex不支持导入外部环境使用{align},本地公式截图

求乘法逆元

a × x ≡ 1 ( m o d   p ) a\times x \equiv 1(mod\ p) a×x1(mod p)
那么我们就称 x 为 a 模 p 意义下的乘法逆元,上式可变形为
a × x = 1 + p × ( − y ) a\times x = 1+p\times (-y) a×x=1+p×(y)

a × x + p × y = 1 a\times x + p\times y = 1 a×x+p×y=1
因为原式可得, a 与 p 互质,即
g c d ( a , p ) = 1 gcd(a,p)=1 gcd(a,p)=1
所以带入扩展欧几里德变为解不定方程问题

解一元线性同余方程

求该方程的解
a × x ≡ c ( m o d   b ) a\times x\equiv c(mod\ b) a×xc(mod b)
方程可转换为
a × x + b × y = c a\times x+b\times y=c a×x+b×y=c
当前仅当下式成立时有解, k 为正整数
c = k × g c d ( a , b ) c = k\times gcd(a,b) c=k×gcd(a,b)
r = c g c d ( a , b ) r=\frac{c}{gcd(a,b)} r=gcd(a,b)c ,使得第二个式子两端同时除以 r r r
a × x d + b × y d = g c d ( a , b ) \frac{a\times x}{d}+\frac{b\times y}{d} = gcd(a,b) da×x+db×y=gcd(a,b)
代入扩展欧几里德时相当于求的该式
a × x d + b × y d = g c d ( a , b ) a\times\frac{x}{d}+b\times\frac{y}{d} = gcd(a,b) a×dx+b×dy=gcd(a,b)
求得对应的 x 0 x_0 x0 y 0 y_0 y0 需要乘以 r r r

总结

解决求乘法逆元解一元线性同余方程 问题时都转化为了 解不定方程 ,如果对结果的正符号有要求的,都可以通过 解不定方程 里讲到的变形来处理。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值