The Museum of HP Calculators


Gamma , Digamma , Polygamma & Beta Functions for the HP-41

This program is Copyright © 2006-2007 by Jean-Marc Baillard and is used here by permission.

This program is supplied without representation or warranty of any kind. Jean-Marc Baillard and The Museum of HP Calculators therefore assume no responsibility and shall have no liability, consequential or otherwise, of any kind arising from the use of this program material or any part thereof.


Overview
 

 1°) Gamma Function

   a) Program#1
   b) Program#2 ( more accurate results )
   c) Reciprocal of the Gamma Function
   d) Reciprocal of the Gamma Function ( program#2 )
   e) Logarithm of the Gamma Function
   f) Gamma Function in the complex plane

 2°) Digamma Function

   a) Real Arguments
   b) Complex Arguments

 3°) Polygamma Functions

 4°) Incomplete Gamma Function

   a) Via Kummer's Function, program#1
   b) Via Kummer's Function, program#2 ( new )
   c) A Continued Fraction

 5°) Beta Function

   a) Program#1
   b) Positive Integer Arguments

 6°) Incomplete Beta Function

   a) Via Hypergeometric Functions
   b) A Continued Fraction
 
 

1°) Gamma Function
 

        a) Program#1

-The asymptotic formula  e-x xx-1/2 (2pi)1/2 exp ( 1 + 1/(12x) -1/(360x3) ) is used if x > 16
-Otherwise,  an integer n is added to x such that  x+n > 16  and this formula is then applied to x+n
  with the relation:  Gam(x+n) = (x+n-1) (x+n-2) ...... (x+1) x Gam(x)
-Gam(x) is defined if  x # 0 ; -1 ; -2 ; .......
-Synthetic register M may be replaced by any unused register.
 

Data Registers:  /
Flags: /
Subroutines: /
 

01  LBL "GAM"
02  FRC
03  X#0?
04  GTO 00
05  LASTX
06  1
07  -
08  FACT
09  RTN
10  LBL 00
11  16
12  LASTX
13  STO M
14  GTO 02
15  LBL 01
16  1
17  +
18  ST* M
19  LBL 02
20  X<Y?
21  GTO 01
22  ENTER^
23  X^2
24  SIGN
25  LASTX
26  30
27  *
28  1/X
29  -
30  X<>Y
31  12
32  *
33  /
34  E^X
35  0
36  X<> M
37  /
38  X<>Y
39  1
40  E^X
41  /
42  R^
43  Y^X
44  *
45  X<>Y
46  PI
47  *
48  ST+ X
49  SQRT
50  *
51  END

( 69 bytes / SIZE 000 )
 
 
      STACK         INPUT      OUTPUT
           X              x        Gam(x)

 

Example:    Compute   Gam(PI)  and  Gam (-6.14)

      PI   XEQ "GAM"  yields     2.288037783    ( in 5 seconds )
  -6.14      R/S            ------    -0.007872567    ( in 7 seconds )
 

        b) Program#2
 

-In order to avoid a loss of significant digits if  x < 10 , the following routine uses more terms of the asymptotic series.
 
 

Data Registers:  /
Flags: /
Subroutines: /
 

01  LBL "GAM+"
02  FRC                           lines 02 to 10 take advantage of the built in FACT function
03  X#0?                          but they can be deleted after replacing line 14 by  X<>Y
04  GTO 00
05  LASTX
06  1
07  -
08  FACT
09  RTN
10  LBL 00
11  5
12  STO M
13  ST/ M
14  LASTX
15  LBL 01
16  X>Y?
17  GTO 02
18  ST* M
19  1
20  +
21  GTO 01
22  LBL 02
23  ENTER^
24  ENTER^
25  X^2
26  99
27  *
28  1/X
29  140
30  1/X
31  -
32  X<>Y
33  X^2
34  /
35  105
36  1/X
37  +
38  X<>Y
39  X^2
40  /
41  30
42  1/X
43  -
44  X<>Y
45  X^2
46  /
47  1
48  +
49  12
50  /
51  X<>Y
52  ST/ Y
53  -
54  E^X
55  X<>Y
56  R^
57  .5
58  ST- Y                    these lines avoid an OUT OF RANGE for  x > 57
59  *
60  Y^X
61  ST* Y
62  *
63  PI
64  ST+ X
65  SQRT
66  *
67  0
68  X<> M
69  /
70  END

