数论学习(Extended-Euclid)[osily]

 

同时求出 x,y ,使 gcd ( a, b ) = x * a + y * b

 

    扩展欧几里得算法几个月前就听过,但一直没仔细看过,感觉有点高深似的。

    一看发现和我们高代多项式一章学的一个公式很像,不过把多项式变成了数,按理说还应该更简单。

    有的是有返回值的,返回了最大公约数,不过这问题不大。

    这个函数不大好理解,开始我打算用几个数试试,结果根本理不出头绪,结果上网找一找讲解,有点明白了。

    首先要知道 gcd(a, b) = gcd(b, a%b),其实求最大公约数就是用的这个公式。

    这样,gcd(b, a%b) = x' b + y' a%b。其中 x' 和 y' 是本次求出的,和原来的x和y没关系。

继续 = x' b + y' (a - a/b*b) = x' b + y' a - y' a/b*b = y' a + (x' - a/b*y') b。

    其中‘/’为“地板除”。这样 gcd(a, b) = y' a + (x' - a/b*y') b。也就是说,如果我们求出了gcd(b, a%b) = x' b + y' a%b,就可以解出 gcd(a, b) = xa + yb,这样一直下去,我们知道到最后 gcd(b, a%b)会变成 gcd(c, 0)的形式,这时可以解出此时的x'=1 和 y' = 0,这样就可以再往上一层一层求了。

    发现具体用时还是有返回值比较好,另外,有个更简洁的写法:

   

    这样再看是不是明白点了。我想我是明白了,感觉数学不好就是吃亏。

    当然用的时候就不用现推了,当然也很好推,直接记下来就可以了。

    通过写这个总结我发现写总结是很有用的,写之前我还不太明白,写完就基本差不多了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值