扩展欧几里得算法——Python详解

扩展欧几里得

欧几里得算法:

gcd(a, b)

a = b, b = a % b

gcd(a, b)

………

until b = 0

gcd = a

扩展欧几里得算法

a * x + b * y = gcd(a, b)

假设前一个状态

b * x_i - 1 + (a % b) * y_i - 1 = gcd(a, b)

a % b = a - a//b * b

b * x_i - 1 + (a - a//b * b) * y_i - 1 = a * y_i - 1 + b * (x_i - 1 - a // b * b * y_i-1) = gcd

所以下一个状态为 x = y_i - 1, y = x_i - 1 - a // b * b * y_i-1

def exgcd(a, b):
	if (b == 0):
		return 1, 0, a
	x, y, g = exgcd(b, a % b)
	x, y = y, x - a // b * y
	return x, y, g
#test
T = int(input())
for i in range(T):
    n, d, x, y = (int(x) for x in input.strip().split(' '))
    t1, t2, g = exgcd(n, d)
    if (y - x) % g :
        print "Impossible"
    else :
        t2 *= (y - x) // g
        n //= g
        print(t2 % n)
posted @   chanxe  阅读(368)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示