( 98 bytes / SIZE 000 )
 
 
 
      STACK         INPUT      OUTPUT
           X              x        Gam(x)

 

Example:    Compute   Gam(PI)  and  Gam (-6.14)

      PI   XEQ "GAM+"  yields     2.288037795          ( in 4 seconds )
  -6.14      R/S              ------    -0.007872567231    ( in 6 seconds )     ( the last 2 decimals should be 20 )
 
 

       c) Reciprocal of the Gamma Function
 

-It's sometimes worthwhile to use a program which computes 1/Gam(x) because this function is defined for any x-value.
-Thus, it may avoid tests when  x = 0 ; -1 ; -2 ; -3 ; ......

Data Registers: /
Flags: /
Subroutines: /
 

01  LBL "1/G"
02  STO M
03  16
04  X<>Y
05  GTO 02
06  LBL 01
07  1
08  +
09  ST* M
10  LBL 02
11  X<Y?
12  GTO 01
13  ENTER^
14  ENTER^
15  X^2
16  30
17  *
18  1/X
19  1
20  -
21  X<>Y
22  12
23  *
24  /
25  E^X
26  0
27  X<> M
28  *
29  X<>Y
30  1
31  E^X
32  /
33  R^
34  Y^X
35  /
36  X<>Y
37  PI
38  *
39  ST+ X
40  SQRT
41  /
42  END

( 59 bytes / SIZE 000 )
 
 
 
      STACK        INPUTS      OUTPUTS
           X              x        1 / gam(x)

Example:      PI  XEQ "1/G"  >>>>  1/Gam(pi)  =  0.437055720  ( in 5 seconds )
                     -3       R/S         >>>>   1/Gam(-3) = 0
 
 

       d) Reciprocal of the Gamma Function  ( Program#2 )
 

- "1/G+" uses the same method as "GAM+" for more accurate results
 

Data Registers: /
Flags: /
Subroutines: /
 

01  LBL "1/G+"
02  5
03  STO M
04  ST/ M
05  X<>Y
06  LBL 01
07  X>Y?
08  GTO 02
09  ST* M
10  1
11  +
12  GTO 01
13  LBL 02
14  ENTER^
15  ENTER^
16  X^2
17  99
18  *
19  1/X
20  140
21  1/X
22  -
23  X<>Y
24  X^2
25  /
26  105
27  1/X
28  +
29  X<>Y
30  X^2
31  /
32  30
33  1/X
34  -
35  X<>Y
36  X^2
37  /
38  1
39  +
40  12
41  CHS
42  /
43  X<>Y
44  ST/ Y
45  +
46  E^X
47  0
48  X<> M
49  *
50  X<>Y
51  R^
52  CHS
53  .5
54  ST+ Y
55  *
56  Y^X
57  ST* Y
58  *
59  PI
60  ST+ X
61  SQRT
62  /
63  END

( 89 bytes / SIZE 000 )
 
 
 
      STACK        INPUTS      OUTPUTS
           X              x       1 / gam(x)

Example:      PI  XEQ "1/G+"  >>>>  1/Gam(pi)  =  0.4370557174  ( in 4 seconds )
                     -3        R/S         >>>>   1/Gam(-3) = 0                        ( in 5 seconds )
 
 

       e) Logarithm of the Gamma Function ( large arguments )
 

-This program evaluates  log | Gam(x) |  and it's especially useful if n > 69

Data Registers: /
Flags: /
Subroutines: /
 
 

01  LBL "LOGAM"
02  ENTER^
03  ABS
04  LOG
05  STO M
06  16
07  RCL Z
08  LBL 01
09  1
10  +
11  STO Z
12  ABS
13  LOG
14  ST+ M
15  X<> Z
16  X<Y?
17  GTO 01
18  ENTER^
19  X^2
20  SIGN
21  LASTX
22  30
23  *
24  1/X
25  -
26  X<>Y
27  12
28  *
29  /
30  X<>Y
31  -
32  10
33  LN
34  /
35  X<>Y
36  ENTER^
37  LOG
38  *
39  +
40  X<>Y
41  PI
42  *
43  ST+ X
44  SQRT
45  LOG
46  +
47  0
48  X<> M
49  -
50  END

