Evaluate binomial coefficients: Difference between revisions

→‎{{header|Fortran}}: Added version that mitigates against overflow
m (→‎{{header|Phix}}: now builtins)
(→‎{{header|Fortran}}: Added version that mitigates against overflow)
Line 853:
 
=={{header|Fortran}}==
 
=== Direct Method ===
{{works with|Fortran|90 and later}}
<lang fortran>program test_choose
Line 886 ⟶ 888:
end program test_choose</lang>
{{Out}}<pre>10</pre>
 
=== Avoiding Overflow ===
Of course this method doesn't avoid overflow completely just delays it. It could be extended by adding more entries to the '''primes''' array
<lang fortran>
program binomial
integer :: i, j
do j=1,20
write(*,fmt='(i2,a)',advance='no') j,'Cr = '
do i=0,j
write(*,fmt='(i0,a)',advance='no') n_C_r(j,i),' '
end do
write(*,*)
end do
stop
contains
 
pure function n_C_r(n, r) result(bin)
use, intrinsic :: iso_fortran_env, only : int64
integer(int64) :: bin
integer, intent(in) :: n
integer, intent(in) :: r
integer(int64) :: num
integer(int64) :: den
integer :: i, k
integer, parameter :: primes(*) = [2,3,5,7,11]
num = 1
den = 1
do i=0,r-1
num = num*(n-i)
den = den*(i+1)
if (i > 0) then
! Divide out common prime factors
do k=1,size(primes)
if (mod(i,primes(k)) == 0) then
num = num/primes(k)
den = den/primes(k)
end if
end do
end if
end do
bin = num/den
end function n_C_r
 
end program binomial
</lang>
 
{{Out}}
1Cr = 1 1
2Cr = 1 2 1
3Cr = 1 3 3 1
4Cr = 1 4 6 4 1
5Cr = 1 5 10 10 5 1
6Cr = 1 6 15 20 15 6 1
7Cr = 1 7 21 35 35 21 7 1
8Cr = 1 8 28 56 70 56 28 8 1
9Cr = 1 9 36 84 126 126 84 36 9 1
10Cr = 1 10 45 120 210 252 210 120 45 10 1
11Cr = 1 11 55 165 330 462 462 330 165 55 11 1
12Cr = 1 12 66 220 495 792 924 792 495 220 66 12 1
13Cr = 1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1
14Cr = 1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1
15Cr = 1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1
16Cr = 1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1
17Cr = 1 17 136 680 2380 6188 12376 19448 24310 24310 19448 12376 6188 2380 680 136 17 1
18Cr = 1 18 153 816 3060 8568 18564 31824 43758 48620 43758 31824 18564 8568 3060 816 153 18 1
19Cr = 1 19 171 969 3876 11628 27132 50388 75582 92378 92378 75582 50388 27132 11628 3876 969 171 19 1
20Cr = 1 20 190 1140 4845 15504 38760 77520 125970 167960 184756 167960 125970 77520 38760 15504 4845 1140 190 20 1
21Cr = 1 21 210 1330 5985 20349 54264 116280 203490 293930 352716 352716 293930 203490 116280 54264 20349 5985 1330 210 21 1
22Cr = 1 22 231 1540 7315 26334 74613 170544 319770 497420 646646 705432 646646 497420 319770 170544 74613 26334 7315 1540 231 22 1
23Cr = 1 23 253 1771 8855 33649 100947 245157 490314 817190 1144066 1352078 1352078 1144066 817190 490314 245157 100947 33649 8855 1771 253 23 1
24Cr = 1 24 276 2024 10626 42504 134596 346104 735471 1307504 1961256 2496144 2704156 2496144 1961256 1307504 735471 346104 134596 42504 10626 2024 276 24 1
25Cr = 1 25 300 2300 12650 53130 177100 480700 1081575 2042975 3268760 4457400 5200300 5200300 4457400 3268760 2042975 1081575 480700 177100 53130 12650 2300 300 25 1
 
=={{header|FreeBASIC}}==
Anonymous user