from itertools import count
for p in count(1):
# checks if we are leaving room for 1/q + 1/r
# 1/p >= 1/2
if 2 >= p:
continue # we need smaller values of 1/p
# checks if we can reach 1/2 with the biggest legal values for 1/q and 1/r
# 1/p + 1/p + 1/p < 1/2
if 3 * 2 < p:
break
for q in count(p):
# checks if we are leaving room for 1/r
# 1/p + 1/q >= 1/2
if 2 * (q + p) >= p * q:
continue
# checks if we can reach 1/2 with the biggest legal value for 1/r
# 1/p + 1/q + 1/q < 1/2
if 2 * (q + 2 * p) < p * q:
break
for r in count(q):
lhs = 2 * (q * r + p * r + p * q)
rhs = p * q * r
# 1/p + 1/q + 1/r > 1/2
if lhs > rhs:
continue
# 1/p + 1/q + 1/r < 1/2
elif lhs < rhs:
break
# 1/p + 1/q + 1/r = 1/2
else:
print p, q, r
ZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNvdW50CmZvciBwIGluIGNvdW50KDEpOgogICAgIyBjaGVja3MgaWYgd2UgYXJlIGxlYXZpbmcgcm9vbSBmb3IgMS9xICsgMS9yCiAgICAjIDEvcCA+PSAxLzIKICAgIGlmIDIgPj0gcDoKICAgICAgICBjb250aW51ZSAjIHdlIG5lZWQgc21hbGxlciB2YWx1ZXMgb2YgMS9wCiAgICAjIGNoZWNrcyBpZiB3ZSBjYW4gcmVhY2ggMS8yIHdpdGggdGhlIGJpZ2dlc3QgbGVnYWwgdmFsdWVzIGZvciAxL3EgYW5kIDEvcgogICAgIyAxL3AgKyAxL3AgKyAxL3AgPCAxLzIKICAgIGlmIDMgKiAyIDwgcDogCiAgICAgICAgYnJlYWsKICAgIGZvciBxIGluIGNvdW50KHApOgogICAgICAgICMgY2hlY2tzIGlmIHdlIGFyZSBsZWF2aW5nIHJvb20gZm9yIDEvcgogICAgICAgICMgMS9wICsgMS9xID49IDEvMgogICAgICAgIGlmIDIgKiAocSArIHApID49IHAgKiBxOiAKICAgICAgICAgICAgY29udGludWUKICAgICAgICAjIGNoZWNrcyBpZiB3ZSBjYW4gcmVhY2ggMS8yIHdpdGggdGhlIGJpZ2dlc3QgbGVnYWwgdmFsdWUgZm9yIDEvcgogICAgICAgICMgMS9wICsgMS9xICsgMS9xIDwgMS8yCiAgICAgICAgaWYgMiAqIChxICsgMiAqIHApIDwgcCAqIHE6CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZm9yIHIgaW4gY291bnQocSk6CiAgICAgICAgICAgIGxocyA9IDIgKiAocSAqIHIgKyBwICogciArIHAgKiBxKQogICAgICAgICAgICByaHMgPSBwICogcSAqIHIKICAgICAgICAgICAgIyAxL3AgKyAxL3EgKyAxL3IgPiAxLzIKICAgICAgICAgICAgaWYgbGhzID4gcmhzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIyAxL3AgKyAxL3EgKyAxL3IgPCAxLzIKICAgICAgICAgICAgZWxpZiBsaHMgPCByaHM6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAjIDEvcCArIDEvcSArIDEvciA9IDEvMgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJpbnQgcCwgcSwgcgo=