Arithmetic/Rational: Difference between revisions
Content added Content deleted
m (→{{header|Haskell}}: Applied hlint hindent, specified import, framed it as a finite (rather than non-halting) computation.) |
|||
Line 3,272: | Line 3,272: | ||
perfect: 8128 |
perfect: 8128 |
||
elapsed: 13.56 seconds |
elapsed: 13.56 seconds |
||
perfect: 33550336 |
|||
</pre> |
|||
=== mpq === |
|||
{{libheader|mpfr}} |
|||
Turned out to be slightly slower than native, but worth it for large number support. |
|||
<lang Phix>include builtins/mpfr.e |
|||
function is_perfect(integer num) |
|||
mpq tot = mpq_init(), |
|||
fth = mpq_init() |
|||
sequence f = factors(num,1) |
|||
for i=1 to length(f) do |
|||
mpq_set_si(fth,1,f[i]) |
|||
mpq_add(tot,tot,fth) |
|||
end for |
|||
return mpq_cmp_si(tot,2,1)=0 |
|||
end function |
|||
procedure get_perfect_numbers() |
|||
atom t0 = time() |
|||
for i=2 to power(2,19) do |
|||
if is_perfect(i) then |
|||
printf(1,"perfect: %d\n",i) |
|||
end if |
|||
end for |
|||
printf(1,"elapsed: %3.2f seconds\n",time()-t0) |
|||
integer pn5 = power(2,12)*(power(2,13)-1) -- 5th perfect number |
|||
if is_perfect(pn5) then |
|||
printf(1,"perfect: %d\n",pn5) |
|||
end if |
|||
end procedure |
|||
get_perfect_numbers()</lang> |
|||
{{out}} |
|||
<pre> |
|||
perfect: 6 |
|||
perfect: 28 |
|||
perfect: 496 |
|||
perfect: 8128 |
|||
elapsed: 17.31 seconds |
|||
perfect: 33550336 |
perfect: 33550336 |
||
</pre> |
</pre> |