Pythonで基本ピタゴラス数の生成

import itertools

def gcd(x, y):
    while y:
        x,y = y,x%y
    return x
def pytanum():
    # 基本ピタゴラス数の生成
    # [ピタゴラス数]
    # x^2 + y^2 = z^2 となる (x,y,z) の組
    # [基本ピタゴラス数]
    # x,y,zが互いに素なピタゴラス数
    # [基本ピタゴラス数の生成]
    # gcd a b = 1, a,bの一方が偶数かつ他方が奇数, a>b>0なら
    # 基本ピタゴラス数(a^2-b^2, 2ab, a^2+b^2)
    for a in itertools.count(2):
        a2 = a*a
        for b in xrange([1, 2][a%2], a, 2):
            if gcd(a, b) == 1:
                b2 = b*b
                yield a2-b2, 2*a*b, a2+b2

確認

>>> g = pytanum()
>>> for i in range(10):
...     p = g.next()
...     print p, gcd(p[0], p[1]) == gcd(p[1], p[2]) == gcd(p[2], p[0]) == 1, p[0]**2+ p[1]**2 == p[2]**2
...
(3, 4, 5) True True
(5, 12, 13) True True
(15, 8, 17) True True
(7, 24, 25) True True
(21, 20, 29) True True
(9, 40, 41) True True
(35, 12, 37) True True
(11, 60, 61) True True
(45, 28, 53) True True
(33, 56, 65) True True