扩展欧几里得算法——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)

浙公网安备 33010602011771号