3

我最近才通过这个解释它的视频发现了一种生成毕达哥拉斯三元组的方法,涉及使用高斯(复数)整数。到目前为止,我已经设法编写了一个函数,该函数返回由每个高斯整数生成的勾股三元组列表,其中虚部小于实部。

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

我将如何生成每一个可能的三元组,以某种方式使用我已经拥有的或其他的?

4

1 回答 1

0

编辑:我意识到这实际上可能会错过一些三元组,请参阅最后一行的通知。

该答案基于您提供的链接。我们将使用以下信息:

  • 我们可以使用高斯整数的方法找到所有三元组

  • 任何三元组都是上述生成器之一的倍数

  • 要找到三元组,我们永远不需要将生成器缩放小于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这是一个开始

同样,此实施仅基于您链接中提供的信息。它还将捕获更多三倍,但可能无法捕获需要按更精细分数缩放的三倍。可能有一种更有效的方法来进行,但为此我建议转向MathExchange

于 2018-03-05T15:46:59.477 回答