Evaluate binomial coefficients: Difference between revisions

Content added Content deleted
(Add Seed7 example)
Line 1,373: Line 1,373:


=={{header|Seed7}}==
=={{header|Seed7}}==
The infix operator [http://seed7.sourceforge.net/libraries/integer.htm#%28in_integer%29!%28in_integer%29 !] computes the binomial coefficient.
E.g.: <tt>5 ! 3</tt> evaluates to 10. The binomial coefficient operator works also for negative values of n.
E.g.: <tt>(-6) ! 10</tt> evaluates to 3003.

<lang seed7>$ include "seed7_05.s7i";
<lang seed7>$ include "seed7_05.s7i";


const func integer: binomial (in integer: n, in var integer: k) is func
const proc: main is func
result
var integer: binomial is 0;
local
local
var integer: l is 0;
var integer: n is 0;
var integer: k is 0;
begin
begin
if n >= k then
for n range 0 to 66 do
if k > n - k then
for k range 0 to n do
k := n - k; # Optimization
write(n ! k <& " ");
end if;
end for;
binomial := 1;
writeln;
l := 0;
end for;
while l < k do
binomial *:= n - l;
incr(l);
binomial := binomial div l;
end while;
end if;
end func;

const proc: main is func
begin
writeln("binomial coefficient of (5, 3) is " <& binomial(5, 3));
end func;</lang>
end func;</lang>


{{Out}}
{{Out}}
<pre>
<pre>
1
binomial coefficient of (5, 3) is 10
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
1 10 45 120 210 252 210 120 45 10 1
1 11 55 165 330 462 462 330 165 55 11 1
1 12 66 220 495 792 924 792 495 220 66 12 1
1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1
1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1
1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1
1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1
1 17 136 680 2380 6188 12376 19448 24310 24310 19448 12376 6188 2380 680 136 17 1
1 18 153 816 3060 8568 18564 31824 43758 48620 43758 31824 18564 8568 3060 816 153 18 1
1 19 171 969 3876 11628 27132 50388 75582 92378 92378 75582 50388 27132 11628 3876 969 171 19 1
1 20 190 1140 4845 15504 38760 77520 125970 167960 184756 167960 125970 77520 38760 15504 4845 1140 190 20 1
...
</pre>
</pre>

The library [http://seed7.sourceforge.net/libraries/bigint.htm bigint.s7i] contains a definition of the binomial coefficient operator
[http://seed7.sourceforge.net/libraries/bigint.htm#%28in_bigInteger%29!%28in_var_bigInteger%29 !]
for the type [http://seed7.sourceforge.net/manual/types.htm#bigInteger bigInteger]:

<lang seed7>const func bigInteger: (in bigInteger: n) ! (in var bigInteger: k) is func
result
var bigInteger: binom is 0_;
local
var bigInteger: numerator is 0_;
var bigInteger: denominator is 0_;
begin
if n >= 0_ and k > n >> 1 then
k := n - k;
end if;
if k < 0_ then
binom := 0_;
elsif k = 0_ then
binom := 1_;
else
binom := n;
numerator := pred(n);
denominator := 2_;
while denominator <= k do
binom *:= numerator;
binom := binom div denominator;
decr(numerator);
incr(denominator);
end while;
end if;
end func;
</lang>

Original source [http://seed7.sourceforge.net/algorith/math.htm#binomial_coefficient].


=={{header|Tcl}}==
=={{header|Tcl}}==