// floriankirsch.de/c++/tripel.html
#include <cmath>
#include <iostream>
// assumes a > b
template<typename T>
T ggt(T a, T b)
{
if (b == 0)
return a;
else
return ggt(b, a % b);
}
void findPrimitiveTripel(int64_t c)
{
int64_t sqrtc = static_cast<int>(std::sqrt(c));
for (int64_t v = 1; v < sqrtc; ++v)
{
for (int64_t u = v + 1; u <= sqrtc; ++u)
{
if (v * v + u * u == c)
{
if (ggt(u, v) == 1 &&
(v + u & 1) == 1)
{
std::cout << u*u - v*v << "² + " << 2*u*v << "² = " << u*u + v*v << "²\n";
}
}
}
}
}
int main() {
for (int c=1; c<100; ++c)
findPrimitiveTripel(c);
return 0;
}
Ly8gZmxvcmlhbmtpcnNjaC5kZS9jKysvdHJpcGVsLmh0bWwKCiNpbmNsdWRlIDxjbWF0aD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKLy8gYXNzdW1lcyBhID4gYgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpUIGdndChUIGEsIFQgYikKewogICAgaWYgKGIgPT0gMCkKICAgICAgICByZXR1cm4gYTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gZ2d0KGIsIGEgJSBiKTsKfQoKdm9pZCBmaW5kUHJpbWl0aXZlVHJpcGVsKGludDY0X3QgYykKewogICAgaW50NjRfdCBzcXJ0YyA9IHN0YXRpY19jYXN0PGludD4oc3RkOjpzcXJ0KGMpKTsKCiAgICBmb3IgKGludDY0X3QgdiA9IDE7IHYgPCBzcXJ0YzsgKyt2KQogICAgewogICAgICAgIGZvciAoaW50NjRfdCB1ID0gdiArIDE7IHUgPD0gc3FydGM7ICsrdSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2ICogdiArIHUgKiB1ID09IGMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChnZ3QodSwgdikgPT0gMSAmJgogICAgICAgICAgICAgICAgICAgICh2ICsgdSAmIDEpID09IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHUqdSAtIHYqdiA8PCAiwrIgKyAiIDw8IDIqdSp2IDw8ICLCsiA9ICIgPDwgdSp1ICsgdip2IDw8ICLCslxuIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKSB7Cglmb3IgKGludCBjPTE7IGM8MTAwOyArK2MpCgkgICAgZmluZFByaW1pdGl2ZVRyaXBlbChjKTsKCXJldHVybiAwOwp9