Binomial & Multinomial Coefficients for the HP-41
Overview
1°) Binomial Coefficients
1-a) Focal Program
1-b) M-Code Routine
1-c) Long Integers
2°) Multinomial Coefficients
2-a) Focal Programs#1&2
2-b) Focal Program#3
2-c) M-Code Routine#1
2-d) M-Code Routine#2
2-e) Long Integers
-The program given in paragraph 1-a) and the 1st program in paragraph
2-a) are also listed in "Statistics and Probability for the HP-41"
which also contains an M-Code routine "CNK"
1°) Binomial Coefficients
1-a) Focal Program
-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 | Ckn |
L | / | k |
Example: n = 100
, k = 84
100 ENTER^
84 XEQ "CNK" >>>>
C84100 = 1.345860628 1018
( in 5 seconds )
1-b) M-Code Routine
-This routine uses the 13-digit routines to get a better precision.
08B "K"
00E "N"
003 "C"
2A0 SETDEC
3C8 CLRKEY
0F8 C=X
128 L=C
070 N=C ALL
2BE C=-C
10E A=C
0B8 C=Y
01D C=
060 A+C
0E8 X=C
0B0 C=N ALL
2BE C=-C
025 C=
061 AB+C
2FE ?C<0
023 JNC+04
0F8 C=X
0F0 C<>N ALL
0E8 X=C
1A0 A=B=C=0
35C C=
050 1
0A8 Y=C
0EE B<>C ALL
089 AB
064 STO Q+
0B0 C=N ALL
3CC ?KEY
Loop
Press a key to stop an infinite loop or if you think the routine is too
slow
0E7 JC+28d
2EE ?C#0 ALL
0D3 JNC+26d
0F8 C=X
02E B=0 ALL
0FA B<>C M
0AE A<>C ALL
001 C=
060 AB+1
0E8 X=C
0B0 C=N ALL
269 C=
060 AB/C
0D1 RCL
064 Q+
149 C=
060 AB*CM
0A8 Y=C
089 AB
064 STO Q+
0B0 C=N ALL
02E B=0 ALL
0FA B<>C M
0AE A<>C ALL
009 C=
060 AB-1
070 N=C ALL
323 JNC-28d
3A5 ?NC GO
052 RDN
( 62 words )
STACK | INPUTS | OUTPUTS |
T | T | n |
Z | Z | T |
Y | n | Z |
X | k | Ckn |
L | / | k |
with 0 <= k <= n
Examples:
400 ENTER^
100 XEQ "CNK" >>>>
C100400 = 2.241854791 E96
---Execution time = 13s---
1234 ENTER^
567 XEQ "CNK" >>>>
C5671234 = 1.166825443 E-32
---Execution time = 75s---
-This last result seems meaningless !
-In fact it is 1.166825443 E368
( an HP-48 gives 1.16682544286 E368 )
-Is it possible to get the correct exponent ?
-Simply press LOG the integer part is 368. And for the
mantissa, FIX 9 CLA ARCL X ANUM
ENTER^ LOG INT 10^X /
-This method may be employed provided the exponent does not exceed 499.
-Such numbers are difficult to handle though their behaviour is quite
logical: 0 + will produce OUT OF RANGE
-But .2 Y^X computes correctly the 5th root
of C5671234 i-e 4.105832027
E73
-Even if the exponent exceeds 499 , the result is still useful:
2345 ENTER^
456 XEQ "CNK" >>>>
C4562345 = 1.030717292 E-00
---Execution time = 61s---
-Press ENTER^ LOG ( which gives -499.9868604 ) 1000 + INT to get the correct exponent i-e 500
thus, C4562345 = 1.030717292 E500
-This will work until E999 and even after...
Notes:
-Like the focal program "CNK" , this M-Code routine calculates
Cpn where p = inf ( k , n-k )
for faster results since Ckn =
Cn-kn
-If the inputs are fractional or negative, there will be an infinite
loop: press any key to stop the loop.
-Of course, it would be better to test the inputs at the beginning
of the routine and return 0 or DATA ERROR in this case.
-I let you perform this improvement...
1-c) Long Integers
-"LCNK" employs several registers to compute and store the binomial
oefficients by groups of 6 digits
-It first computes n(n-1) ..... (n-k+1)
-Then, the result is divided by k(k-1).... 1 = k!
Data Registers: R00 = n , R01-R02: temp , R03 = ppp.005 = control number of the result , R04 = 10^6
R05-R06-R07 ............... -Rpp = the digits of Cnk
which must be read from Rpp to R05
Flags: /
Subroutines: /
01 LBL "LCNK"
02 X<>Y 03 STO 00 04 RCL Y 05 - 06 X>Y? 07 X<>Y 08 STO 01 09 X<>Y 10 1 11 + 12 STO 02 13 STO 05 14 E6 15 STO 04 16 5.005 17 STO 03 18 LBL 01 19 RCL 03 20 RCL 00 |
21 RCL 02
22 ENTER^ 23 SIGN 24 + 25 X>Y? 26 GTO 00 27 STO 02 28 LBL 02 29 ST* IND Z 30 ISG Z 31 GTO 02 32 R^ 33 LBL 03 34 RCL IND X 35 RCL 04 36 X>Y? 37 GTO 03 38 MOD 39 ST- IND Y 40 X<> IND Y |
41 LASTX
42 / 43 ISG Y 44 GTO 04 45 STO IND Y 46 X<>Y 47 INT 48 E3 49 / 50 5 51 + 52 STO 03 53 GTO 01 54 LBL 04 55 ST+ IND Y 56 ENTER^ 57 DSE Z 58 LBL 03 59 X<> Z 60 ISG X |
61 GTO 03
62 GTO 01 63 LBL 00 64 RCL 03 65 FRC 66 E3 67 * 68 .004 69 + 70 STO 03 71 LBL 05 72 RCL IND X 73 RCL 01 74 MOD 75 ST- IND Y 76 LASTX 77 ST/ IND Z 78 CLX 79 RCL 04 80 * |
81 DSE Y
82 X<0? 83 GTO 06 84 ST+ IND Y 85 X<>Y 86 GTO 05 87 LBL 06 88 RCL IND 03 89 X=0? 90 DSE 03 91 RCL 03 92 DSE 01 93 GTO 05 94 E-3 95 + 96 STO 03 97 END |
( 148 bytes / SIZE??? )
STACK | INPUT | OUTPUT |
Y | n | / |
X | k | eee.005 |
where 0 < k < n < 10000 and eee.005 is the control number of the result
Example: n = 100 , k = 41
100 ENTER^
41 XEQ "CNK" >>>>
9.005
---Execution time = 6m29s---
R09 = 20116 , R08 = 440213 , R07 = 369968 , R06 = 50635 , R05 = 175200
Thus, C41100 = 20116,440213,369968,050635,175200
Notes:
-Add zeros on the left if there are less than 6 digits ( like in register R06 in the example above )
-Though the final result is in registers R09 thru R05, more registers
were used to calculate n(n-1) ..... (n-k+1)
-In this example, SIZE 018 was necessary.
-Obviously, this program is not fast: even with V41 in turbo mode, about
2 minutes are required to get C5001000
-The control number is 54.005
-The first digits are 270288,240945, ...... and the last
digits are .... 799821,216320 ( approximately 2.70288240945
E299 )
-Moreover, SIZE 244 is needed.
2°) Multinomial Coefficients
2-a) Focal Programs#1&2
-This program calculates P = ( n1 , n2
, ....... nk ) ! = n ! / ( n1! n2! .......
nk! ) where n = n1 + n2
+ ...... + nk
Data Registers: • R00 = k ( Registers R00 thru Rkk are to be initialized before executing "MLN" )
• R01 = n1 • R02 = n2
..................... • Rkk = nk
Flags: /
Subroutines: /
01 LBL "MLN"
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 |
( 42 bytes / SIZE k+1 )
STACK | INPUTS | OUTPUTS |
Y | / | n |
X | / | P |
where P = ( n1 , n2 , ....... nk ) ! = n ! / ( n1! n2! ....... nk! ) with n = n1 + n2 + ...... + nk
Example: 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 "MLN" >>>> P = 9.078363541 1074 ---Execution time = 21s---
Notes:
-Store the largest ni into the last register, this will reduce
execution time.
-Lines 08-09-19 are only useful if there is an i for which ni
= 0 , otherwise, they may be deleted.
-"MLN" may also be used to compute the binomial coefficients ( with
k = 2 )
-If you get OUT OF RANGE line 14, you can press E99 ST/
L RDN R/S
-This may be done several times - say q - and when the program stops,
add q x 99 to the exponent of the result in X.
-Of course, your HP-41 can do the job for you, like in the variant hereunder:
Data Registers: • R00 = k > 1 ( Registers R00 thru Rkk are to be initialized before executing "MLN" )
• R01 = n1 • R02 = n2 ..................... • Rkk = nk
Flags: F24-F25-F29
Subroutines: /
-Line 55 , >" E" means "append space E"
01 LBL "MLN"
02 CLA 03 RCL 00 04 1 05 - 06 SF 25 07 RCL IND 00 08 LBL 01 09 RCL IND Y 10 LBL 02 11 X<>Y 12 ISG X 13 CLX |
14 ST* L
15 FS? 25 16 GTO 02 17 E99 18 ST/ L 19 CLX 20 99 21 ST+ M 22 RDN 23 ST* L 24 SF 25 25 LBL 02 26 X<>Y |
27 ST/ L
28 DSE X 29 GTO 02 30 RDN 31 DSE Y 32 GTO 01 33 LASTX 34 ENTER^ 35 ENTER^ 36 LOG 37 INT 38 X<> M 39 STO N |
40 SF 24
41 10^X 42 * 43 X<>Y 44 RCL M 45 ST+ N 46 10^X 47 / 48 RCL N 49 X<> Z 50 CF 24 51 CF 25 52 FIX 9 |
53 " "
54 ARCL Y 55 >" E" 56 FIX 0 57 CF 29 58 ARCL Z 59 FIX 9 60 SF 29 61 AVIEW 62 END |
( 110 bytes / SIZE kkk+1 )
STACK | INPUTS | OUTPUTS |
T | / | n |
Z | / | exponent |
Y | / | mantissa |
X | / | P |
where P = ( n1 , n2 , ....... nk ) ! = n ! / ( n1! n2! ....... nk! ) with n = n1 + n2 + ...... + nk
Example1: Calculate ( 12 , 20 , 41 , 84 ) ! = 157! / ( 12! 20! 41! 84! )
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 "MLN" >>>> the HP-41 displays: 9.078363541 E74 ---Execution time = 29s---
and
X = 9.078363541 E74
RDN Y = 9.078363541 = mantissa
RDN Z = 74 = exponent
RDN T = 157 = n which is saved in T-register.
Example2: Calculate ( 76 , 107 , 112 , 184 ) ! = 479! / ( 76! 107! 112! 184! )
4 STO 00
76 STO 01 107 STO 02
112 STO 03 184 STO 04
XEQ "MLN" >>>> the HP-41 displays 3.849801810 E273 ---Execution time = 107s---
and
X = 9.999999999 E99
( out of range: the result can't be displayed by normal means )
RDN Y = 3.849801810 = mantissa
RDN Z = 273 = exponent
RDN T = 479 = n which is saved in T-register.
Notes:
-If you want to use this program with some ni = 0 , add
LBL 03 after line 29 and X=0? GTO 03 after line
09.
-On the other hand, if you don't want to get the result in the alpha
register, delete lines 50 to 61.
2-b) Focal Program#3
-The multinomial coefficient ( n1 , n2 , ....... nk ) ! may also be computed by a product of binomial coefficients:
( n1 , n2 , ....... nk
) ! = Cn(k-1)n(k)+n(k-1) + Cn(k-2)n(k)+n(k-1)+n(k-2)
+ ................... + Cn(1)n
where n = n1 + n2 + ...... + nk
Data Registers: • R00 = k > 1 ( Registers R00 thru Rkk are to be initialized before executing "MLN" )
• R01 = n1 • R02 = n2 ..................... • Rkk = nk
Flags: /
Subroutine: "CNK" ( M-Code routine
or
focal program )
01 LBL "MLN"
02 RCL 00 03 1 04 STO Z 05 - 06 RCL IND 00 07 LBL 01 08 RCL IND Y 09 ST+ Y 10 CNK 11 ST* Z 12 X<> T 13 DSE Y 14 GTO 01 15 RCL Z 16 END |
( 34 bytes / SIZE kkk+1 )
STACK | INPUTS | OUTPUTS |
Y | / | n |
X | / | P |
L | / | n1 |
where P = ( n1 , n2 , ....... nk ) ! = n ! / ( n1! n2! ....... nk! ) and n = n1 + n2 + ...... + nk
Example: Calculate ( 16 , 24 , 41 , 48 ) !
4 STO 00 16 STO 01 24 STO 02 41 STO 03 48 STO 04
XEQ "MLN" >>>> P = 9.227558922 1069
---Execution time = 11s---
2-c) M-Code Routine#1
-Like "CNK", "MLN" uses the 13-digit routines to get a better
precision.
-It takes k in X-register and gives ( n1 , n2
, ....... nk ) ! in X-register.
Data Registers: R00 unused ( Registers R01 thru Rkk are to be initialized before executing "MLN" )
• R01 = n1 • R02 = n2 ..................... • Rkk = nk
Flags: /
Subroutines: /
08E "N"
00C "L"
00D "M"
3C8 CLRKEY
0F8 C=X
128 L=C
38D ?NCXQ
008 C->S&X
changes k into a hexadecimal number in S&X field of register C
106 A=C S&X
378 C=c
03C RCR 3
146 A=A+C S&X
1BC RCR 11
0A6 A<>C S&X
070 N=C ALL
CPU register N now contains 2 absolute addresses in hexadecimal:
R00 , Rkk
106 A=C S&X
130 LDI S&X
200 200h
306 ?A<C S&X
checks that Rkk does exist
381 ?NC GO
00A NONEXISTENT
1A0 A=B=C=0
35C C=
050 1
0E8 X=C
0EE B<>C ALL
089 AB
064 STO Q+
0B0 C=N ALL
270 RAMSLCT
038 READATA
10E A=C ALL
046 C=0 S&X
270 RAMSLCT
0AE A<>C ALL
0A8 Y=C
Y-register now contains n(k)
0B0 C=N ALL
LOOP1
260 SETHEX
266 C=C-1 S&X
070 N=C ALL
106 A=C S&X
03C RCR 3
0A6 A<>C S&X
306 ?A<C S&X
3A0 ?NC RTN
270 RAMSLCT
038 READATA
10E A=C ALL
046 C=0 S&X
270 RAMSLCT
0AE A<>C ALL
2A0 SETDEC
068 Z=C
LOOP2
3CC ?KEY
360 ?C RTN
Press a key to stop the routine if you think it's too slow or to stop an
infinite loop
2EE ?C#0 ALL
363 JNC-20d
GOTO LOOP1
0B8 C=Y
02E B=0 ALL
0FA B<>C M
0AE A<>C ALL
001 C=
060 AB+1
0A8 Y=C
078 C=Z
269 C=
060 AB/C
0D1 RCL
064 Q+
149 C=
060 AB*CM
0E8 X=C
089 AB
064 STO Q+
078 C=Z
02E C
0FA ->
0AE AB
009 C=
060 AB-1
323 JNC-28d
GOTO LOOP2
( 81 words )
STACK | INPUTS | OUTPUTS |
T | T | T |
Z | Z | 0 |
Y | Y | n |
X | k | P |
L | L | k |
where P = ( n1 , n2 , ....... nk ) ! = n ! / ( n1! n2! ....... nk! ) with n = n1 + n2 + ...... + nk
Examples:
• Calculate ( 16 , 24 , 41 , 48 ) !
16 STO 01 24 STO 02 41 STO 03 48 STO 04
4 XEQ "MLN" >>>> P = 9.227558919
E69
---Execution time = 10s---
• Calculate ( 76 , 107 , 112 , 184 ) !
76 STO 01 107 STO 02 112 STO 03 184 STO 04
4 XEQ "MLN" >>>> P = 3.849801799 E273 ---Execution time = 38s---
-The exponent is actually displayed E-27 , press ENTER^
LOG to get the correct exponent
-The mantissa may be viewed by an M-code routine like "VM" or
press FIX 9 CLA ARCL X
Notes:
-If k = 0 or 1 , this routine returns 1.
-If k is fractional or negative, 38D 008 changes k in a
non-negative hexadecimal integer.
-However, the contents of registers R01 to Rkk are not checked for
alpha data and if these registers contain negative or fractional numbers,
this will produce an infinte loop: simply press any key to stop
the routine.
-You can use LOG like with "CNK" to use the results if the
exponent is > 99 .
2-d) M-Code Routine#2
-This variant also takes k in X-register and returns the mantissa of
( n1 , n2 , ....... nk ) ! in X-register
and its exponent inY-register
which is of course more explicit than the routine above, at
least if the exponent is > 99
Data Registers: R00 unused ( Registers R01 thru Rkk are to be initialized before executing "MLN" )
• R01 = n1 • R02 = n2 ..................... • Rkk = nk
Flags: /
Subroutines: /
08E "N"
00C "L"
00D "M"
3C8 CLRKEY
0F8 C=X
38D ?NCXQ
008 C->S&X
changes k into a hexadecimal number in S&X field of register C
106 A=C S&X
378 C=c
03C RCR 3
146 A=A+C S&X
1BC RCR 11
0A6 A<>C S&X
070 N=C ALL
CPU register N now contains 2 absolute addresses in hexadecimal:
R00 , Rkk
106 A=C S&X
130 LDI S&X
200 200h
306 ?A<C S&X
checks that Rkk does exist
381 ?NC GO
00A NONEXISTENT
04E C=0 ALL
0A8 Y=C
35C C=
050 1
0E8 X=C
0B0 C=N ALL
270 RAMSLCT
038 READATA
10E A=C ALL
046 C=0 S&X
270 RAMSLCT
0AE A<>C ALL
128 L=C
L-register now contains n(k)
0B0 C=N ALL
LOOP1
260 SETHEX
266 C=C-1 S&X
070 N=C ALL
106 A=C S&X
03C RCR 3
0A6 A<>C S&X
306 ?A<C S&X
14B JNC+41
270 RAMSLCT
038 READATA
10E A=C ALL
046 C=0 S&X
270 RAMSLCT
0AE A<>C ALL
2A0 SETDEC
268 Q=C
LOOP2
3CC ?KEY
360 ?C RTN
Press a key to stop the routine if you think it's too slow or to stop an
infinite loop
2EE ?C#0 ALL
363 JNC-20d
GOTO LOOP1
138 C=L
02E B=0 ALL
0FA B<>C M
0AE A<>C ALL
001 C=
060 AB+1
128 L=C
278 C=Q
269 C=
060 AB/C
04E C=0 ALL
158 M=C ALL
0F8 C=X
149 C=
060 AB*CM
0EE B<>C ALL
0E8 X=C
01A A=0 M
0B8 C=Y
20E C=A+C ALL
0A8 Y=C
278 C=Q
02E C
0FA ->
0AE AB
009 C=
060 AB-1
303 JNC-32d
GOTO LOOP2
2A0 SETDEC
1A0 A=B=C=0
0F8 C=X
0EE B<>C
025 C=
060 AB+C
0E8 X=C
0B8 C=Y
2EE ?C#0 ALL
3A0 ?NC RTN
10E A=C ALL
130 LDI S&X
013 013
3EE LSHFA
266 C=C-1 S&X
35E ?A#0 MS
3EB JNC-03
38E RSHFA
0BA A<>C M
0A8 Y=C
3E0 RTN
( 103 words )
STACK | INPUTS | OUTPUTS |
T | T | T |
Z | Z | Z |
Y | / | exp |
X | k | mantissa |
L | / | n |
with P = ( n1 , n2 , ....... nk ) ! = n ! / ( n1! n2! ....... nk! ) = mantissa x 10^exp and n = n1 + n2 + ...... + nk
Examples:
• Calculate ( 76 , 107 , 112 , 184 ) !
76 STO 01 107 STO 02 112 STO 03 184 STO 04
4 XEQ "MLN" >>>> P = 3.849801799 X<>Y 273 whence P = 3.849801799 E273 ---Execution time = 38s---
• Calculate ( 123 , 456 , 789 , 1234 ) !
123 STO 01 456 STO 02 789 STO 03 1234 STO 04
4 XEQ "MLN" >>>> P = 5.596708693 X<>Y 1311 thus P = 5.596708693 E1311 ---Execution time = 182s---
Notes:
-If k = 0 or 1 , this routine returns 1.
-If k is fractional or negative, 38D 008 changes k in a
non-negative hexadecimal integer.
-However, the contents of registers R01 to Rkk are not checked for alpha
data and if these registers contain negative or fractional numbers,
this will produce an infinte loop: simply press any key to stop
the routine.
-Of course, "MLN" may also be used to compute binomial coefficients with k = 2
>>>> Store the largest ni into the last register to
reduce the execution time.
2-e) Long Integers
-If we want the exact result, we must use several registers to store all the digits - here by groups of 6 digits.
-"LMNL" is quite similar to "LCNK" listed in paragraph 1-c)
Data Registers: R00-R01-R02: temp , R03 = ppp.005 = control number of the result , R04 = 10^6
R05-R06-R07 ............... -Rpp = the digits of ( n1
, n2 , ....... nk ) ! which must be read from
Rpp to R05
Flags: F10-F29
Subroutines: /
-Line 84 , > ( before "=?" ) denotes the append character.
01 LBL "LMLN"
02 " N=?" 03 PROMPT 04 STO 00 05 " N1=?" 06 PROMPT 07 STO 01 08 1 09 + 10 STO 02 11 STO 05 12 E6 13 STO 04 14 5.005 15 STO 03 16 LBL 01 17 RCL 03 18 RCL 00 19 RCL 02 20 ENTER^ 21 SIGN 22 + 23 X>Y? 24 GTO 00 25 STO 02 26 LBL 02 27 ST* IND Z 28 ISG Z |
29 GTO 02
30 R^ 31 LBL 03 32 RCL IND X 33 RCL 04 34 X>Y? 35 GTO 03 36 MOD 37 ST- IND Y 38 X<> IND Y 39 LASTX 40 / 41 ISG Y 42 GTO 04 43 STO IND Y 44 X<>Y 45 INT 46 RCL 04 47 SQRT 48 / 49 5 50 + 51 STO 03 52 GTO 01 53 LBL 04 54 ST+ IND Y 55 SIGN 56 - |
57 STO Z
58 LBL 03 59 X<> Z 60 ISG X 61 GTO 03 62 GTO 01 63 LBL 00 64 RCL 03 65 FRC 66 RCL 04 67 SQRT 68 * 69 .004 70 + 71 STO 03 72 SF 10 73 1 74 STO 02 75 RCL 01 76 ST- 00 77 LBL 10 78 ISG 02 79 LBL 12 80 FIX 0 81 CF 29 82 " N" 83 ARCL 02 84 >"=?" |
85 FIX 4
86 SF 29 87 PROMPT 88 STO 01 89 RCL 00 90 X<>Y 91 - 92 X<0? 93 GTO 12 94 STO 00 95 1 96 X<>Y 97 X#Y? 98 X=0? 99 CF 10 100 X<>Y 101 RCL 01 102 X#Y? 103 GTO 00 104 FS? 10 105 GTO 10 106 GTO 07 107 LBL 00 108 RCL 03 109 LBL 05 110 RCL IND X 111 RCL 01 112 MOD |
113 ST- IND Y
114 LASTX 115 ST/ IND Z 116 CLX 117 RCL 04 118 * 119 DSE Y 120 X<0? 121 GTO 06 122 ST+ IND Y 123 X<>Y 124 GTO 05 125 LBL 06 126 RCL IND 03 127 X=0? 128 DSE 03 129 RCL 03 130 DSE 01 131 GTO 05 132 FS? 10 133 GTO 10 134 LBL 07 135 RCL 03 136 E-3 137 + 138 STO 03 139 END |
( 215 bytes / SIZE ??? )
STACK | INPUT | OUTPUT |
X | / | eee.005 |
with 0 < ni < n < 10000 and eee.005 is the control number of the result
Example: Compute P = ( 16 , 24 , 41 , 48 ) ! = 129! / ( 16! 24! 41! 48! )
XEQ "LMLN" >>>> "N=?"
129
R/S "N1=?"
48
R/S "N2=?"
( 12m50s )
41
R/S "N3=?"
( 7m28s )
24
R/S "N4=?"
( 3m12s )
16
R/S 16.005
( 1m45s )
and we get in registers R16 thru R05
P = 9227,558919,428890,741185,817619,801447,846479,197604,492597,531243,374784,200000
-Approximately: 9.227558919 E69
Notes:
-Key in the numbers ni in decreasing order to save execution
time & data registers.
-In this example, SIZE must be at least 032.
-Add zeros on the left if there less than 6 digits ( for instance read
001234 if a data register contains 1234 )