Pythagorean triples: Difference between revisions
Content added Content deleted
m (→{{header|J}}) |
|||
Line 60: | Line 60: | ||
return 0; |
return 0; |
||
}</lang>output:<lang>Up to 100, there are 17 triples, of which 7 are primitive</lang> |
}</lang>output:<lang>Up to 100, there are 17 triples, of which 7 are primitive</lang> |
||
=={{header|Icon}} and {{header|Unicon}}== |
|||
This uses the elegant formula (#IV) from [[wp:Formulas_for_generating_Pythagorean_triples|Formulas for generating Pythagorean triples]] |
|||
<lang Icon> |
|||
link math |
|||
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</lang> |
|||
{{libheader|Icon Programming Library}} |
|||
[http://www.cs.arizona.edu/icon/library/src/procs/math.icn math.icn provides gcd] |
|||
[http://www.cs.arizona.edu/icon/library/src/procs/printf.icn printf.icn provides printf] |
|||
The output from some sample runs with BLKSIZE=500000000 and STRSIZE=50000000 is below. It starts getting very slow after 10M at about 9 minutes. |
|||
Output:<pre> |
|||
Under perimiter=10: Pythagorean Triples=0 including primitives=0 |
|||
Time=3, Collections: total=0 string=0 block=0 |
|||
Under perimiter=100: Pythagorean Triples=17 including primitives=7 |
|||
Time=3, Collections: total=0 string=0 block=0 |
|||
Under perimiter=1000: Pythagorean Triples=325 including primitives=70 |
|||
Time=6, Collections: total=0 string=0 block=0 |
|||
Under perimiter=10000: Pythagorean Triples=4858 including primitives=703 |
|||
Time=57, Collections: total=0 string=0 block=0 |
|||
Under perimiter=100000: Pythagorean Triples=64741 including primitives=7026 |
|||
Time=738, Collections: total=0 string=0 block=0 |
|||
Under perimiter=1000000: Pythagorean Triples=808950 including primitives=70229 |
|||
Time=12454, Collections: total=0 string=0 block=0 |
|||
Under perimiter=10000000: Pythagorean Triples=9706567 including primitives=702309 |
|||
Time=560625, Collections: total=16 string=8 block=8</pre> |
|||
=={{header|J}}== |
=={{header|J}}== |