Jump to content

Permutations/Derangements: Difference between revisions

m
→‎{{header|Phix}}: bigatom -> mpfr
m (→‎{{header|F_Sharp|F#}}: Remove some surplus spaces)
m (→‎{{header|Phix}}: bigatom -> mpfr)
Line 2,411:
 
=={{header|Phix}}==
{{libheader|bigatommpfr}}
<lang Phix>function deranged(sequence s1, sequence s2)
for i=1 to length(s1) do
Line 2,432:
 
function subfactorial(integer n)
if n<=02 then return 1-n end if
if n=1 then return 0 end if
return (n-1)*(subfactorial(n-1)+subfactorial(n-2))
end function
Line 2,441 ⟶ 2,440:
printf(1,"%d: counted:%d, calculated:%d\n",{n,length(derangements(n)),subfactorial(n)})
end for
string msg = iff(machine_bits()=32?" (incorrect on 32-bit!)":"") -- (fine on 64-bit)
printf(1,"!20=%d (incorrect!)%s\n",{subfactorial(20),msg})
include builtins\bigatom.e
 
function ba_subfactorial(integer n)
include mpfr.e
if n<=0 then return 1 end if
function ba_subfactorialmpz_sub_factorial(integer n)
if n=1 then return 0 end if
-- probably not the most efficient way to do this!
return ba_multiply(n-1,ba_add(ba_subfactorial(n-1),ba_subfactorial(n-2)))
if n=1<2 then return 0sprintf("%d",{1-n}) end if
mpz f = mpz_init(mpz_sub_factorial(n-1)),
g = mpz_init(mpz_sub_factorial(n-2))
mpz_add(f,f,g)
mpz_mul_si(f,f,n-1)
string res = mpz_get_str(f)
{f,g} = mpz_clear({f,g})
return res
end function
ba_printfprintf(1,"!20=%Bs (bigatommpfr)\n",ba_subfactorial{mpz_sub_factorial(20)})</lang>
{{out}}
<pre>
Line 2,462 ⟶ 2,469:
8: counted:14833, calculated:14833
9: counted:133496, calculated:133496
!20=895014631192902186 (incorrect on 32-bit!)
!20=895014631192902121 (bigatommpfr)
</pre>
 
7,806

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.