Python 原始毕达哥拉斯三重代码不起作用

标签 python pythagorean

目前正在尝试使用公式 a = m^2-n^2、b = 2mn、c = m^2 + n^2 查找最大到某个数字 n 的所有原始毕塔哥拉斯三元组。这是代码:

    def prim(k):
        primlist=[]
        for m in range(1,k):
            for n in range(m+1,k+1):
                if m**2+n**2>k:
                    break
                if m%2==1 and n%2==1:
                    break
               if n**2-m**2==0 or 2*m*n ==0 or n**2+m**2==0:
                    break

                if gcd(m,n)!=1:
                    break


                primlist.append([n**2-m**2,2*m*n,n**2+m**2])
        return primlist
    print(prim(100))

我们期望找到所有毕达哥拉斯三元组,但有些缺失,例如 20,21,29。有 16 个 c 低于 100,但我们只得到 6 个。干杯

最佳答案

除了第一个条件(其中 mn 太大)之外,您不想跳出内部循环,只需继续执行下一个条件即可迭代。

以下测试完全是多余的,因为使用您的 mn 它们永远都不会成立。

if n**2-m**2==0 or 2*m*n ==0 or n**2+m**2==0:

所以我已将它们从代码中删除。您没有提供 gcd 函数,也没有从标准库中导入函数,因此我提供了自己的函数。

def gcd(a, b):
    '''  Greatest common divisor of a & b '''
    while b:
        a, b = b, a % b
    return a

def prim(k):
    primlist=[]
    for m in range(1,k):
        for n in range(m+1,k+1):
            if m**2 + n**2 > k:
                break
            if m%2==1 and n%2==1:
                continue
            if gcd(m,n)!=1:
                continue

            primlist.append([n**2 - m**2, 2*m*n, n**2 + m**2])
    return primlist

print(prim(100))

输出

[[3, 4, 5], [15, 8, 17], [35, 12, 37], [63, 16, 65], [5, 12, 13], [21, 20, 29], [45, 28, 53], [77, 36, 85], [7, 24, 25], [55, 48, 73], [9, 40, 41], [33, 56, 65], [65, 72, 97], [11, 60, 61], [39, 80, 89], [13, 84, 85]]

FWIW,这是一种更有效(并且更Pythonic)的编写代码的方法。我们不是构建一个列表,而是构建一个生成器。这样我们就可以打印或使用三元组,当然我们可以轻松地将它们收集到一个列表中,例如 list(prim(100))

def gcd(a, b):
    '''  Greatest common divisor of a & b '''
    while b:
        a, b = b, a % b
    return a

def prim(k):
    for m in range(1, k):
        for n in range(m+1, k+1):
            m2, n2 = m * m, n * n
            if m2 + n2 > k:
                break
            if m % 2 and n % 2:
                continue
            if gcd(m, n) > 1:
                continue

            yield n2 - m2, 2*m*n, n2 + m2

for i, t in enumerate(prim(100), 1):
    print(i, t)

输出

1 (3, 4, 5)
2 (15, 8, 17)
3 (35, 12, 37)
4 (63, 16, 65)
5 (5, 12, 13)
6 (21, 20, 29)
7 (45, 28, 53)
8 (77, 36, 85)
9 (7, 24, 25)
10 (55, 48, 73)
11 (9, 40, 41)
12 (33, 56, 65)
13 (65, 72, 97)
14 (11, 60, 61)
15 (39, 80, 89)
16 (13, 84, 85)

关于Python 原始毕达哥拉斯三重代码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47697254/

相关文章:

python - 使用 NUKE API 缓存脚本

python - Pandas 应用使用最小/最大在可变滚动窗口上执行缓慢

c - 找到 a + b + c = 1000 的毕达哥拉斯三元组

java - 当 a、b 或 c <= 1000 时,更快地找到所有毕达哥拉斯四元数

javascript - 比较多个点之间的距离

c++ - 如何打印出给定范围内的直角三角形的周长和个数?

python - 在 scikit-learn 中训练神经网络计算 'XOR'

python - Keras 卷积秩与 1 个过滤器不一致

java - java中勾股三元组的高效算法

Python TCP 套接字没有关闭?