扩展欧几里得算法——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)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!