link numbers link printf procedure main(A) # P-triples plimit := (0 < integer(\A[1])) | 100 # get perimiter limit nonprimitiveS := set() # record unique non-primitives triples primitiveS := set() # record unique primitive triples u := 0 while (g := (u +:= 1)^2) + 3 * u + 2 < plimit / 2 do { every v := seq(1) do { a := g + (i := 2*u*v) b := (h := 2*v^2) + i c := g + h + i if (p := a + b + c) > plimit then break insert( (gcd(u,v)=1 & u%2=1, primitiveS) | nonprimitiveS, memo(a,b,c)) every k := seq(2) do { # k is for larger non-primitives if k*p > plimit then break insert(nonprimitiveS,memo(a*k,b*k,c*k) ) } } } printf("Under perimiter=%d: Pythagorean Triples=%d including primitives=%d\n", plimit,*nonprimitiveS+*primitiveS,*primitiveS) every put(gcol := [] , &collections) printf("Time=%d, Collections: total=%d string=%d block=%d",&time,gcol[1],gcol[3],gcol[4]) end procedure memo(x[]) #: return a csv string of arguments in sorted order every (s := "") ||:= !sort(x) do s ||:= "," return s[1:-1] end