( 72 bytes / SIZE 000 )
 
 
      STACK        INPUTS      OUTPUTS
           X              x     log | gam(x) |

Example:    1000  XEQ "LOGAM"  yields   log | gam(1000) |  = 2564.604644   whence  gam(1000) = 4.02387  102564
 

-If you prefer   ln | gam(x) |  instead of  log | gam(x) |  , delete lines 32-33-34 and replace all the LOG  with  LN
 

      f) Gamma Function in the complex plane
 

-This program employs the same asymptotic formula as "GAM"

Data Registers:  R00 to R05: temp
Flags: /
Subroutine: /
 

01  LBL "GAMZ"
02  RAD
03  STO 01
04  X<>Y
05  STO 02
06  1
07  STO 03
08  CLX
09  STO 04
10  LBL 01
11  16
12  RCL 01
13  X>Y?
14  GTO 02
15  RCL 02
16  X<>Y
17  R-P
18  ST* 03
19  X<>Y
20  ST+ 04
21  1
22  ST+ 01
23  GTO 01
24  LBL 02
25  RCL 02
26  RCL 01
27  R-P
28  2
29  CHS
30  ST* Z
31  Y^X
32  360
33  CHS
34  /
35  P-R
36  12
37  1/X
38  +
39  R-P
40  RCL 02
41  RCL 01
42  R-P
43  RDN
44  ST- Z
45  X<> T
46  /
47  P-R
48  X<>Y
49  RCL 02
50  -
51  STO 00
52  X<>Y
53  RCL 01
54  -
55  STO 05
56  RCL 02
57  RCL 01
58  .5
59  -
60  R-P
61  RCL 02
62  RCL 01
63  R-P
64  LN
65  R-P
66  RDN
67  ST+ Z
68  X<> T
69  *
70  P-R
71  X<>Y
72  RCL 00
73  +
74  RCL 04
75  -
76  X<>Y
77  RCL 05
78  +
79  E^X
80  RCL 03
81  /
82  PI
83  ST+ X
84  SQRT
85  *
86  P-R
87  DEG
88  END

( 113 bytes / SIZE 006 )
 
 
      STACK        INPUTS      OUTPUTS
           Y             y             B
           X             x             A

  where  Gam(x+iy) = A + iB

Example:    Compute   Gam(1+2i)

     2   ENTER^
     1   XEQ "GAMZ"   yields  0.151904003
              X<>Y                       0.019804881        thus,   Gam(1+2i) = 0.151904003 + 0.019804881. i      ( in 21 seconds )

Note:   -If you prefer to obtain  Ln(Gam(x+iy)) , simply replace line 86 by LN
           -For instance,  Ln(Gam(2+3i)) = -1.876078781 + 0.129646321 i
 
 

2°) Digamma Function
 

        a) Real Arguments
 

-The Digamma ( or Psi ) function is defined by   Psi(x) = Gam'(x)/Gam(x)   where  Gam'(x) is the first derivative of Gam(x)
-The asymptotic expansion  Psi(x) = ln x - 1/(2x) -1/(12x2) + 1/(120x4) - 1/(252x6) + 1/(240x8)  is used for  x > 8
  together with the property:  Psi(x+1) = Psi(x) + 1/x
 

Data Registers:  /
Flags: /
Subroutines: /

-Synthetic registers M & N may be replaced by R00 & R01
-In this case, delete line 41 and replace line 02 with    0   STO 00   RDN
 

01  LBL "PSI"
02  CLA
03  8
04  X<>Y
05  LBL 01
06  1/X
07  ST+ M
08  X<> L
09  1
10  +
11  X<Y?
12  GTO 01
13  1/X
14  STO N
15  X^2
16  ENTER^
17  STO Z
18  20
19  /
20  21
21  1/X
22  -
23  *
24  .1
25  +
26  *
27  1
28  -
29  *
30  12
31  /
32  RCL N
33  LN
34  LASTX
35  2
36  /
37  +
38  -
39  RCL M
40  -
41  CLA
42  END

