binom.f 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. *DECK BINOM
  2. FUNCTION BINOM (N, M)
  3. C***BEGIN PROLOGUE BINOM
  4. C***PURPOSE Compute the binomial coefficients.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C1
  7. C***TYPE SINGLE PRECISION (BINOM-S, DBINOM-D)
  8. C***KEYWORDS BINOMIAL COEFFICIENTS, FNLIB, SPECIAL FUNCTIONS
  9. C***AUTHOR Fullerton, W., (LANL)
  10. C***DESCRIPTION
  11. C
  12. C BINOM(N,M) calculates the binomial coefficient (N!)/((M!)*(N-M)!).
  13. C
  14. C***REFERENCES (NONE)
  15. C***ROUTINES CALLED ALNREL, R1MACH, R9LGMC, XERMSG
  16. C***REVISION HISTORY (YYMMDD)
  17. C 770701 DATE WRITTEN
  18. C 890531 Changed all specific intrinsics to generic. (WRB)
  19. C 890531 REVISION DATE from Version 3.2
  20. C 891214 Prologue converted to Version 4.0 format. (BAB)
  21. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  22. C 900326 Removed duplicate information from DESCRIPTION section.
  23. C (WRB)
  24. C***END PROLOGUE BINOM
  25. LOGICAL FIRST
  26. SAVE SQ2PIL, BILNMX, FINTMX, FIRST
  27. DATA SQ2PIL / 0.9189385332 0467274E0 /
  28. DATA FIRST /.TRUE./
  29. C***FIRST EXECUTABLE STATEMENT BINOM
  30. IF (FIRST) THEN
  31. BILNMX = LOG (R1MACH(2))
  32. FINTMX = 0.9/R1MACH(3)
  33. ENDIF
  34. FIRST = .FALSE.
  35. C
  36. IF (N .LT. 0 .OR. M .LT. 0) CALL XERMSG ('SLATEC', 'BINOM',
  37. + 'N OR M LT ZERO', 1, 2)
  38. IF (N .LT. M) CALL XERMSG ('SLATEC', 'BINOM', 'N LT M', 2, 2)
  39. C
  40. K = MIN (M, N-M)
  41. IF (K.GT.20) GO TO 30
  42. IF (K*LOG(AMAX0(N,1)).GT.BILNMX) GO TO 30
  43. C
  44. BINOM = 1.
  45. IF (K.EQ.0) RETURN
  46. C
  47. DO 20 I=1,K
  48. BINOM = BINOM * REAL(N-I+1)/I
  49. 20 CONTINUE
  50. C
  51. IF (BINOM.LT.FINTMX) BINOM = AINT (BINOM+0.5)
  52. RETURN
  53. C
  54. C IF K.LT.9, APPROX IS NOT VALID AND ANSWER IS CLOSE TO THE OVERFLOW LIM
  55. 30 IF (K .LT. 9) CALL XERMSG ('SLATEC', 'BINOM',
  56. + 'RESULT OVERFLOWS BECAUSE N AND/OR M TOO BIG', 3, 2)
  57. C
  58. XN = N + 1
  59. XK = K + 1
  60. XNK = N - K + 1
  61. C
  62. CORR = R9LGMC(XN) - R9LGMC(XK) - R9LGMC(XNK)
  63. BINOM = XK*LOG(XNK/XK) - XN*ALNREL(-(XK-1.)/XN)
  64. 1 - 0.5*LOG(XN*XNK/XK) + 1.0 - SQ2PIL + CORR
  65. C
  66. IF (BINOM .GT. BILNMX) CALL XERMSG ('SLATEC', 'BINOM',
  67. + 'RESULT OVERFLOWS BECAUSE N AND/OR M TOO BIG', 3, 2)
  68. C
  69. BINOM = EXP (BINOM)
  70. IF (BINOM.LT.FINTMX) BINOM = AINT (BINOM+0.5)
  71. C
  72. RETURN
  73. END