Statistics & Probability for the HP-41
Overview
1°) One Variable ( Grouped Data )
1-a) Moments of a Distribution
( Program#1 )
1-b) Moments of a Distribution
( Program#2 )
1-c) Arithmetic, Geometric and
Harmonic Means
2°) Two Variables ( Grouped Data )
2-a) Standard Deviation, Covariance,
Coefficient of Correlation
2-b) Linear Regression
3°) Probability Functions
3-a) Chi2-Probability Function
3-b) Gaussian Probability Function
3-c) F-Distribution Function
3-c1) Program#1
3-c2) Inverse FDF function
3-d) Student's t-Distribution & UTPT Functions
3-d1) Program#1
3-d2) UTPT function
3-d3) Inverse UTPT function
3-e) Poisson distribution
3-f) Binomial Distribution
3-g) Negative Binomial Distribution
3-h) Pascal Distribution
3-i) Geometric Distribution
3-j) Hypergeometric Distribution
4°) Classic Problems
4-a) Binomial Coefficients ( Focal Program
& M-Code Routine )
4-b) Probability of no repetition in
a sample
4-c) Hypergeometric Distribution ( Urn
Problem )
4-d) Multivariate Hypergeometric Distribution
4-c) Permutations with repetitions
-See also "Quantiles for the HP-41" & "Least-Squares Approximation for the HP-41"
-The latest addition is paragraph 3-c2)
1°) One Variable ( Grouped Data )
a) Moments of a Distribution
( Program#1 )
-This program calculates the arithmetic mean, the standard
deviation, the skewness and the kurtosis
of a given set of p points x1 , x2
, ............ , xp
with respective frequencies n1 , n2
, ............ , np
Data Registers: R00 = Sum ni when the routine stops, R05 = m = arithmetic mean
R01 = Sum ni xi R03 = Sum ni
xi3
R02 = Sum ni xi2 R04 = Sum
ni xi4
Flag: F01
CF 01 if you want to use the sample standard deviation
Subroutines: /
SF 01 if you want to use the population standard deviation
01 LBL A
02 ST+ 00 03 RCL Y 04 STO T 05 * 06 ST+ 01 07 * 08 ST+ 02 09 * 10 ST+ 03 11 * 12 ST+ 04 13 RDN 14 RTN 15 LBL "STAT" |
16 RCL 01
17 RCL 00 18 / 19 ENTER^ 20 STO 05 21 6 22 * 23 RCL 02 24 * 25 RCL 03 26 4 27 * 28 - 29 * 30 RCL 04 |
31 +
32 RCL 00 33 / 34 R^ 35 X^2 36 X^2 37 3 38 * 39 - 40 RCL 03 41 R^ 42 RCL 02 43 * 44 3 45 * |
46 -
47 RCL 00 48 / 49 RCL 05 50 3 51 Y^X 52 ST+ X 53 + 54 RCL 05 55 X^2 56 RCL 00 57 * 58 RCL 02 59 X<>Y 60 - |
61 RCL 00
62 FC? 01 63 DSE X 64 / 65 ST/ Z 66 ST/ Z 67 ST/ Y 68 SQRT 69 ST/ Y 70 RCL 05 71 END |
( 95 bytes / SIZE 006 )
STACK | INPUTS#i | OUTPUTS#i | final OUTPUTS |
T | / | / | µ4 |
Z | / | / | µ3 |
Y | xi | / | s |
X | ni | xi | m |
L | / | / | V = s2 |
m = arithmetic mean
V = s2 = variance
s = sample standard deviation
if CF 01
µ3 = skewness
s = population standard deviation
if SF 01
µ4 = kurtosis
Example: Given the following data
xi | 2 | 7 | 9 | 12 | 15 | 19 |
ni | 3 | 5 | 8 | 14 | 7 | 2 |
-Clear registers R00 thru R04 ( for instance execute CLS
if your statistics registers are R00 thru R05 )
-Then, xi ENTER^ ni S+
( [A] in user mode ) for all the points
2 ENTER^ 7 ENTER^
9 ENTER^ 12 ENTER^
15 ENTER^ 19 ENTER^
3 S+
5 S+
8 S+
14 S+
7 S+
2 S+
in user mode
-Finally, simply press R/S ( or XEQ "STAT" ) it yields:
CF 01 SF 01
m = 10.8718
m = 10.8718
RDN s = 4.0012
RDN s = 3.9496
RDN µ3 = -0.3406 = skewness
RDN µ3 = -0.3542 = skewness
RDN µ4 = 3.0605 = kurtosis
RDN µ4 = 3.2238 = kurtosis
-To correct wrong inputs, key in xi ENTER^
ni CHS S+ ( [A]
in
user mode ) for the wrong ( xi , ni )
or add LBL a CHS just before
LBL A and key in xi ENTER^ niS-
( [a] in user mode )
-For a normal distribution, µ3 = 0 &
µ4 = 3
b) Moments of a Distribution
( Program#2 )
-This routine computes the centered moment µk
= [ (1/n) Sum ni.( xi - m )k ]/sk
for a given k-value
where m is the arithmetic mean and s is the
standard deviation.
µk is a dimensionless quantity.
Data Registers: • R00 = p = number of points , ( Registers R00 thru R2p are to be initialized before executing "RCMK" )
• R01 = x1 • R03 = x2
....... • R2p-1 = xp
• R02 = n1 • R04 = n2
....... • R2p = np
Flag: F01
CF 01 if you want to use the sample standard deviation
Subroutines: /
SF 01 if you want to use the population standard deviation
01 LBL "RCMK"
02 CLA 03 STO O 04 RCL 00 05 ST+ X 06 STO M 07 ENTER^ 08 CLX 09 LBL 01 10 RCL IND Y 11 ST+ N 12 DSE Z |
13 RCL IND Z
14 * 15 + 16 DSE Y 17 GTO 01 18 RCL N 19 / 20 X<>Y 21 LBL 02 22 RCL IND M 23 DSE M 24 RCL IND M |
25 R^
26 ST- Y 27 RDN 28 X^2 29 X<>Y 30 ST* Y 31 X<>Y 32 ST+ P 33 X<> L 34 X<>Y 35 X<> O 36 Y^X |
37 LASTX
38 X<> O 39 * 40 + 41 DSE M 42 GTO 02 43 X<>Y 44 RCL P 45 RCL N 46 ST/ T 47 FC? 01 48 DSE X |
49 /
50 SQRT 51 ENTER^ 52 X<> O 53 Y^X 54 ST/ Z 55 X<> O 56 X<> Z 57 CLA 58 END |
( 97 bytes / SIZE 2p+1 )
STACK | INPUTS | OUTPUTS |
T | / | mk = Sum ni ( xi - m )k/n |
Z | / | s |
Y | / | m |
X | k | µk = mk/sk |
L | / | k |
m = arithmetic mean
s = sample standard
deviation if CF 01
s = population
standard deviation if SF 01
Example:
xi | 2 | 7 | 9 | 12 | 15 | 19 |
ni | 3 | 5 | 8 | 14 | 7 | 2 |
-Store these 12 numbers into
R01
R03 ..............................
R11
R02
R04 ..............................
R12 respectively
-There are p = 6 data points whence 6 STO 00
CF 01 4 XEQ "RCMK"
>>>> µ4 = 3.0605 RDN
m = 10.8718 RDN s = 4.0012
RDN m4 = 784.4261
( µ4 = kurtosis )
SF 01 4
R/S >>>>
µ4 = 3.2238 RDN m
= 10.8718 RDN s = 3.9496
RDN m4 = 784.4261
CF 01 5
R/S >>>>
µ5 = -2.2513 RDN
m = 10.8718 RDN s = 4.0012
RDN m5 = -2308.7606 ( in
10 seconds )
SF 01 5
R/S >>>>
µ5 = -2.4024 RDN
m = 10.8718 RDN s = 3.9496
RDN m5 = -2308.7606
c) Arithmetic, Geometric
and Harmonic Means
-The arithmetic mean m is defined by m = ( n1
x1 + n2 x2 + ...... + np xp
) / ( n1 + n2 + ..... + np )
-The geometric mean m' is defined by m' = [ ( x1^n1
).( x2^n2 ) ...... ( xp^np
) ] 1/n
with n = n1 + n2 + .....
+ np
-The harmonic mean m" is defined by m" = ( n1
+ n2 + ..... + np ) / ( n1/x1
+ n2/x2 + ...... + np/xp )
Data Registers: • R00 = p = number of points ( Registers R00 thru R2p are to be initialized before executing "MEANS" )
• R01 = x1 • R03 = x2
....... • R2p-1 = xp
• R02 = n1 • R04 = n2
....... • R2p = np
Flags: /
Subroutines: /
01 LBL "MEANS"
02 RCL 00 03 ST+ X 04 1 05 CLA 06 LBL 01 07 RCL IND Y |
08 STO O
09 ST+ P 10 DSE Z 11 RCL IND Z 12 / 13 ST+ N 14 CLX |
15 RCL O
16 LASTX 17 * 18 ST+ M 19 X<> L 20 RCL O 21 Y^X |
22 *
23 DSE Y 24 GTO 01 25 RCL P 26 ST/ M 27 ST/ N 28 1/X |
29 Y^X
30 RCL N 31 1/X 32 X<>Y 33 RCL M 34 CLA 35 END |
( 63 bytes / SIZE 2p+1 )
STACK | INPUTS | OUTPUTS |
Z | / | m" |
Y | / | m' |
X | / | m |
m = arithmetic mean
m' = geometric mean
m" = harmonic mean
Example:
xi | 2 | 7 | 9 | 12 | 15 | 19 |
ni | 3 | 5 | 8 | 14 | 7 | 2 |
-Store these 12 numbers into
R01
R03 ..............................
R11
R02
R04 ..............................
R12 respectively
-There are 6 points whence 6 STO 00
XEQ "MEANS" >>>> m = 10.8718
( execution time = 7 seconds )
RDN m' = 9.8020
RDN m" = 8.0549
2°) Two Variables ( Grouped Data )
a) Standard Deviation, Covariance,
Coefficient of Correlation
-This program calculates the arithmetic mean, the standard
deviations and the covariance
of a given set of p points ( x1 , y1
) , ( x2 , y2 ) ............ ,
( xp , yp )
with respective frequencies n1 , n2
, ............ , np
Data Registers: R00 = Sum ni
xi R02 = Sum ni yi
R04 = Sum ni xi yi and
when the routine stops, R06 = mx = arithmetic mean
R01 = Sum ni xi2 R03
= Sum ni yi2 R05 = n
= Sum ni
R07 = my = arithmetic mean
Flag: F01
CF 01 if you want to use the sample standard deviation & covariance
Subroutines: /
SF 01 if you want to use the population standard deviation &
covariance
-If your statistics registers are R00 thru R05, lines 01 to 22 may be replaced by
LBL A
X<> Z
LBL 01
S+
( Sigma+ )
LASTX
DSE Z
GTO 01
RTN
01 LBL A
02 ST+ 05 03 STO 06 04 X<>Y 05 * 06 STO 07 07 ST+ 02 08 LASTX 09 * 10 ST+ 03 11 X<>Y 12 ENTER^ |
13 ST* 07
14 RCL 06 15 * 16 ST+ 00 17 * 18 ST+ 01 19 RCL 07 20 ST+ 04 21 RCL 06 22 RTN 23 LBL "STAT2" 24 RCL 04 |
25 RCL 02
26 STO 07 27 RCL 00 28 RCL 05 29 ST/ 07 30 / 31 STO 06 32 * 33 - 34 RCL 01 35 RCL 06 36 X^2 |
37 RCL 05
38 * 39 - 40 RCL 07 41 X^2 42 RCL 05 43 * 44 RCL 03 45 X<>Y 46 - 47 RCL 05 48 FC? 01 |
49 DSE X
50 ST/ T 51 ST/ Z 52 / 53 SQRT 54 ST/ T 55 X<>Y 56 SQRT 57 ST/ T 58 END |
( 83 bytes / SIZE 008 )
STACK | INPUTS#i | OUTPUTS#i | final OUTPUTS |
T | / | / | r |
Z | xi | / | cov(x,y) |
Y | yi | / | sy |
X | ni | ni | sx |
L | / | / | Vx = sx2 |
s = sample standard deviation if
CF 01
cov(x,y) = sample covariance if CF 01
r = coefficient of correlation
s = population standard deviation
if SF 01
cov(x,y) = population covariance if SF 01
V = s2 = variance , R06 = mx = arithmetic mean , R07 = my = arithmetic mean
Example: With the following data
xi | 2 | 5 | 10 | 16 | 21 |
yi | 4 | 7 | 12 | 19 | 24 |
ni | 3 | 4 | 7 | 5 | 2 |
-Clear registers R00 thru R05 ( for instance execute CLS
if your statistics registers are R00 thru R05 )
-Then, xi ENTER^ yi
ENTER^ ni S+
( [A] in user mode ) for all the points
2 ENTER^ 5 ENTER^
10 ENTER^ 16 ENTER^
21 ENTER^
4 ENTER^ 7 ENTER^
12 ENTER^ 19 ENTER^
24 ENTER^
3 S+
4 S+
7 S+
5 S+
2 S+
in user mode
-Finally, simply press R/S ( or XEQ "STAT2" ) it yields:
if CF 01
sx = 5.9622
if SF 01
sx = 5.8185
RDN sy
= 6.3808
RDN sy
= 6.2270
RDN cov(x,y) = 38.0143
RDN cov(x,y) = 36.2041
RDN r
= 0.9992
RDN r
= 0.9992
-And we have also
R06 = mx = 10.3810
R07 = my = 12.7143
-To correct wrong inputs, key in xi ENTER^
yi ENTER^ ni CHS S+
( [A]
in user mode ) for the wrong ( xi , yi
, ni )
or add LBL a CHS just before
LBL A and key in xi ENTER^ yi
ENTER^ ni S- (
[a] in user mode )
b) Linear Regression
Data Registers: R00 = Sum ni
xi R02 = Sum ni yi
R04 = Sum ni xi yi
R06 = mx = arithmetic mean
R01 = Sum ni xi2 R03
= Sum ni yi2 R05 = n
= Sum ni R07
= my = arithmetic mean
Flag: F01 is used by "STAT2"
Subroutine: "STAT2"
01 LBL "LR+"
02 XEQ "STAT2" 03 R^ 04 R^ 05 LASTX 06 / 07 RCL 06 08 RCL Y 09 * 10 RCL 07 11 X<>Y 12 - 13 X<>Y 14 END |
( 29 bytes / SIZE 008 )
STACK | INPUTS | OUTPUTS |
Z | / | r |
Y | / | p |
X | / | m |
where y = m x + p is the least-squares line and r = linear correlation coefficient
Example: With the same data as in paragraph 2-a)
XEQ "LR+" gives m = 1.0694
RDN p = 1.6130
RDN r = 0.9992
Notes:
-Though "STAT2" produces different outputs if flag F01 is set or clear,
"LR+" yields the same results ( with perhaps a small difference in the
last decimal )
-See also "LR" & "LSL" listed in "Least-Squares Approximation for
the HP-41"
3°) Probability Functions
a) Chi2-Probability
Function
-This program computes P( X2 | m ) = 2 -m/2 [ 1/Gamma(m/2) ] §0X^2 t -1+m/2 e -t/2 dt
-It uses the series exansion: P( X2 | m
) = (X2/2)m/2 e -(X^2)/2 [ 1/Gamma(m/2)
] [ 1 + Sumk=1,2,... X2k/[ (m+2)(m+4)
..... (m+2k) ]
Data Registers: /
Flags: /
Subroutine: "GAM+" or "GAM" or "1/G"
( cf "Gamma , Digamma , Polygamma & Beta Functions for the HP-41" )
01 LBL "PXN"
02 STO N 03 X<>Y 04 STO O 05 2 06 ST+ Y 07 / 08 XEQ "GAM+" 09 RCL N 10 2 |
11 /
12 E^X 13 ST* Y 14 X<> L 15 RCL O 16 2 17 / 18 Y^X 19 X<>Y 20 / |
21 STO M
22 1 23 RCL O 24 1 25 ENTER^ 26 LBL 01 27 X<> T 28 RCL N 29 * 30 R^ |
31 2
32 + 33 STO T 34 / 35 STO T 36 X<>Y 37 ST+ Y 38 X#Y? 39 GTO 01 40 RCL M |
41 *
42 RCL N 43 SIGN 44 X<> O 45 X<>Y 46 CLA 47 END |
( 78 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
Y | m | m |
X | X2 | P( X2 | m ) |
L | / | X2 |
where m is a positive integer ( m > 0 )
Example:
7 ENTER^
12 XEQ "PXN" >>>> P (12 | 7 )
= 0.899441131 ( in 14 seconds )
b) Gaussian Probability
Function
"GPF" calculates P(x) = (1/sqrt(2.pi)) § -infinityx exp (-t2/2).dt via the error function if x >= 0 and via the complementary error function if x < 0
Formulae:
P(x) = [ 1 +
erf ( x/sqrt(2) ) ] / 2 if x >= 0
P(x) = (1/2)
erfc ( x/sqrt(2) )
if x < 0
Q(x) = 1 - P(x)
verifies Q(x) = P(-x)
Data Registers: /
Flag: F10
Subroutine: "ERF" ( cf "Error Function
for the HP-41" )
01 LBL "GPF"
02 CF 10 03 X<0? 04 SF 10 05 2 06 SQRT 07 / 08 XEQ "ERF" 09 FS? 10 10 X<>Y 11 .5 12 ST* Y 13 FS?C 10 14 CLX 15 + 16 END |
( 34 bytes / SIZE 000 )
STACK | INPUT | OUTPUT |
X | x | P(x) |
Examples:
3.14 XEQ "GPF" >>>> P(3.14) =
0.999155261 = Q(-3.14)
( in 8 seconds )
-1 R/S
>>>> P(-1) = 0.158655254 =
Q(1)
( in 7 seconds )
3-c) F-Distribution Function
3-c1) Program#1
-This program calculates Q( x | n1 , n2 ) = (n1/n2)(n1)/2 Gamma[(n1+n2)/2] / [ Gamma(n1/2) Gamma(n2/2) ] §xinfinity t -1+(n1)/2 ( 1 + t.n1/n2 ) -(n1+n2)/2 dt
via the incomplete beta function: Q( x | n1
, n2 ) = Iy( n2/2 , n1/2 )
with y = n2/(n2+n1.x)
Data Registers: R00 thru R05
Flag: F10
Subroutines: "BETA" "IBETA"
( cf "Gamma , Digamma , Polygamma & Beta Functions for the HP-41"
)
01 LBL "FDF"
02 RCL Z 03 STO 01 04 * 05 STO Z 06 RCL Y 07 STO 05 |
08 +
09 ST/ Z 10 / 11 CF 10 12 X>Y? 13 SF 10 14 X>Y? |
15 X<>Y
16 STO 00 17 2 18 ST/ 01 19 ST/ 05 20 RCL 01 21 RCL 05 |
22 XEQ "BETA"
23 X<> 05 24 RCL 01 25 FS? 10 26 X<>Y 27 RCL 00 28 XEQ "IBETA" |
29 FS? 10
30 CHS 31 RCL 05 32 FS?C 10 33 ST+ Y 34 / 35 END |
( 67 bytes / SIZE 006 )
STACK | INPUTS | OUTPUTS |
Z | n1 | / |
Y | n2 | / |
X | x >= 0 | Q( x | n1 , n2 ) |
Examples:
7 ENTER^
6 ENTER^
4.3 XEQ "FDF" >>>> Q (
4.3 | 7 , 6 ) = 0.04764079963 ( in 24 seconds
)
7 ENTER^
9 ENTER^
0.4 R/S
>>>> Q ( 0.4 | 7 , 9 ) =
0.879873501 ( in 27 seconds )
Notes:
-We have used the relation Iy( a , b ) = 1 -
I1-y( b , a ) to reduce execution time and roundoff errors
when y > 0.5
- Q( 0 | n1 , n2 ) = 1
3-c2) Inverse
FDF function
-"IFDF" employs Halley's iterative method to solve Q( y | n1 , n2 ) = x i-e to find y = IFDF ( x | n1 , n2 )
tk+1 = tk
- 2 f(tk) f '(tk) / [ 2 ( f '(tk) )2
- f(tk) f ''(tk) ]
where f = FDF
Data Registers: R00 thru R11: temp
Flags: /
Subroutines: "BETA"
( cf "Gamma , Digamma , Polygamma & Beta Functions for the HP-41"
)
"FDF" ( cf
paragraph above )
-Line 21, 1 is the 1st guess whch could probably be replaced
by a better estimation
-Lines 59-60 are probably superfluous
01 LBL "IFDF"
02 STO 06 03 RDN 04 STO 08 05 X<>Y 06 STO 07 07 2 08 ST/ Z 09 / 10 XEQ "BETA" 11 RCL 07 12 RCL 08 13 / 14 RCL 07 15 2 16 / 17 Y^X |
18 X<>Y
19 / 20 STO 09 21 1 22 STO 10 23 LBL 01 24 VIEW 10 25 RCL 07 26 RCL 08 27 RCL 10 28 XEQ "FDF" 29 RCL 06 30 - 31 STO 11 32 RCL 10 33 RCL 07 34 2 |
35 /
36 1 37 - 38 STO 03 39 Y^X 40 RCL 07 41 RCL 10 42 * 43 RCL 08 44 ST+ Y 45 / 46 STO 04 47 RCL 07 48 RCL 08 49 + 50 2 51 / |
52 STO 05
53 Y^X 54 / 55 RCL 09 56 * 57 RCL 03 58 RCL 10 59 X=0? 60 SIGN 61 / 62 RCL 07 63 RCL 08 64 / 65 RCL 05 66 * 67 RCL 04 68 / |
69 -
70 RCL 11 71 STO T 72 * 73 2 74 / 75 + 76 / 77 ST+ 10 78 ABS 79 E-4 80 X<Y? 81 GTO 01 82 RCL 10 83 CLD 84 END |
( 110 bytes / SIZE 012 )
STACK | INPUTS | OUTPUTS |
Z | n1 | / |
Y | n2 | / |
X | x | ifdf ( x | n1 , n2 ) |
Where y = ifdf ( x | n1 , n2 ) is the solution of FDF ( y | n1 , n2 ) = x
Examples:
7 ENTER^
6 ENTER^
0.05 XEQ "IFDF" >>>> IFDF
( 0.05 | 7 , 6 ) = 4.206658486
---Execution time = 72s---
3 ENTER^
5 ENTER^
0.001 XEQ "IFDF" >>>> IFDF ( 0.001
| 3 , 5 ) = 33.20246321
---Execution time = 93s---
Notes:
-The execution times suppose that "IBETA" calls the M-Code routine HGF+
-Line 79 E-4 is a small number to control the precision
of the result.
-Since Halley's method is of order 3, almost all the decimals are already
correct !
3-d) Student's t-Distribution &
UTPT Functions
3-d1) Program#1
- "STD" computes A( t | n ) = n -1/2 / Beta(0.5 ; n/2 ) §-t+t ( 1 + x2/n ) -(n+1)/2 dx
-This routine also computes n -1/2 / Beta(0.5 ; n/2 ) §t+infinity ( 1 + x2/n ) -(n+1)/2 dx = [ 1 - A ( t | n ) ] / 2 = UTPT(t,n) on the HP-48
Formula: A( t | n ) = 1 - Iy( n/2
, 1/2 ) with y = n/(n+t2)
Data Registers: R00 thru R05
Flag: F10
Subroutines: "GAM+" ( or "GAM" )
"IBETA" ( cf "Gamma , Digamma , Polygamma & Beta Functions
for the HP-41" )
01 LBL "STD"
02 X^2 03 STO Z 04 RCL Y 05 STO 00 06 + 07 ST/ Z 08 / 09 CF 10 10 X>Y? |
11 SF 10
12 X>Y? 13 X<>Y 14 X<> 00 15 .5 16 * 17 STO 05 18 LASTX 19 + 20 XEQ "GAM+" |
21 STO 04
22 RCL 05 23 XEQ "GAM+" 24 PI 25 SQRT 26 * 27 RCL 04 28 / 29 X<> 05 30 .5 |
31 FS? 10
32 X<>Y 33 RCL 00 34 XEQ "IBETA" 35 ENTER^ 36 CHS 37 RCL 05 38 + 39 FC?C 10 40 X<>Y |
41 LASTX
42 ST/ Z 43 ST+ X 44 / 45 X<>Y 46 END |
( 83 bytes / SIZE 006 )
STACK | INPUTS | OUTPUTS |
Y | n | UTPT(t,n) |
X | t >= 0 | A( t | n ) |
Examples:
4 ENTER^
1 XEQ "STD" >>>>
A( 1 | 4 ) = 0.626099033
( in 21 seconds )
RDN UTPT( 1 , 4 ) = 0.186950483
4 ENTER^
10 R/S
>>>>
A( 10 | 4 ) = 0.999437997
( in 16 seconds )
RDN UTPT( 10 , 4 ) = 0.0002810018113
-We have used the symmetry relation Iy( a , b
) = 1 - I1-y( b , a ) to reduce execution time and roundoff
errors when y > 0.5
- A( 0 | n ) = 0
3-d2) UTPT
function
-There is however a possible loss of significant digits with "STD" if
y > 0.5
-To overcome that difficulty, the following program employs a quadratic
transformation to calculate the hypergeometric function F. It yields:
UTPT (t | n) = { 1/[ n.B(n/2,1/2) ] } yn/2
F ( 1 , n ; 1+n/2 ; y / [ 2 + 2 (1-y)1/2 ] )
where B = beta function and y = n/(n+t2)
Data Registers: R00 thru R06
Flags: /
Subroutines: "1/G+" ( or "GAM+" )
( cf "Gamma , Digamma , Polygamma & Beta Functions for the HP-41"
)
"HGF"
( cf "Hypergeometric functions for the HP-41" )
01 LBL "UTPT"
02 STO 04 03 X<>Y 04 STO 02 05 2 06 / 07 STO 03 08 XEQ "1/G+" 09 STO 06 10 RCL 03 |
11 .5
12 + 13 XEQ "1/G+" 14 PI 15 SQRT 16 * 17 RCL 06 18 / 19 STO 06 20 1 |
21 STO 01
22 ST+ 03 23 RCL 02 24 RCL 02 25 RCL 04 26 X^2 27 STO T 28 + 29 ST/ Z 30 / |
31 STO 05
32 X<>Y 33 SQRT 34 1 35 + 36 ST+ X 37 / 38 XEQ "HGF" 39 RCL 05 40 RCL 02 |
41 2
42 / 43 Y^X 44 * 45 RCL 02 46 RCL 06 47 * 48 / 49 END |
( 77 bytes / SIZE 007 )
STACK | INPUTS | OUTPUTS |
Y | n | / |
X | t >= 0 | UTPT(t,n) |
Examples:
• 4 ENTER^
2.8 XEQ "UTPT" >>>>
UTPT ( 2.8 | 4 ) = 0.02440577530
---Execution time = 10s---
• 7 ENTER^
10 R/S
>>>> UTPT ( 10 | 4 ) = 1.069710145 E-5
---Execution time = 8s---
Note:
-If you to compute A(t | n) , simply add ENTER^
ST+ X 1 - CHS X<>Y after line 48.
3-d3) Inverse
UTPT function
-IUTPT uses the same expression to calculte UTPT(t,n) and find
a solution of the equation UTPT(t,n) - A = 0 where A
and n are given
-It employs Halley's method which is even better than Newton's method:
tk+1 = tk
- 2 f(tk) f '(tk) / [ 2 ( f '(tk) )2
- f(tk) f ''(tk) ] with
f = UTPT
Data Registers: R00 thru R09
Flags: /
Subroutines: "1/G+" ( or "GAM+" )
( cf "Gamma , Digamma , Polygamma & Beta Functions for the HP-41"
)
"HGF"
( cf "Hypergeometric functions for the HP-41" )
01 LBL "IUTPT"
02 STO 06 03 RDN 04 STO 02 05 1 06 STO 01 07 STO 03 08 + 09 2 10 / 11 STO 08 12 X<>Y 13 STO 04 14 RCL 02 15 2 16 / 17 ST+ 03 |
18 STO 05
19 XEQ "1/G+" 20 STO 07 21 RCL 08 22 XEQ "1/G+" 23 PI 24 SQRT 25 * 26 RCL 07 27 / 28 ST* 04 29 LBL 01 30 VIEW 06 31 RCL 02 32 RCL 02 33 RCL 06 34 X^2 |
35 STO T
36 + 37 STO 09 38 ST/ Z 39 / 40 STO 07 41 X<>Y 42 SQRT 43 1 44 + 45 ST+ X 46 / 47 XEQ "HGF" 48 RCL 07 49 RCL 05 50 Y^X 51 * |
52 RCL 02
53 / 54 RCL 04 55 - 56 RCL 07 57 RCL 08 58 Y^X 59 RCL 02 60 SQRT 61 / 62 RCL 02 63 RCL 06 64 * 65 RCL 08 66 * 67 RCL 09 68 X^2 |
69 /
70 R^ 71 * 72 RCL 07 73 / 74 - 75 / 76 ST+ 06 77 ABS 78 E-8 79 X<Y? 80 GTO 01 81 RCL 06 82 CLD 83 END |
( 117 bytes / SIZE 010 )
STACK | INPUTS | OUTPUTS |
Z | A | |
Y | n | / |
X | t0 | IUTPT(A,n) |
where t0 is an initial guess and t = IUTPT(A,n) is the solution of the equation UTPT(t,n) = A
Example1: A = 0.0001 , n = 4 , with the initial approximation t0 = 10
0.0001 ENTER^
4
ENTER^
10
XEQ "IUTPT" >>>> t = 13.03367172
---Execution time = 22s---
Example2: A = 0.025 , n = 21 , with the initial approximation t0 = 1
0.025 ENTER^
21
ENTER^
1
XEQ "IUTPT" >>>> t = 2.079613847
---Execution time = 63s---
Example3: A = 0.001 , n = 21 , with the initial approximation t0 = 1
0.001 ENTER^
21
ENTER^
1
XEQ "IUTPT" >>>> t = 3.527153671
---Execution time = 66s---
3-e) Poisson Distribution
-The function is defined by P(X=k) = exp(-L) Lk
/ k! where L > 0
and k is a non-negative integer
Data Registers: /
Flags: /
Subroutines: /
01 LBL "POI"
02 RCL Y 03 X<>Y 04 Y^X 05 LASTX 06 FACT 07 / 08 X<>Y 09 E^X 10 / 11 END |
( 20 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
Y | L | / |
X | k | P( X=k ) |
Example:
L = 5 , k = 6
5 ENTER^
6 XEQ "POI" >>>> P(X=6)
= 0.146222808
-The cumulative distribution is given by P( X <= k )
= exp(-L) SUMj=0,1,...,k Lj / j!
Data Register: R00 = k , k-1 , ..... , 0
Flags: /
Subroutines: /
01 LBL "POI+"
02 X=0? 03 GTO 02 04 STO 00 05 CLX 06 LBL 01 07 RCL Y 08 RCL 00 09 Y^X 10 LASTX 11 FACT 12 / 13 + 14 DSE 00 15 GTO 01 16 LBL 02 17 1 18 + 19 RCL Y 20 E^X 21 / 22 END |
( 36 bytes / SIZE 001 )
STACK | INPUTS | OUTPUTS |
Y | L | / |
X | k | P( X<=k ) |
Example:
L = 5 , k = 6
5 ENTER^
6 XEQ "POI+" >>>>
P(X<=6) = 0.762183463
3-f) Binomial Distribution
-This routine computes P(X=k) = Cnk pk
(1-p)n-k where 0 <= k <=
n are integers and 0 < p < 1
Data Registers: R00 thru R02: temp
Flags: /
Subroutine: "CNK" or an M-Code CNK
cf §4-a) below
01 LBL "BNP"
02 STO 00 03 X<>Y 04 STO 01 05 X<>Y 06 Y^X 07 X<>Y 08 STO 02 09 RCL 00 10 XEQ "CNK" 11 * 12 1 13 RCL 01 14 - 15 RCL 02 16 RCL 00 17 - 18 Y^X 19 * 20 END |
( 32 bytes / SIZE 003 )
STACK | INPUTS | OUTPUTS |
Z | n | / |
Y | p | / |
X | k | P( X=k ) |
Example: n = 100 , p = 1/6
100 ENTER^
6 1/X
20 XEQ "BNP" >>>>
P(X=20) = 0.067861995
-The cumulative distribution could be calculated by calling "BNP"
(k+1) times.
-The following routine is faster, at least for large k-values:
Data Registers: R00 thru R03: temp
Flags: /
Subroutines: /
01 LBL "BNP+"
02 STO 00 03 SIGN 04 X<>Y 05 STO 01 06 - 07 ST/ 01 08 X<>Y |
09 STO 02
10 Y^X 11 SIGN 12 RCL 00 13 X=0? 14 GTO 02 15 CLX 16 STO 03 |
17 LASTX
18 LBL 01 19 LASTX 20 RCL 01 21 * 22 RCL 02 23 RCL 03 24 - |
25 *
26 RCL 03 27 1 28 + 29 STO 03 30 / 31 + 32 DSE 00 |
33 GTO 01
34 SIGN 35 LBL 02 36 LASTX 37 END |
( 50 bytes / SIZE 004 )
STACK | INPUTS | OUTPUTS |
Z | n | / |
Y | p | / |
X | k | P( X<=k ) |
Example: n
= 100 , p = 1/6
100 ENTER^
6 1/X
15 XEQ "BNP+" >>>>
P(X<=15) = 0.387657550
3-g) Negative Binomial Distribution
-Let r a positive integer, k a non-negative integer and a real p 0 < p < 1
P(X=k) = Ck+r-1r-1 pr
(1-p)k
Data Registers: R00-R01: temp
Flags: /
Subroutine: "CNK" or an M-Code CNK
cf §4-a) below
01 LBL "JRP"
02 STO 00 03 SIGN 04 X<>Y 05 STO 01 06 - 07 RCL 00 08 Y^X 09 RCL 01 10 RCL Z 11 Y^X 12 * 13 RCL 00 14 R^ 15 1 16 - 17 ST+ Y 18 XEQ "CNK" 19 * 20 END |
( 34 bytes / SIZE 002 )
STACK | INPUTS | OUTPUTS |
Z | r | / |
Y | p | / |
X | k | P( X=k ) |
Example: r = 5
, p = 1/7
5 ENTER^
7 1/X
10 XEQ "JRP" >>>> P(X=10) = 0.012748996
"JRP+" computes the cumulative negative binomial distribution
Data Registers: R00 thru R03 temp
Flags: /
Subroutines: /
01 LBL "JRP+"
02 STO 00 03 RDN 04 STO 01 05 X<>Y 06 STO 02 07 Y^X |
08 ABS
09 RCL 00 10 X=0? 11 GTO 02 12 CLX 13 STO 03 14 X<>Y |
15 LBL 01
16 LASTX 17 RCL 02 18 RCL 03 19 + 20 * 21 1 |
22 ST+ 03
23 RCL 01 24 - 25 * 26 RCL 03 27 / 28 + |
29 DSE 00
30 GTO 01 31 SIGN 32 LBL 02 33 LASTX 34 END |
( 47 bytes / SIZE 004 )
STACK | INPUTS | OUTPUTS |
Z | r | / |
Y | p | / |
X | k | P( X<=k ) |
Example: r = 5
, p = 1/7
5 ENTER^
7 1/X
10 XEQ "JRP+" >>>> P(X<=10)
= 0.051581690
3-h) Pascal Distribution
-The function is defined as P(X=k) = Ck-1r-1
pr (1-p)k-1 where r
and k are positive integers ( r <= k ) and 0 < p <
1
Data Registers: R00-R01-R02: temp
Flags: /
Subroutine: "CNK" or an M-Code CNK
cf §4-a) below
01 LBL "PRP"
02 STO 00 03 1 04 - 05 RDN |
06 STO 01
07 RDN 08 STO 02 09 SIGN 10 - |
11 XEQ "CNK"
12 RCL 01 13 RCL 02 14 Y^X 15 * |
16 1
17 RCL 01 18 - 19 RCL 00 20 RCL 02 |
21 -
22 Y^X 23 * 24 END |
( 36 bytes / SIZE 003 )
STACK | INPUTS | OUTPUTS |
Z | r | / |
Y | p | / |
X | k | P( X=k ) |
Example: r = 10
, p = 0.6
10 ENTER^
0.6 ENTER^
15 XEQ "PRP" >>>> P(X=15) = 0.123958563
-Now, "PRP+" calculates P(X<=k)
Data Registers: R00 thru R03: temp
Flags: /
Subroutines: /
01 LBL "PRP+"
02 RDN 03 STO 01 04 X<>Y 05 STO 02 06 STO 03 07 R^ 08 X<Y? |
09 GTO 02
10 X<>Y 11 - 12 STO 00 13 RCL 01 14 RCL 02 15 Y^X 16 ABS |
17 ISG 00
18 LBL 01 19 DSE 00 20 X<0? 21 RTN 22 LASTX 23 1 24 RCL 01 |
25 -
26 * 27 RCL 03 28 ST* Y 29 1 30 + 31 STO 03 32 RCL 02 |
33 -
34 / 35 + 36 GTO 01 37 LBL 02 38 CLX 39 END |
( 53 bytes / SIZE 004 )
STACK | INPUTS | OUTPUTS |
Z | r | / |
Y | p | / |
X | k | P( X<=k ) |
Example: r = 10
, p = 0.6
10 ENTER^
0.6 ENTER^
15 XEQ "PRP" >>>> P(X<=15) = 0.403215551
Note: P(X=k) is in
L-register
3-i) Geometric Distribution
-This probability function is defined by
P(X=k) = p (1-p)k-1
where 0 < p < 1 and k is a positive integer
-The cumulative distribution may easily be computed since
P(X<=k) = 1 - (1-p)k
-So a simple program can return both results.
Data Registers: /
Flags: /
Subroutines: /
01 LBL "GP"
02 1 03 RCL Z 04 - 05 ENTER^ 06 X<> Z 07 DSE X 08 INT 09 Y^X 10 ST* Z 11 * 12 1 13 X<>Y 14 - 15 X<>Y 16 END |
( 27 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
Y | p | P( X<=k ) |
X | k | P( X=k ) |
Example: p = 0.6
0.6 ENTER^
4 XEQ "GP"
>>>> P(X=4) = 0.0384
RDN P(X<=4) = 0.9744
3-j) Hypergeometric Distribution
-Here, P(X=k) = Cmk Cn-ma-k
/ Cna where n , m ,
a , k are integers with m <= n , k <= a <=
m , a - k <= n - m ( cf § 4-c) for
a concrete example )
Data Register: R00: temp
Flags: /
Subroutine: "CNK" ( cf
4-a) )
01 LBL "HGD"
02 RDN 03 STO 00 04 X<>Y 05 R^ 06 ST- 00 07 XEQ "CNK" 08 RDN 09 XEQ "CNK" 10 ST/ Z 11 X<> T 12 X<>Y 13 - 14 RCL 00 15 XEQ "CNK" 16 * 17 END |
( 40 bytes / SIZE 001 )
STACK | INPUTS | OUTPUTS |
T | n | / |
Z | m | / |
Y | a | / |
X | k | P(X=k) |
Example: n = 30 ,
m = 12 , a = 10
30 ENTER^
12 ENTER^
10 ENTER^
5 XEQ "HGD" >>>> P(X=5)
= 0.225856303
- "HGD+" below computes P(X<=k)
Data Registers: R00 thru R05: temp
Flags: /
Subroutine: "CNK" or an M-Code CNK
cf §4-a)
01 LBL 'HGD+"
02 STO 00 03 RDN 04 STO 01 05 RDN 06 STO 02 07 X<>Y 08 STO 03 09 - 10 RCL 01 11 + 12 STO 05 13 X<0? |
14 CLX
15 STO 04 16 RCL 00 17 - 18 X>0? 19 GTO 02 20 CHS 21 STO 00 22 RCL 02 23 RCL 04 24 XEQ "CNK" 25 RCL 03 26 RCL 02 |
27 -
28 RCL 01 29 RCL 04 30 - 31 XEQ "CNK" 32 * 33 RCL 03 34 RCL 01 35 XEQ "CNK" 36 / 37 ABS 38 ISG 00 39 LBL 01 |
40 DSE 00
41 X<0? 42 RTN 43 LASTX 44 RCL 01 45 RCL 04 46 - 47 * 48 RCL 02 49 RCL 04 50 - 51 * 52 RCL 04 |
53 1
54 + 55 STO 04 56 ST/ Y 57 RCL 05 58 - 59 / 60 + 61 GTO 01 62 LBL 02 63 CLX 64 END |
( 90 bytes / SIZE 006 )
STACK | INPUTS | OUTPUTS |
T | n | / |
Z | m | / |
Y | a | / |
X | k | P(X<=k) |
Example1: n = 30
, m = 12 , a = 10
30 ENTER^
12 ENTER^
10 ENTER^
5 XEQ "HGD+" >>>> P(X<=5)
= 0.881728367
Example2: n = 100 , m = 84 , a = 41
100 ENTER^
84 ENTER^
41 ENTER^
37 XEQ "HGD+" >>>>
P(X<=37) = 0.958543068
4°) Classic Problems
4-a) Binomial Coefficients
-This routine is only a slight modification of a program by Keith Jarret
listed in "Synthetic Programming Made Easy"
-I've simply added lines 09-10-20 to avoid a data error if k = 0 or
k = n
-"CNK" computes Cnk = n! / [ k! (n-k)!
]
Data Registers: /
Flags: /
Subroutines: /
01 LBL "CNK"
02 ST- Y 03 SIGN 04 STO M 05 CLX |
06 LASTX
07 X>Y? 08 X<>Y 09 X=0? 10 GTO 02 |
11 LBL 01
12 X<>Y 13 ISG X 14 CLX 15 ST* M |
16 X<>Y
17 ST/ M 18 DSE X 19 GTO 01 20 LBL 02 |
21 X<> M
22 X<>Y 23 RDN 24 END |
( 41 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
T | T | n |
Z | Z | T |
Y | n | Z |
X | k | Cnk |
L | / | k |
Example: n = 100
, k = 84
100 ENTER^
84 XEQ "CNK" >>>>
C10084 = 1.345860628 1018
( in 5 seconds )
-One could of course use the buil-in FACT function, but there will be an OUT OF RANGE if n > 69
-The following M-Code routine performs the same calculations.
-Moreover, 0 is returned if n or k or n-k is negative or fractional.
-However, it does not check for alpha data or overflow.
-Synthetic register Q is used.
08B "K"
00E "N"
003 "C"
2A0 SETDEC
3C8 CLRKEY
0F8 READ 3(X)
128 WRIT 4(L)
0B8 READ 2(Y)
0E8 WRIT 3(X)
04E C=0 ALL
0A8 WRIT 2(Y)
0F8 READ 3(X)
2FE ?C#0 MS
0BF JC+23d=+17h
084 CLRF 5
C
0ED ?NCXQ
=
064 193B
frc(C)
2EE ?C#0 ALL
097 JC+18d=+12h
138 READ 4(L)
2FE ?C#0 MS
07F JC+15d=+0Fh
084 CLRF 5
C
0ED ?NCXQ
=
064 193B
frc(C)
2EE ?C#0 ALL
057 JC+10d=+0Ah
138 READ 4(L)
2BE C=-C-1 MS
C=-C
070 N=C ALL
10E A=C ALL
0F8 READ 3(X)
01D ?NCXQ
C=
060 1807
A+C
2FE ?C#0 MS
01B JNC+03
3A5 ?NCGO
?NCgoto
052 14E9
RDN
10E A=C ALL
0F0 C<>N ALL
01D ?NCXQ
C=
060 1807
A+C
2FE ?C#0 MS
01F JC+03
138 READ 4(L)
070 N=C ALL
04E C=0 ALL
268 WRIT 9(Q)
35C PT=12
050 LD@PT- 1
0A8 WRIT 2(Y)
278 READ 9(Q)
10E A=C ALL
0B0 C=N ALL
36E ?A#C ALL
36B JNC-19d=-13h
1BE A=A-1 MS
0F8 READ 3(X)
01D ?NCXQ
C=
060 1807
A+C
10E A=C ALL
0B8 READ 2(Y)
135 ?NCXQ
C=
060 184D
A*C
0A8 WRIT 2(Y)
278 READ 9(Q)
00E A=0 ALL
A
35C PT=12
=
162 A=A+1@PT
1
01D ?NCXQ
C=
060 1807
A+C
268 WRIT 9(Q)
10E A=C ALL
0B8 READ 2(Y)
0AE A<>C ALL
261 ?NCXQ
C=
060 1898
A/C
3CC ?KEY
360 ?C RTN
the routine stops here if you press a key ( useful if, for example,
n = 10000000 and k = 1000000 )
31B JNC-29d=-1Dh
STACK | INPUTS | OUTPUTS |
T | T | n |
Z | Z | T |
Y | n | Z |
X | k | Cnk |
L | / | k |
Example: n = 400
, k = 100
400 ENTER^
100 XEQ "CNK" >>>>
C400100 = 2.241854802 1096
( in 12 seconds )
-The last decimals should be 792 instead of 802
-With, for instance, n = 4 and k = 0.5 "CNK" returns 0.
-This may be useful when "CNK" is used in the cumulative distributions
above.
4-b) Probability of
no repetition in a sample
-The typical exercise is: "In a room containing m persons, what is the probability P that nobody has the same birthday?" ( neglecting the leap years )
-The answer is P = ( 1 - 1/n ).( 1 - 2/n )........( 1 - (m-1)/n
) with
n = 365
Data Registers: /
Flags: /
Subroutines: /
01 LBL "NRS"
02 X<>Y 03 ENTER^ 04 SIGN 05 LBL 01 06 LASTX 07 * 08 X<>Y 09 ST/ Y 10 X<>Y 11 DSE L 12 "" 13 DSE Z 14 GTO 01 15 END |
( 27 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
Y | n | n |
X | m | probability |
Example: n = 365 , m = 24
365 ENTER^
24 XEQ "NRS" >>>>
probability = 0.4617 ( in 8 seconds )
4-c) Hypergeometric
Distribution ( Urn Problem )
"An urn contains m black marbles and (n-m) white marbles. You
take simultaneously ( or successively without replacement ) "a"
marbles.
What is the probability P that you have drawn exactly k black
marbles ( and (a-k) white ones ) ?"
-The answer is: P = Cmk Cn-ma-k / Cna
-So we can use the program "HGD" listed in § 3-j above.
Example: The urn contains 60 marbles ( 15 black ones and 45 white ones ) You take 10 marbles. Probability that you have exactly 3 black marbles?
n = 60 , m = 15 , a = 10 , k = 3
60 ENTER^
15 ENTER^
10 ENTER^
3 XEQ "HGD" >>>> P = 0.273864227
4-d) Multivariate Hypergeometric
Distribution
-The previous exercise may be generalized if the urn contains
n1 marbles of color 1 , n2 marbles
of color 2 , ............................. ,
nk marbles of color k
-You take simultaneously - or successively without replacement
- m marbles.
-What is the probability P that you have drawn exactly
p1 marbles of color 1 , p2 marbles
of color 2 , ............................. ,
pk marbles of color k
( of course m = p1 + p2
+ ............ + pk )
-The program below computes the answer P = Cn1p1
Cn2p2 ...... Cnkpk
/ Cn1+n2+....+nkp1+p2+....+pk
Data Registers: • R00 = k ( Registers R00 thru R2k are to be initialized before executing "MHGD" )
• R01 = n1 • R03 = n2
....... • R2k-1 = nk
• R02 = p1 • R04 = p2
....... • R2k = pk
Flags: /
Subroutine: "CNK" ( cf 4-a)
)
01 LBL "MHGD"
02 RCL 00 03 ST+ X 04 STO N 05 1 06 LBL 01 |
07 RCL IND Y
08 DSE Z 09 RCL IND Z 10 X<>Y 11 XEQ "CNK" 12 * |
13 DSE Y
14 GTO 01 15 0 16 ENTER^ 17 LBL 02 18 RCL IND N |
19 +
20 DSE N 21 X<>Y 22 RCL IND N 23 + 24 X<>Y |
25 DSE N
26 GTO 02 27 XEQ "CNK" 28 / 29 END |
( 58 bytes / SIZE 2k+1 )
STACK | INPUT | OUTPUT |
X | / | probability |
Example: An
urn contains 12 marbles ( 3 blue ones , 5 red ones , 4 green ones )
You take simultaneously 7 marbles
Calculate the probability P that you have exactly 2 blue marbles
, 3 red marbles and 2 green marbles ?
k = 3 n1 = 3
n2 = 5 n3 = 4
are to be stored into R00
R01 R03 R05
p1 = 2 p2 = 3
p3 = 2 are to be stored into
R02 R04 R06
respectively
XEQ "MHGD" >>>> probability = 0.227272727
= 5/22 ( in 6 seconds )
4-c) Permutations with
repetitions
-This program calculates P = n! / ( n1! n2!
....... nk! ) where n = n1 + n2
+ ...... + nk
Data Registers: • R00 = k ( Registers R00 thru Rkk are to be initialized before executing "PERM" )
• R01 = n1 • R02 = n2
..................... • Rkk = nk
Flags: /
Subroutines: /
01 LBL "PERM"
02 RCL 00 03 1 04 - 05 RCL IND 00 |
06 LBL 01
07 RCL IND Y 08 X=0? 09 GTO 03 10 LBL 02 |
11 X<>Y
12 ISG X 13 CLX 14 ST* L 15 X<>Y |
16 ST/ L
17 DSE X 18 GTO 02 19 LBL 03 20 RDN |
21 DSE Y
22 GTO 01 23 LASTX 24 END |
( 43 bytes / SIZE k+1 )
STACK | INPUTS | OUTPUTS |
Y | / | n |
X | / | P |
Example1: Calculate 157!
/ ( 12! 20! 41! 84! )
( k = 4 ) n1 = 12 , n2 = 20 , n3 = 41 , n4 = 84 ( n = 12 + 20 + 41 + 84 = 157 )
4 STO 00 12 STO 01 20 STO 02 41 STO 03 84 STO 04
XEQ "PERM" >>>> P = 9.078363541 1074
( in 21 seconds )
Example2: How many anagrams can you write with the 16-letter "word" AAABBCCCCEEEEELL
( k = 5 ) n1 = 3 A's , n2 = 2 B's , n3 = 4 C's , n4 = 5 E's , n5 = 2 L's ( n = 16 )
5 STO 00 3 STO 01 2 STO 02 4 STO 03 5 STO 04 2 STO 05
XEQ "PERM" yields 302,702,400 words
( including AAABBCCCCEEEEELL itself ) So, this "word" has 302,702,399
( meaningless ) anagrams
Hint: Store the largest ni into
the last register, this will reduce execution time.
References:
[1] Abramowitz and Stegun - "Handbook of Mathematical Functions"
- Dover Publications - ISBN 0-486-61272-4
[2] Press , Vetterling , Teukolsky , Flannery - "Numerical Recipes
in C++" - Cambridge University Press - ISBN 0-521-75033-4