Python线性丢番图方程

Python线性丢番图方程,python,algorithm,Python,Algorithm,我正在做功课,我正在做一些研究。我找到了寻找丢番图方程的例子方程。 当gcd(a,b)=1时,给出赋值,然后有一个丢番图方程,其中 ax+by=1 我理解这个方程是如何找到x和y的值的,但我不确定这个函数是如何工作的。我得到了函数中有divmod和递归方法的部分,但我不知道它何时停止 很抱歉问了这么多复杂而含糊不清的问题,但我想知道这个等式是如何运作的。我的意思是,这个等式是如何结束的。 例如,当给定数字43和486时,则gcd(43486)=1。 这意味着有一个等式,其中43x+486y=1。

我正在做功课,我正在做一些研究。我找到了寻找丢番图方程的例子方程。 当gcd(a,b)=1时,给出赋值,然后有一个丢番图方程,其中 ax+by=1

我理解这个方程是如何找到x和y的值的,但我不确定这个函数是如何工作的。我得到了函数中有divmod和递归方法的部分,但我不知道它何时停止

很抱歉问了这么多复杂而含糊不清的问题,但我想知道这个等式是如何运作的。我的意思是,这个等式是如何结束的。 例如,当给定数字43和486时,则gcd(43486)=1。 这意味着有一个等式,其中43x+486y=1。答案是43(-113)+486(10)=1。函数solve也得到了x和y值

我试着看完代码,看看它是如何处理的,但我不理解
else:
part

def isolve(a, b):
    quotient, remainder = divmod(a, b)
    if remainder == 0:
        return [0, 1 / b]
    else:
        sol = isolve(b, remainder)
        x = sol[0]
        y = sol[1]
        return [y, x - quotient * y]

我不确定我到底理解了什么,但是让我们考虑下面修改的代码:

def simple_linear_diophantine_r(a,b):
q、 r=divmod(a,b)
如果r==0:
返回(0,b)
其他:
x、 y=简单的线性丢番图(b,r)
返回(y,x-q*y)
a、 b=43486
x、 y=简单的线性丢番图r(a,b)
打印(f'({a})*({x})+({b})*({y})=={a*x+b*y}')
# (43) * (-113) + (486) * (10) == 1
这和预期的一样。与原始代码相比,我重写了数学,只使用了
int
-安全操作(不使用
float
除法)。 此外,我还重命名了函数本身和一些内部变量

到目前为止,这或多或少是你已经知道的

现在,了解发生了什么的一种方法是使用

一种更简单的说明方法是将一些
print()
调用放在战略位置:

def simple_linear_diophantine_r(a, b):
    q, r = divmod(a, b)
    print(f'a={a}, b={b}, q={q}, r={r}')  # DEBUG
    if r == 0:
        return (0, b)
    else:
        x, y = simple_linear_diophantine_r(b, r)
        print(f'x={x}, y={y}')  # DEBUG
        return (y, x - q * y)


a, b = 43, 486
x, y = simple_linear_diophantine_r(a, b)
print(f'({a}) * ({x}) + ({b}) * ({y}) == {a * x + b * y}')
其输出现在是:


现在,您可以更轻松地跟踪每个函数调用时发生的情况。

我还编写了一个线性丢番图程序,该程序具有统计信息,比iv'e使用的egcd python程序更快,因此希望将其包含在这里,以供其他对解决这些问题的程序感兴趣的人使用:

def llinear_diophantinex(a, b, divmodx=1, x=1, y=0, withstats=False):
 origa, origb = a, b
 r=a 
 q = a//b
 prevq=1 
 if withstats == True:
   print(f"a = {a}, b = {b}, q = {q}, r = {r}")  
 while r != 0: 
      prevr = r 
      a,r,b = b, b, r  
      q,r = divmod(a,b)
      x, y = y, x - q * y
      if withstats == True:
        print(f"a = {a}, b = {b}, q = {q}, r = {r}, x = {x}, y = {y}") 
 y = 1 - origb*x // origa - 1
 x,y=y,x
 modx = (-abs(x)*divmodx)%origb
 if withstats == True:
   print(f"x = {x}, y = {y}, modx = {modx}")
 return x, y, modx

@诺洛克2是的,但不是全部。我不理解在else语句之后有sol=solve(b,余数)的部分。这是否意味着sol的值将一次又一次地运行?我不知道会重复多少次。由于我是一名国际学生,我非常缺乏沟通,非常抱歉,非常感谢!!
def llinear_diophantinex(a, b, divmodx=1, x=1, y=0, withstats=False):
 origa, origb = a, b
 r=a 
 q = a//b
 prevq=1 
 if withstats == True:
   print(f"a = {a}, b = {b}, q = {q}, r = {r}")  
 while r != 0: 
      prevr = r 
      a,r,b = b, b, r  
      q,r = divmod(a,b)
      x, y = y, x - q * y
      if withstats == True:
        print(f"a = {a}, b = {b}, q = {q}, r = {r}, x = {x}, y = {y}") 
 y = 1 - origb*x // origa - 1
 x,y=y,x
 modx = (-abs(x)*divmodx)%origb
 if withstats == True:
   print(f"x = {x}, y = {y}, modx = {modx}")
 return x, y, modx
In [5410]: llinear_diophantinex(272,1009, withstats=True)                                                                       
a = 272, b = 1009, q = 0, r = 272
a = 1009, b = 272, q = 3, r = 193, x = 0, y = 1
a = 272, b = 193, q = 1, r = 79, x = 1, y = -1
a = 193, b = 79, q = 2, r = 35, x = -1, y = 3
a = 79, b = 35, q = 2, r = 9, x = 3, y = -7
a = 35, b = 9, q = 3, r = 8, x = -7, y = 24
a = 9, b = 8, q = 1, r = 1, x = 24, y = -31
a = 8, b = 1, q = 8, r = 0, x = -31, y = 272
x = 115, y = -31, modx = 894
Out[5410]: (115, -31, 894)