A Pythagorean triple is defined as three positive integers 



(
a
,
b
,
c
)


{\displaystyle (a,b,c)}

 where 



a
<
b
<
c


{\displaystyle a<b<c}

, and 




a

2


+

b

2


=

c

2


.


{\displaystyle a^{2}+b^{2}=c^{2}.}



They are called primitive triples if 



a
,
b
,
c


{\displaystyle a,b,c}

 are co-prime, that is, if their pairwise greatest common divisors 





g
c
d


(
a
,
b
)
=


g
c
d


(
a
,
c
)
=


g
c
d


(
b
,
c
)
=
1


{\displaystyle {\rm {gcd}}(a,b)={\rm {gcd}}(a,c)={\rm {gcd}}(b,c)=1}

.

Because of their relationship through the Pythagorean theorem, a, b, and c are co-prime if a and b are co-prime (





g
c
d


(
a
,
b
)
=
1


{\displaystyle {\rm {gcd}}(a,b)=1}

).  

Each triple forms the length of the sides of a right triangle, whose perimeter is 



P
=
a
+
b
+
c


{\displaystyle P=a+b+c}

.



Task

The task is to determine how many Pythagorean triples there are with a perimeter no larger than 100 and the number of these that are primitive.



Extra credit
 
Deal with large values.   Can your program handle a maximum perimeter of 1,000,000?   What about 10,000,000?   100,000,000?

Note: the extra credit is not for you to demonstrate how fast your language is compared to others;   you need a proper algorithm to solve them in a timely manner.



Related tasks

   Euler's sum of powers conjecture 
   List comprehensions
   Pythagorean quadruples 


func GCD(N, D); \Return the greatest common divisor of N and D
int  N, D, R;   \numerator and denominator
[if D > N then
    [R:=D;  D:=N;  N:=R];
while D > 0 do
    [R:= rem(N/D);
    N:= D;
    D:= R;
    ];
return N;
];
 
int Max, PrimCnt, TripCnt, M, N, A, B, C, K, Prim;
[Max:= 10;
repeat  PrimCnt:= 0;  TripCnt:= 0;
        for M:= 2 to Max do
            for N:= 1 to M do
                [if GCD(M,N) = 1 \coprime\ and
                   ((M&1) = 0 xor (N&1) = 0) \one even\ then
                        [A:= M*M - N*N;
                         B:= 2*M*N;
                         C:= M*M + N*N;
                         Prim:= A+B+C;
                         if Prim <= Max then PrimCnt:= PrimCnt+1;
                         for K:= Max/Prim downto 1 do
                            if K*Prim <= Max then TripCnt:= TripCnt+1;
                        ];
                ];
        Format(6, 0);
        Text(0, "Up to");  RlOut(0, float(Max));  
        RlOut(0, float(TripCnt));  Text(0, " triples,");
        RlOut(0, float(PrimCnt));  Text(0, " primitives.^m^j");
        Max:= Max*10;
until   Max > 10_000;
]