gpt4 book ai didi

python - 生成所有 Euler Bricks

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:59 29 4
gpt4 key购买 nike

我最近一直在研究毕达哥拉斯三元组和 Euler Bricks并且想知道生成所有这些的最佳方法是什么。

我从更广泛的阅读中知道有 10 个 c < 1000,我已经编写了一个蛮力代码来找到它们,但是速度非常慢。我只能找到 Saunderson 参数化,它不会生成所有参数。所以我不确定是否有更快的方法。这就是我目前所拥有的代码。

def isint(n):
if n % 1 == 0:
return True
else:
return False


def eulerbrick(n):
euler_list = []
for a in range(1,n):
for b in range(a + 1,n):
for c in range(b + 1,n):
ab = sqrt(a*a + b*b)
ac = sqrt(a*a + c*c)
bc = sqrt(b*b + c*c)

if c > n:
break

if isint(ab) and isint(ac) and isint(bc):
euler = [a,b,c]
euler_list.append(euler)
return euler_list

谢谢你的帮助

最佳答案

我认为,根据维基百科,如果您想要所有 欧拉积木,you can not use any generating formula.

Euler found at least two parametric solutions to the problem, but neither gives all solutions.

但是,您已经说过,您编写了一个蛮力代码来查找它们,但速度太慢了。我认为这源于

ab = sqrt(a*a + b*b)
ac = sqrt(a*a + c*c)
bc = sqrt(b*b + c*c)

对于每一行,您计算两个平方数和平方根 - 这听起来并不多,但最后,这将是总结。

如果您在每个循环部分的开头立即计算平方数并将它们的值存储在新变量中,则可以优化您的代码。此外,您应该尽快检查您已经计算出的数字是否符合欧拉砖的要求。因为如果他们不这样做,您就不必计算其他数字,也可以节省时间。

最后,你有这样的东西:

import math
i = 1
j = 1000
for a in range(i, j):
a_squared = a**2
for b in range(a, j):
b_squared = b**2
d = math.sqrt(a_squared + b_squared)
if not d.is_integer():
continue
for c in range(b, j):
c_squared = c**2
e = math.sqrt(a_squared + c_squared)
if not e.is_integer():
continue
f = math.sqrt(b_squared + c_squared)
if not f.is_integer():
continue
print("a={} b={} c={}".format(a, b, c))

这根本不需要很长时间并打印:

a=44 b=117 c=240
a=85 b=132 c=720
a=88 b=234 c=480
a=132 b=351 c=720
a=140 b=480 c=693
a=160 b=231 c=792
a=176 b=468 c=960
a=240 b=252 c=275
a=480 b=504 c=550
a=720 b=756 c=825

关于python - 生成所有 Euler Bricks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53730084/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com