如何解决形式为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致谢:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。