( 61 bytes / SIZE 000 )
 
 
 
      STACK         INPUT      OUTPUT
           X              x        Psi(x)

Example:    Compute Digamma(-1.6) & Digamma(1)

  -1.6  XEQ "PSI"  >>>  Digam(-1.6) = Psi(-1.6) = -0.269717876   ( in 4 seconds )
     1         R/S        >>>   Psi(1) = -0.577215665 = the opposite of the Euler's constant  ( 0.5772156649 )
 
 

        b) Complex Arguments
 

Data Registers:  R00 thru R05: temp
Flags: /
Subroutines: /
 

01  LBL "PSIZ"
02  STO 01
03  X<>Y
04  STO 02
05  CLX
06  STO 03
07  STO 04
08  LBL 01
09  10
10  RCL 01
11  X>Y?
12  GTO 02
13  RCL 02
14  X<>Y
15  R-P
16  1/X
17  X<>Y
18  CHS
19  X<>Y
20  P-R
21  ST+ 03
22  X<>Y
23  ST+ 04
24  1
25  ST+ 01
26  GTO 01
27  LBL 02
28  RCL 02
29  RCL 01
30  R-P
31  X^2
32  STO 00
33  1/X
34  X<>Y
35  ST+ X
36  STO 05
37  CHS
38  X<>Y
39  21
40  /
41  P-R
42  .1
43  -
44  R-P
45  RCL 00
46  /
47  X<>Y
48  RCL 05
49  -
50  X<>Y
51  P-R
52  1
53  +
54  R-P
55  12
56  /
57  RCL 02
58  RCL 01
59  R-P
60  RDN
61  ST- Z
62  X<> T
63  /
64  P-R
65  .5
66  +
67  R-P
68  RCL 02
69  RCL 01
70  R-P
71  RDN
72  ST- Z
73  X<> T
74  /
75  P-R
76  RCL 02
77  RCL 01
78  RAD
79  R-P
80  LN
81  DEG
82  R^
83  ST- Z
84  X<> T
85  -
86  RCL 04
87  ST- Z
88  X<> 03
89  -
90  END

( 118 bytes / SIZE 006 )
 
 
 
      STACK        INPUTS      OUTPUTS
           Y             y             b
           X             x             a

     with  Psi(x+i.y) = a + i.b
 

Example:     0.7  ENTER^
                    1.6  XEQ "PSIZ"  >>>>  0.276737830    X<>Y    0.546421305    ( in 23 seconds )

  Whence   Psi(1.6+0.7.i) = 0.276737830 + i. 0.546421305
 
 

3°) Polygamma Functions
 

-The following program calculates the nth derivative of the Psi function   ( n = 0 ; 1 ; 2 ; ..... )
-  Psi'(x) = the Trigamma function ,  Psi''(x) = the Tetragamma function ... etc ...
-The asymptotic expansion of the Psi-function is derived n times and the recurrence relation  Psi(n)(x+1) = Psi(n)(x) + (-1)nn! x-n-1 is used.
 

Data Registers:  /
Flags: /
Subroutines: /

-Synthetic registers M N O may be replaced by R00 R01 R02
-In this case, delete line 95 and replace line 02 with    0   STO 00   RDN
 

01  LBL "PSIN"
02  CLA
03  X<>Y
04  STO O
05  8
06  +
07  X<>Y
08  STO N
09  LBL 01
10  RCL O
11  1
12  ST+ N
13  +
14  CHS
15  Y^X
16  ST+ M
17  CLX
18  RCL N
19  X<Y?
20  GTO 01
21  1/X
22  X^2
23  STO Y
24  RCL O
25  7
26  +
27  FACT
28  7
29  FACT
30  /
31  *
32  20
33  /
34  RCL O
35  5
36  +
37  FACT
38  2520
39  /
40  -
41  *
42  RCL O
43  3
44  +
45  FACT
46  60
47  /
48  +
49  *
50  RCL O
51  1
52  +
53  FACT
54  -
55  *
56  12
57  /
58  RCL N
59  RCL O
60  Y^X
61  ST/ Y
62  RCL N
63  *
64  RCL O
65  FACT
66  ST* M
67  X<>Y
68  ST+ X
69  /
70  -
71  RCL O
72  X=0?
73  GTO 02
74  1
75  -
76  FACT
77  RCL N
78  RCL O
79  Y^X
80  /
81  -
82  GTO 03
83  LBL 02
84  X<> N
85  LN
86  +
87  LBL 03
88  RCL M
89  -
90  1
91  CHS
92  RCL O
93  Y^X
94  *
95  CLA
96  END

