gcd_ori = lambda x, y: y == 0 and x or gcd_ori(y, x % y) def gcd(lis): out = lis[0] for i in lis: out = gcd_ori(out, i) return out def calc(i, j): return (i ** 2 - j ** 2, 2 * i * j, i ** 2 + j ** 2) def make(x): out = [] for i in xrange(2, int(x ** 0.5)): for j in xrange(1, i): c = calc(i, j) if gcd(c) == 1: out.append(sum(c)) return out maxx = 1500000 unit = make(maxx) out = set([]) delete = set([]) for i in unit: n = 1 while 1: tmp = i * n if tmp > maxx: break if tmp in out: out.remove(tmp) delete.add(tmp) else: if not tmp in delete: out.add(tmp) n += 1 print len(out)