38 lines
1.1 KiB
Text
38 lines
1.1 KiB
Text
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
|