( 138 bytes / SIZE 000 )
 
 
 
      STACK        INPUTS     OUTPUTS
           Y             n            /
           X             x       Psi(n)(x)

                                   ( if n = 0  we have the Digamma ( or Psi- ) function
                                     if n = 1  ------------ Trigamma function
                                     if n = 2  ------------ Tetragamma function and so on ... )

Examples:    Calculate Digamma(-1.6)  Trigamma(-1.6)  Tetragamma(-1.6)  Pentagamma(-1.6)

   0   ENTER^
-1.6  XEQ "PSIN"  >>>  Digam(-1.6) = Psi(-1.6) = -0.269717877

   1   ENTER^
-1.6     R/S             >>>  Trigam(-1.6) = 10.44375936

   2   ENTER^
-1.6     R/S             >>>  Tetragam(-1.6) = -22.49158811

   3   ENTER^
-1.6     R/S             >>>  Pentagam(-1.6) = 283.4070827    ... etc ...   ( execution time is about 13 seconds for these examples )
 

4°) Incomplete Gamma Function
 

        a) Via Kummer's Function, program#1
 

-The incomplete gamma function is defind by    igam(a,x) =  §0x  e -t ta-1 dt    ( § denotes integrals )
  but this program uses the following relation:

Formula:      igam(a,x) =  (xa/a).exp(-x).M(1,a+1,x)         ( M = Kummer's Function )
 

Data Registers:         R00 = x   ,   R01 = 1  ,   R02 = 1+a  ,  R03 = a
Flags: /
Subroutine:  "KUM"  ( cf "Kummer's Function for the HP-41" )
 

01  LBL "IGAM"
02  X<>Y
03  STO 03
04  1
05  STO 01
06  +
07  STO 02
08  X<>Y
09  XEQ "KUM"
10  RCL 00
11  E^X
12  /
13  RCL 00
14  RCL 03
15  ST/ Z
16  Y^X
17  *
18  END

( 32 bytes / SIZE 004 )
 
 
      STACK        INPUTS     OUTPUTS
           Y             a            /
           X             x      igam(a,x)

Examples:

       3  ENTER^
       4  XEQ "IGAM"  >>>>  igam(3,4) = 1.523793389   ( in 13 seconds )

     1.2  ENTER^
     1.7    R/S         >>>>   igam( 1.2 , 1.7 ) = 0.697290898  ( in 10s )
 

-Another "incomplete gamma function" is also defined by  P(a,x) = igam(a,x)/GAMMA(a)
-When  x tends to infiniy,  igam(a,x) tends to GAMMA(a)
 

        b) Via Kummer's Function, program#2
 

-"IGAM" may produce inaccurate results if x is a large negative number.
-The following routine is preferable in this case.

Formula:      igam(a,x) =  (xa/a).M(a,a+1,-x)         ( M = Kummer's Function )
 

Data Registers:         R00 = -x   ,   R01 = a  ,   R02 = 1+a
Flags: /
Subroutine:  "KUM"  ( cf "Kummer's Function for the HP-41" )
 

01  LBL "IGAM2"
02  X<>Y
03  STO 01
04  1
05  +
06  STO 02
07  X<>Y
08  CHS
09  XEQ "KUM"
10  RCL 00
11  CHS
12  RCL 01
13  ST/ Z
14  Y^X
15  *
16  END

( 31 bytes / SIZE 003 )
 
 
      STACK        INPUTS     OUTPUTS
           Y             a            /
           X             x      igam(a,x)

Example:

          3   ENTER^
       -20  XEQ "IGAM2"  >>>>  igam(3,-20) = -1.756298007 10 -11   ( in 31 seconds )

-All the digits are correct.
-With the same parameters, "IGAM" gives  -1.756454406 10 -11
 

        c) A continued Fraction
 

