形式为x ^ 2--N * y ^ 2 = 1的Diophantine方程的函数

问题描述

我遇到的问题是在Python中正确执行'chakravala'方法。它可以正常运行直到n =181。我试图将composition方法集成到我的函数中,但是遇到了小数点。几乎立即溢出。

字符串文字是我进行集成的尝试,其他所有功能都是在此循环之外运行的功能

    for n in natural_number_generator(1):
    print(n)
    if n in squares_list:
        continue
    else:
        a = floor(sqrt(n))
        b = 1
        k = a ** 2 - n
        answer_list.append(chakravala(n,a,b,k))
        if answer_list[-1][1] > maximum:
            maximum = answer_list[-1][1]
            answer = answer_list[-1][0]
    # Breaks out of main loop when N reaches limit.
    if n >= limit:
        break

实际功能

def chakravala(n,k):
    # Creates variables and prints to check.
    m_list = []
    print(a,k)
    minimum = inf

    # Final step of iteration
    if k == 1:
        return [n,b]

    #Todo: Fix
    """
    if k in [-1,-2,-4,2,4]:
        while True:
            a,b = a ** 2 + n * b ** 2,2 * a * b
            k = k ** 2
            if k != 1:
                a,b = Decimal(a / sqrt(k)),Decimal(b / sqrt(k))
                k = Decimal(k / k)
            else:
                a,b = Decimal(a / k),Decimal(b / k)
                k = Decimal(k / k)
            print(a,k)
            if float(a).is_integer() and float(b).is_integer():
                return [n,b]
            else:
                continue"""

    # Fills our m_list.
    for m in natural_number_generator(1):
        if (a + b * m) % abs(k) == 0:
            m_list.append(m)
            if m >= 2 * n:
                break

    # Finds the m for which abs(m^2 - n) is minimized.
    for i,check_m in enumerate(m_list):
        difference = check_m ** 2 - n
        if difference < minimum:
            m = check_m
            minimum = difference
        elif difference > minimum:
            break

    # Creates the next set of variables for iteration.
    a,b = (a * m + n * b) / abs(k),(a + m * b) / abs(k)
    k = (m ** 2 - n) / k
    a,k = int(a),int(b),int(k)
    return chakravala(n,k)

非常感谢任何帮助。

解决方法

问题在math.stackexchange.com上解决了!我在n = 181时遇到的问题是我正在使用浮点变量,并且它们跨过2 ^ 52的不可见边界。要“解决”问题,只需在/的位置插入几个//。

代码:

def chakravala(n,a,b,k):
# Creates variables and prints to check.
m_list = []
minimum = inf
m = 0
# Final step of iteration
if k == 1:
    return [n,b]

# Fills our m_list.
for m in natural_number_generator(1):
    if (a + b * m) % abs(k) == 0:
        m_list.append(m)
        if m >= 2 * n:
            break

# Finds the m for which abs(m^2 - n) is minimized.
for i,check_m in enumerate(m_list):
    difference = check_m ** 2 - n
    if difference < minimum:
        m = check_m
        minimum = difference
    elif difference > minimum:
        break

# Creates the next set of variables for iteration.
a,b = (a * m + n * b) // abs(k),(a + m * b) // abs(k)
k = (m ** 2 - n) // k
return chakravala(n,k)

再次感谢您在math.stackexchange.com上向Sil致谢:)