Jump to content

Evaluate binomial coefficients: Difference between revisions

m
→‎{{header|Phix}}: now builtins
(Add Swift)
m (→‎{{header|Phix}}: now builtins)
Line 1,793:
 
=={{header|Phix}}==
There is a builtin choose() function which does this. From builtins/factorial.e:
A naive version:
<lang Phix>global function binomchoose(integer n, k)
atom res = 1
return factorial(n)/(factorial(k)*factorial(n-k))
for i=1 to k do
end function
mpz_mul_sires = (res*(r,r,n-i+1))/i
 
end for
?binom(5,3)</lang>
return mpz_get_str(r)res
end function</lang>
Example:
<lang Phix>?binom(5,3)</lang>
{{out}}
<pre>
10
</pre>
However errors will creep in should any result or interim value exceed 9,007,199,254,740,992 (on 32-bit), so (and using a different algorithm just for kicks):
{{libheader|mpfr}}
<lang Phix>include builtins\mpfr.e
?mpz_get_str(mpz_binom(5,3))
function ?mpz_get_str(mpz_binom(integer n100, k50))
?mpz_get_str(mpz_binom(60,30))
mpz r = mpz_init(1)
?mpz_get_str(mpz_binom(1200,120))</lang>
for i=1 to k do
mpz_mul_si(r,r,n-i+1)
if mpz_fdiv_q_ui(r, r, i)!=0 then ?9/0 end if
-- r = ba_divide(ba_multiply(r,n-i+1),i)
end for
return mpz_get_str(r)
end function
?mpz_binom(5,3)
?mpz_binom(100,50)
?mpz_binom(60,30)
?mpz_binom(1200,120)</lang>
{{out}}
<pre>
7,794

edits

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