-We may also use the continued fraction hereunder to compute GAM(a,x) = GAMMA(a) - igam(a,x)

                                          1       1.(a-1)    2.(a-2)
  GAM(a,x) = e -x xa  [  --------  --------  --------- .................... ]
                                     x+1-a+  x+3-a+   x+5-a+
 

Data Registers:        R00 thru R08 are used by "CFR"   R01 = x , R09 = a
Flags: /
Subroutine:  "CFR"  ( cf "Continued Fractions for the HP-41" )
 

01  LBL "IGF"
02  STO 01
03  X<>Y
04  STO 09
05  CLX
06  X<>Y
07  "T"                      ( the same character as line 19 )
08  ASTO 00
09  CLA
10  XEQ "CFR"
11  RCL 01
12  E^X
13  /
14  RCL 01
15  RCL 09
16  Y^X
17  *
18  RTN
19  LBL "T"
20  RCL 01
21  RCL 02
22  ST+ X
23  DSE X
24  +
25  RCL 09
26  ST- Y
27  RCL 02
28  1
29  -
30  -
31  X=0?
32  RTN
33  LASTX
34  *
35  X=0?
36  SIGN
37  END

( 58 bytes / SIZE 010 )
 
 
      STACK        INPUTS     OUTPUTS
           Y             a            /
           X             x      GAM(a,x)

Example:

   PI  7  XEQ "IGF"  >>>>  GAM(PI,7) = 0.07985329094  ( in 15 seconds )

-This method is especially useful for "large" x-values.
 

5°) Beta Function
 

        a) Program#1
 

-The Beta function is defined by the integral:   B(x,y) = §01  tx-1 (1-t)y-1 dt
-But we have also    B(x,y) = B(y,x) = GAM(x).GAM(y)/GAM(x+y)
 

Data Registers: /
Flags: /
Subroutine:  "GAM+" or "GAM"

( Synthetic registers  N , O may be replaced by any standard registers )

01  LBL "BETA"
02  STO N
03  X<>Y
04  STO O
05  XEQ "GAM+"
06  X<> N
07  ST+ O
08  XEQ "GAM+"
09  ST* N
10  RCL O
11  XEQ "GAM+"
12  ST/ N
13  X<> N
14  CLA
15  END

( 47 bytes / SIZE 000 )
 
 
      STACK        INPUTS     OUTPUTS
           Y             y            /
           X             x        B(x,y)

Example:    1  E^X   PI   XEQ"BETA"  >>>>  B(e,Pi) = 0.03789029877  ( in 11 seconds )
 

-An OUT OF RANGE will occur if  x+y is greater than about  70.9
-So it's often better to use "LOGAM" provided all the gammas are positive.
 

        b) Positive Integer Arguments
 

-If the arguments are both positive integers m , n , we can avoid any subroutine
 because in this case, B(m,n) = (m-1)!(n-1)!/(m+n-1)!
 

01  LBL "BMN"
02  X>Y?                         lines 02-03 is useful to reduce execution time
03  X<>Y
04  ST+ Y
05  1
06  GTO 02
07  LBL 01
08  RCL Y
09  *
10  R^
11  /
12  LBL 02
13  DSE Z
14  DSE Y
15  GTO 01
16  RCL Z
17  /
18  END

( 33 bytes / SIZE 000 )
 
 
      STACK        INPUTS     OUTPUTS
           Y             m            /
           X             n        B(m,n)

Example:    100  ENTER^   200  XEQ "BMN"  >>>>   B(100,200) = 3.607285453 10 -84  ( in 32 seconds )
 

-This elementary method also avoids many overflows
-This program does not check the arguments, and negative m , n
  may produce an infinite loop:  add  TEXT0  or  STO X  or another  NOP  after line 13
 

6°) Incomplete Beta Function
 

        a) Via Hypergeometric Functions
 

-The incomplete Beta function is defined by   Bx(a,b) = §0x  ta-1 (1-t)b-1 dt       ( a , b > 0 )
-We have also  Bx(a,b) = (xa/a) (1-x)b F(1,a+b,a+1,x)   where  F is the hypergeometric function
  and this formula is used by the program hereafter.
 

