我最近才发现一种生成毕达哥拉斯三元组的方法,通过解释它,包括使用高斯(复数)整数。到目前为止,我已经成功地编写了一个函数,返回由每个高斯整数生成的毕达哥拉斯三元组列表,其中虚部小于实部。
def pyt(max_real):
t = []
real = 2
imag = 1
while real <= max_real:
z = complex(real, imag)**2
t.append((z.real, z.imag, abs(z)))
if imag + 1 == real:
real += 1
imag = 1
else:
imag += 1
return t
问题是有些三元组(比如{9,12,15})不是通过视频中函数所基于的初始步骤生成的,我不确定如何生成它们。
>>> for i in pyt(4):
print(i)
(3.0, 4.0, 5.0)
(8.0, 6.0, 10.0)
(5.0, 12.0, 13.0)
(15.0, 8.0, 17.0)
(12.0, 16.0, 20.0)
(7.0, 24.0, 25.0)
>>> # missing: (9, 12, 15), possibly others
我怎样才能产生每一个可能的三元组,以某种方式使用我已经拥有的或其他的?
最佳答案
编辑:我意识到这实际上可能会错过一些三胞胎,见最后一行的通知。
这个答案是基于你提供的链接。我们将使用以下信息:
我们可以用高斯整数的方法找到所有三个生成器
任何三元组都是上述生成器之一的倍数
要找到一个三元组,我们永远不需要将生成器缩放小于1/2
,从而为我们需要的最大生成器提供上限。
所以这里有一些伪代码,我们可以继续。接下来将介绍一些可能的实现细节。
def pyt(max_real):
max_generator = 2 * max_real
generators = set()
# Find every generator inside our upper bound
for x in [Gaussian integers if abs(x) < max_generator and x.imag < x.real]:
y = x**2
triple = (y.real, y.imag, abs(y))
generators.add(triple)
# Scale up
scaled_up_generators = set()
for a, b, c in generators:
for i in range(max_real / c):
scaled_up_generators.add((i * a, i * b, i * c))
# Scale down
triples = set()
for a, b, c in generators:
common_factors = find_common_factors(a, b, c)
for factor in common_factors:
triples.add((a / factor, b / factor, c / factor))
triples = set()
# Before returning we filter out the triples that are too big.
return filter(lambda triple: triple[2] <= max_real, triples)
上面的代码将恢复所有三元组生成器,最多为所提供范围的两倍。然后通过上下缩放,我们恢复边界内的所有三倍。
您可能想看看找到实现
find_common_factors
,here is a start的共同因素的有效方法。同样,此实现仅基于链接中提供的信息。它也会捕获更多的三倍,但可能不会捕获需要用更细分数缩放的三倍可能有一种更有效的方法来继续,但为此我建议转到MathExchange。