3

今、私はこの方法で(プリミティブ)ピタゴラスのトリプルを計算します

def generateTriples(limit):
    for n in xrange(1, limit):
        if (n**2 + (n+1)**2 > limit): 
            break
        for m in xrange(n+1, limit, 2):
            if (n**2 + m**2 > limit): 
                break
            if (gcd(n, m) > 1): 
                continue
            yield (m**2 - n**2, 2*m*n, m**2 + n**2)

しかし、これが行うことは、すべてのレグが制限以下になるすべてのトリプルを出力することです。例えば:

for triple in generateTriples(25):
    print triple
'''
(3, 4, 5)
(15, 8, 17)
(5, 12, 13)
(7, 24, 25)
'''

しかし、私がやりたいのは、足だけを制限するように変更することです. 斜辺は好きなだけ大きくすることができます - 私は min(leg1, leg2) を制限以下にしたいだけです。

また、非プリミティブを生成することも目指しています。つまり、すべての項で k によるスケーリングを意味します (これも min(leg1, leg2) が <= 制限ですが、この方法で重複が発生するのではないかと心配しています。

アドバイスをいただければ幸いです。

4

1 に答える 1

3

この関数は、完全なトリプルの脚とペアになる可能性のある斜辺の最大値を決定し、関数を使用して実際にトリプルを検索します。

from fractions import gcd

def generateTriples(limit):
    for n in xrange(1, limit):
        if (n**2 + (n+1)**2 > limit):
            break
        for m in xrange(n+1, limit, 2):
            if (n**2 + m**2 > limit):
                break
            if (gcd(n, m) > 1):
                continue
            yield (m**2 - n**2, 2*m*n, m**2 + n**2)

def generate_triples_limit_leg(leg):
    limit = leg**2 / 2 + 1

    for triple in generateTriples(limit):
        if min(triple) <= leg:
            yield triple

print list(generate_triples_limit_leg(i))

このバージョンは、すべてのトリプルを検出するわけではありませんが、最小レッグで直接機能します。

def generate_triples(limit):
    # for each number up to the limit
    # Python ranges don't include the max number
    # start from 4 because 1 and 2 are invalid
    # and 3 and 4 give the same triplet
    for i in range(4, limit + 1):
        # if i is odd
        if i % 2:
            # the two larger legs are the integers
            # above and below half of the square of the smallest leg
            # // is floor division
            big = i**2 // 2
            yield i, big, big + 1
        else:
            # the two other legs are the integers
            # above and below half of the smallest leg squared
            big = (i // 2)**2
            yield i, big - 1, big + 1


print list(generate_triples(10))
# [(3, 4, 5), (5, 12, 13), (6, 8, 10),  (7, 24, 25), 
#             (8, 15, 17), (9, 40, 41), (10, 24, 26)]
于 2012-04-18T20:10:32.737 に答える