Data Registers:  R00 = x ,  R01 = 1 ,  R02 = a+b ,  R03 = a+1 , R04 = a
Flags: /
Subroutine:  "HGF"  ( cf "Hypergeometric Functions for the HP-41" )
 

01  LBL "IBETA"
02  STO 00
03  RDN
04  STO 02
05  X<>Y
06  ST+ 02
07  STO 03
08  R^
09  X<>Y
10  Y^X
11  LASTX
12  /
13  1
14  STO 01
15  ST+ 03
16  RCL 00
17  -
18  R^
19  Y^X
20  *
21  STO 04
22  RCL 00
23  XEQ "HGF"
24  RCL 04
25  *
26  END

( 42 bytes / SIZE 005 )
 
 
      STACK        INPUTS     OUTPUTS
           Z             a            /
           Y             b            /
           X             x        Bx(a,b)

Examples:

    PI
     1   E^X
   0.7  XEQ "IBETA"  >>>>  B0.7(Pi,e) =  0.02962304602   ( in 57 seconds )

   21   ENTER^
   40   ENTER^
  0.4      R/S        >>>>   B0.4(21,40) =  4.898975630 10 -18   ( in 46s )

-There is a simpler formula to compute Bx(a,b) = (xa/a)  F(a,1-b,a+1,x)   but it would yield meaningless results if b is large ( example2 above )
-Otherwise, the convergence is often faster and the program is shorter.

-If  x is very close to 1 , you can also use the relation  Bx(a,b) = B(a,b) -  B1-x(b,a)
-Another "Incomplete Beta Function" is defined by  Ix(a,b) = Bx(a,b) / B(a,b)             ( use "BETA" to compute Ix(a,b)  )
 

        b) A continued Fraction

                                                                                                                                                  1     d1    d2
-We have another relation to calculate the incomplete beta function:   Bx(a,b) =  (xa/a) (1-x)b  [  ----  ----  ---- ........  ]
                                                                                                                                                 1+    1+   1+

      where  d2m = m(b-m).x/[(a+2m)(a+2m-1)]    and   d2m+1 = -(a+m)(a+b+m).x/[(a+2m)(a+2m+1)]
 
 

Data Registers:        R00 thru R08 are used by "CFR"   R01 = x , R09 = a , R10 = b
Flags: /
Subroutine:  "CFR"  ( cf "Continued Fractions for the HP-41" )
 

01  LBL "IBETA2"
02  RDN
03  STO 10
04  RDN
05  STO 09
06  1
07  R^
08  "T"                             the same character as line 25
09  ASTO 00
10  CLA
11  XEQ "CFR"
12  1/X
13  RCL 01
14  RCL 09
15  ST/ Z
16  Y^X
17  *
18  1
19  RCL 01
20  -
21  RCL 10
22  Y^X
23  *
24  RTN
25  LBL "T"
26  RCL 02
27  2
28  /
29  ENTER^
30  INT
31  X=Y?
32  GTO 01
33  RCL 09
34  +
35  STO Y
36  RCL 10
37  +
38  *
39  CHS
40  GTO 02
41  LBL 01
42  RCL 10
43  RCL Y
44  -
45  *
46  LBL 02
47  RCL 01
48  *
49  RCL 02
50  RCL 09
51  +
52  RCL X
53  1
54  -
55  *
56  /
57  1
58  X<>Y
59  END

( 86 bytes / SIZE 011 )
 
 
      STACK        INPUTS     OUTPUTS
           Z             a            /
           Y             b            /
           X             x        Bx(a,b)

Example:

     1   E^X   PI
   0.4  XEQ "IBETA2"  >>>>  B0.4(e,Pi) =  0.01476755416   ( in 20 seconds )

-Like "IBETA" , if  x is close to 1 , you can use the relation  Bx(a,b) = B(a,b) -  B1-x(b,a)
 

References:        Abramowitz and Stegun , "Handbook of Mathematical Functions" -  Dover Publications -  ISBN  0-486-61272-4
                              Press , Vetterling , Teukolsky , Flannery , "Numerical Recipes in C++" - Cambridge University Press - ISBN  0-521-75033-4
 
 
 

Go back to the HP-41 software library
Go back to the general software library
Go back to the main exhibit hall