Pythagorean triples: Difference between revisions
Content added Content deleted
(+ note last D version) |
(OCaml implementation) |
||
Line 1,088: | Line 1,088: | ||
1000000: 808950 Triples, 70229 Primitives |
1000000: 808950 Triples, 70229 Primitives |
||
</pre> |
</pre> |
||
=={{header|OCaml}}== |
|||
<lang OCaml>let isqrt n = |
|||
let rec iter t = |
|||
let d = n - t*t in |
|||
if (0 <= d) && (d < t+t+1) (* t*t <= n < (t+1)*(t+1) *) |
|||
then t else iter ((t+(n/t))/2) in iter 1 |
|||
let rec gcd a b = |
|||
let t = a mod b in |
|||
if t = 0 then b else gcd b t |
|||
let coprime a b = gcd a b = 1 |
|||
let num_to ms = |
|||
let ctr = ref 0 in |
|||
let prim_ctr = ref 0 in |
|||
let max_m = isqrt (ms/2) in |
|||
for m = 2 to max_m do |
|||
for j = 0 to (m/2) - 1 do |
|||
let n = m-(2*j+1) in |
|||
if coprime m n then |
|||
let s = 2*m*(m+n) in |
|||
if s <= ms then |
|||
(ctr := !ctr + (ms/s); incr prim_ctr) |
|||
done |
|||
done; (!ctr, !prim_ctr) |
|||
let show i = |
|||
let s, p = num_to i in |
|||
Printf.printf "For perimeters up to %d there are %d total and %d primitive\n%!" i s p;; |
|||
List.iter show [ 100; 1000; 10000; 100000; 1000000; 10000000; 100000000 ]</lang> |
|||
Output: |
|||
<pre>For perimeters up to 100 there are 17 total and 7 primitive |
|||
For perimeters up to 1000 there are 325 total and 70 primitive |
|||
For perimeters up to 10000 there are 4858 total and 703 primitive |
|||
For perimeters up to 100000 there are 64741 total and 7026 primitive |
|||
For perimeters up to 1000000 there are 808950 total and 70229 primitive |
|||
For perimeters up to 10000000 there are 9706567 total and 702309 primitive |
|||
For perimeters up to 100000000 there are 113236940 total and 7023027 primitive</pre> |
|||
=={{header|Pascal}}== |
=={{header|Pascal}}== |