// 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;
}