Factorials

# Factorials for the HP-41

Overview

1°)  Integer Arguments

a)  Focal Program
b)  M-Code Routine#1
c)  M-Code Routine#2
d)  Long Integers

2°)  Real Arguments

a)  Focal Program
b)  M-Code Routine
c)  Log ( n! )

3°)  Multifactorials

a)  Focal Program
b)  M-Code Routine
c)  Log ( M(n) )
d)  Long Integers

4°)  Superfactorials

a)  Focal Program
b)  M-Code Routine
c)  Log ( Sf(n) )
d)  Long Integers

5°)  Hyperfactorials

a)  Focal Program
b)  3 M-Code Routines
c)  Log ( H(n) )
d)  Long Integers

1°)  Integer Arguments

a)  Focal Program

-The HP-41 has of course a built-in function  FACT which works perfectly to get  n!  provided  n < 70  ( otherwise, OUT OF RANGE )
-The internal form

3B1   ?NCXQ    C=
060    18EC      fact(C)         may be used if  n < 100

-So, we must write programs if we want to overcome these limitations.

-"FCT" returns n! in register X ( 9.999999999 E99 if n > 69 ), the mantissa in Y-register and the exponent in Z-register
-It also displays the result which is stored in the alpha register.

Data Registers: /
Flags:  F24-F25-F29
Subroutines: /

-Line 48 is:   append space E

 01  LBL "FCT"  02  SIGN  03  0  04  X<>Y  05  X<> L  06  X=0?  07  GTO 02         08  SF 25  09  LBL 01  10  ST* L  11  FS? 25 12  GTO 01   13   E99  14  ST/ L  15  CLX  16  99  17  ST+ Z  18  RDN  19  ST* L  20  SF 25  21  LBL 01         22  DSE X 23  GTO 01   24  LBL 02   25  X<> L  26  ENTER^  27  ENTER^  28  LOG  29  INT  30  X<> T  31  STO M         32  SF 24  33  10^X 34  *  35  X<>Y  36  R^  37  ST+ M  38  10^X  39  /  40  0  41  X<> M         42  X<> Z  43  CF 24  44  CF 25 45  FIX 9  46  "  "  47  ARCL Y  48  >" E"  49  FIX 0  50  CF 29  51  ARCL Z        52  FIX 9  53  SF 29  54  AVIEW   55  END

( 99 bytes / SIZE 000 )

 STACK INPUTS OUTPUTS Z / exponent Y / mantissa X n n !

and  n !  is stored in alpha register and displayed at the end

Example:

357   XEQ "FCT"   >>>>   8.608917246 E757  is displayed                  ---Execution time = 78s---

Press the backarrow key   9.999999999 E99
RDN                 8.608917246         the mantissa
RDN                 757                        the exponent

-The last 3 digits of the mantissa should be 198 instead of 246

b)  M-Code Routine#1

-"FCT"  calculates n!  by computing  n(n-1)(n-2).... 1  with a 13-digit routine to get a better precision.

-Synthetic register Q is used.
-There is no check for alpha data.

094   "T"
003   "C"
006   "F"
2A0   SETDEC
3C8  CLRKEY
0F8   C=X
128   L=C
1A0  A=B=C=0
35C  C=
050   1
0E8   X=C
0EE   B<>C ALL
089   AB
064   STO Q+
138   C=L
070   N=C ALL                            LOOP
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
3A0  ?NC RTN
02E   C
0FA  ->
0AE  AB
0D1  RCL
064  Q+
149  C=
060  AB*CM
0E8  X=C
089  AB
064  STO Q+
0B0  C=N ALL
02E   C
0FA  ->
0AE  AB
009   C=
060   AB-1
35B  JNC-21d

( 37 words )

 STACK INPUTS OUTPUTS T T T Z Z Z Y Y Y X n n ! L / n

where  n is a non-negative integer.

Examples:

10    XEQ "FCT"  >>>>   362880

100   XEQ "FCT"  >>>>   9.332621544 E-43                   ---Execution time = 7s---

-The exponent seems wrong but press  ENTER^  LOG  and you get  157.9700037  so the exponent is 157   and  100 ! =  9.332621544 E157

-This method may be used provided the exponent remains smaller than  500, for instance:

253   XEQ "FCT"  >>>>   5.173460992 E499                     ---Execution time = 17s---

-But let's try   449   XEQ "FCT"  >>>>  3.851930518 E-3                      ---Execution time = 31s---

Here, press ENTER^  LOG  1000  +  and it yields  997.5856784  thus,   449 ! = 3.851930518 E997

-Likewise, we can find   450 ! = 1.733368733 E1000  and so on ...

Notes:

-Though the HP-41 cannot display correctly the numbers > 9.999999999 E99, we can get the correct exponent by such tricks.

-If the argument is not a non-negative integer, there will be an infinite loop: press any key to stop the loop.
-Of course, it would be preferable to test the input at the beginning of the routine...

Variant:

-The routine will run about 33% faster if we do not use   089   064  ( AB  STO Q+ )  and  0D1  064  ( RCL Q+ )

094   "T"
003   "C"
006   "F"
2A0   SETDEC
3C8  CLRKEY
0F8   C=X
128   L=C
04E  C=0 ALL
268  Q=C
35C  C=
050   1
0E8   X=C
138   C=L
070   N=C ALL                     LOOP
3CC  ?KEY
360   ?C RTN                                              Press a key to stop the routine if you think it's too slow
2EE   ?C#0 ALL
09B   JNC+19d
278   C=Q
10E  A=C ALL
0F8  C=X
0EE  B<>C ALL
0B0  C=N ALL
13D  C=
060  AB*C
0EE  B<>C ALL
0E8  X=C
0AE  A<>C ALL
268  Q=C
0B0  C=N ALL
02E   C
0FA  ->
0AE  AB
009   C=
060   AB-1
353  JNC-22d                       GOTO LOOP
278  C=Q
10E  A=C ALL
0F8  C=X
0EE  B<>C
04E  C=0 ALL
025  C=
060  AB+C
0E8  X=C
3E0  RTN

( 45 words )

 STACK INPUTS OUTPUTS T T T Z Z Z Y Y Y X n n ! L / n

where  n is a non-negative integer.

Example:

449   XEQ "FCT"  >>>>  3.851930518 E-3                      ---Execution time = 20s---   ( instead of 31s )

ENTER^  LOG  1000  +  and it yields  997.5856784  thus,   449 ! = 3.851930518 E997

c)  M-Code Routine#2

-It is of course better to get the exponent more explicitly.

-This program takes a non-negative integer n in register X and returns the mantissa of n! in X-register and the exponent in Y-register.
-If n is negative or fractional, you'll get a DATA ERROR message.
-However, there is no check for alpha data.

-Press any key to stop the routine if you wish.

094   "T"
003   "C"
006   "F"
2A0   SETDEC
3C8  CLRKEY
0F8   C=X
128   L=C
2FE  ?C#0 MS
0B5   ?CGO
0A3   DATAERROR
084   C
0ED  =
064   frc(C)
2EE  ?C#0 ALL
0B5   ?CGO
0A3   DATAERROR
078   C=Z
028   T=C
0B8   C=Y
068   Z=C
04E  C=0 ALL
0A8  Y=C
35C   C=
050    1
0E8   X=C
138   C=L
2EE  ?C#0 ALL
3A0  ?NC RTN
070   N=C ALL                     LOOP
3CC  ?KEY
360   ?C RTN                                              Press a key to stop the routine if you think it's too slow
2EE   ?C#0 ALL
0A3   JNC+20d
1A0  A=B=C=0
0F8  C=X
0EE  B<>C ALL
0B0  C=N ALL
13D  C=
060  AB*C
0EE  B<>C ALL
0E8  X=C
01A  A=0 M
0B8  C=Y
20E  C=A+C ALL
0A8  Y=C
0B0  C=N ALL
02E   C
0FA  ->
0AE  AB
009   C=
060   AB-1
34B  JNC-23d                       GOTO LOOP
1A0  A=B=C=0
0F8  C=X
0EE  B<>C
025  C=                                 Theoretically, the mantissa may be rounded to 10 if the 13-digit mantissa is > 9.999999999499
060  AB+C                            but that seems highly improbable in practice.
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

( 72 words )

 STACK INPUTS OUTPUTS Y / exponent X n mantissa L / n

where n is a non-negative integer

Examples:

0     XEQ "FCT"   >>>>   1  X<>Y  0  so  0! = 1 E0 = 1

7     XEQ "FCT"   >>>>   5.040   X<>Y   3          so   7! =  5.040 E3 = 5040

357   XEQ "FCT"   >>>>   8.608917198  X<>Y   757    whence   357 ! =  8.608917198  E757                ---Execution time = 16s---

449   XEQ "FCT"  >>>>    3.851930518  X<>Y   997    whence   449 ! =  3.851930518  E997                 ---Execution time = 20s---

1234  XEQ "FCT"   >>>>   5.108498145  X<>Y  3280   whence  1234 ! = 5.108498145 E3280               ---Execution time = 58s---

2345  XEQ "FCT"   >>>>   4.452388605  X<>Y  6886   whence  2345 ! = 4.452388605 E6886               ---Execution time = 112s---

Notes:

-Register Z & Y are saved in T & Z respectively.
-This routine is actually much faster than the 1st one !

-Even with 13-digit routines, thousands of multiplications may produce small roundoff-errors:
-In the last example, the exact value is   2345 ! = 4.45238860677855988 ......  E6886   ( I will not write the 6887 digits... )

d)  Long Integers

-Except for small arguments, FACT & "FCT" only return approximate results.
-If we want all the digits, several data registers must be used to store them.

-"LFCT" calculates n!  by groups of 6 digits.  The REGMOVE function from the X-functions module is used.

Data Registers:            R00 = number of zeros to be added to the result in R01-R02 ................

Rmm , Rm-1 , Rm-2 , ............... , R01 =  the digits of n !
Flags: /
Subroutines: /

 01  LBL "LFCT"  02  CLRG   03   E3  04  /  05  10  06  +  07  STO M         08  9  09  FACT  10  STO 01   11  SIGN 12  STO N  13   E6  14  STO O  15  LBL 01   16  SIGN  17  RCL N   18  RCL O         19  SQRT  20  /  21  +  22  ENTER^ 23  CLX  24  LBL 02   25  RCL IND Y  26  RCL M   27  INT  28  *  29  +  30  ENTER^  31  ENTER^  32  RCL O         33  ST/ Z 34  MOD  35  STO IND Z  36  RDN  37  INT  38  ISG Y  39  GTO 02   40  ST+ IND Y  41  X#0?  42  ISG N   43  CLX  44  RCL 01 45  X#0?  46  GTO 03  47  6  48  ST+ 00  49  RCL N   50  RCL O         51  /  52  2.001  53  +  54  REGMOVE  55  DSE N 56  LBL 03   57  ISG M  58  GTO 01   59  RCL M         60  INT  61  DSE X  62  RCL N   63   E-3  64  +  65  CLA  66  END

( 109 bytes / SIZE ??? )

 STACK INPUTS OUTPUTS Y / n X n mmm.001

where  n is an integer ( 9 < n < 1000 ) and  mmm.001  is the control number of the result

Example:

100   XEQ "LFCT"   >>>>   23.001                               ---Execution time = 8m23s---

R23 = 93   R22 = 326215   R21 = 443944   R20 = 152681   R19 = 699238   R18 = 856266   R17 = 700490   R16 = 715968   R15 = 264381
R14 = 621468   R13 = 592963   R12 = 895217   R11 = 599993   R10 = 229915   R09 = 608941   R08 = 463976   R07 = 156518   R06 = 286253
R05 = 697920   R04 = 827223   R03 = 758251   R02 = 185210   R01 = 916864

and   R00 = 24  so we must add  24 zeros at the right of the number above:

100 ! =  93,326215,443944,152681,699238,856266,700490,715968,264381,621468,592963,895217,599993,229915,608941,463976,156518,
286253,697920,827223,758251,185210,916864,000000,000000,000000,000000.

Note:

-Add zeros on the left if there are less than 6 digits in a register - except the first one ( for instance read 001234 instead of 1234 )

2°)  Real Arguments

a)  Focal Program

-The 2 following routines are quite similar to those listed in "Gamma Function for the HP-41"
-They simply use the formula  x ! = Gam(x+1)

-This program employs the continued fraction that s used in the program "GAM3":

Gam(x) = [ x^(x-1/2) ] sqrt(2.Pi) exp [ -x + ( 1/12 )/( x + ( 1/30 )/( x + ( 53/210)/( x + (195/371)/( x + ...  )))) ]

Data Registers: /
Flags: /
Subroutines: /

 01  LBL "FCT"  02  FRC  03  X#0?  04  GTO 00          05  LASTX  06  FACT  07  RTN  08  LBL 00  09  1  10  LASTX  11  5 12  X<>Y  13  LBL 01   14  1  15  +  16  ST* Z  17  XY  26  /  27  RCL Y          28  +  29  30  30  *  31  1/X  32  RCL Y   33  + 34  12  35  *  36  1/X  37  RCL Y          38  -  39  E^X  40  PI  41  ST+ X   42  SQRT  43  R^  44  / 45  *  46  X<>Y  47  R^  48  .5  49  ST+ Y          50  *  51  Y^X  52  ST* Y   53  *  54  END

( 79 bytes / SIZE 000 )

 STACK INPUT OUTPUT X x x !

where  x is a real number ( integer or not ).

Examples:

PI    XEQ "FCT"   >>>>   7.188082733
-1.28    R/S      >>>>    -4.526689379
69.7    R/S      >>>>      3.343680763 E99
10      R/S      >>>>      3628800

Notes:

-If n is a negative integer, you'll get DATA ERROR
-If n is a non-negative integer, the built-in function FACT is used and the routine stops at line 07.

-It would be more rigorous to replace line 20 by   371   *   195   X<>Y   /   RCL Y    but this doesn't seem to change the results significantly.

b)  M-Code Routine

-The same continued fraction is used again.
-There is no check for alpha data.

094  "T"
003  "C"
006  "F"
2A0  SETDEC
0F8  C=X
128  L=C
3C8  CLRKEY
084  C
0ED  =
064  frc(C)
2EE  ?C#0
06F  JC+13d
0F8  C=X
2FE  ?C<0
027  JC+04
3B1  C=
060  fact(C)
02B  JNC+05
04E  C
27A  =
130
099  MAXR
0E8  X=C
3E0  RTN
268  Q=C
138  C=L
070  N=C
10E  A=C
04E  C
35C  =
190  6
0E8  X=C
2BE  C=-C
01D  ?CXQ
061  C=A+C
2FE  ?C<0
05B  JNC+11d
0F8  C=X
10E  A=C
278  C=Q
35C  PT=12
2FE  ?C<0
013  JNC+02
162  A=A+1 @PT
01D  C=
060  A+C
070  N=C ALL
0B0  C=N  ALL
10E  A=C
04E  C
35C
0D0  =
1D0
050  3.71
135  C=
060  A*C
04E  C
35C
050  =
250
150  1.95
269  C=
060  AB/C
239  C=
060  1/AB
0B0  C=N ALL
025  C=
060  AB+C
04E  C
35C
090  =
050
226  21
13D  C=
060  AB*C
239  C=
060  1/AB
04E  C
35C  =
150
0D0  5.3
13D  C=
060  AB*C
0B0  C=N ALL
025  C=
060  AB+C
04E  C
35C  =
0D0
226  30
13D  C=
060  AB*C
239  C=
060  1/AB
0B0  C=N ALL
025  C=
060  AB+C
04E  C
35C
050  =
090
226  12
13D  C=
060  AB*C
239  C=
060  1/AB
0B0  C=N ALL
2BE  C=-C
025  C=
061  AB+C
089  AB
064  STO Q+
04E  C
35C  =
150
266  0.5
10E  A=C
0B0  C=N ALL
01D  C=
060  A+C
0E8  X=C
0B0  C=N ALL
084  C
115  =
06C  LN(C)
0F8  C=X
13D  C=
060  AB*C
0D1  RCL
064  Q+
031  C=
060  AB+CM
044  C
035  =
068  exp(AB)
138  C=L
0E8  X=C
089  AB                          loop
064  STO Q+
0F8  C=X
10E  A=C
0B0  C=N ALL
36E  ?A#C
07B  JNC+15d
3CC  ?KEY                                        Press any key to stop the loop if you want
360  ?C RTN
04E  C
35C  =
050   1
01D  C=
060   A+C
0E8  X=C
0A9  AB
064  <>Q+
0F8  C=X
269  C=
060  AB/C
363  JNC-20d                 goto loop
271  C
064  =
1EE
1EE  2 x PI ( 13 digits )
0EE  B<>C
00E  A=0
305  C=
060  sqrt(AB)
0D1  RCL
064  Q+
149  C=
060  AB*CM
0E8  X=C
3E0  RTN

( 172 words )

 STACK INPUT OUTPUT X x x !

where  x is a real number ( integer or not ).

Examples:

PI      XEQ "FCT"   >>>>     7.188082733
-1.28    XEQ "FCT"   >>>>    -4.526689374
69.7    XEQ "FCT"   >>>>      3.343680766 E99
-41.7   XEQ "FCT"   >>>>     -3.545755999 E-49                     in less than 5 seconds
10      XEQ "FCT"   >>>>      3628800
-3      XEQ "FCT"   >>>>       9.999999999 E99

Notes:

-For all negative integers, FCT returns  9.999999999 E99
-If n is a non-negative integer, the built-in function FACT is used: the results may be exploited provided n < 100

99  XEQ "FCT"  >>>>  9.332621544 E-45  which is in fact  9.332621544 E155    ( press  ENTER^ LOG  to get the correct exponent )

-If x is not an integer, x must be smaller than about  120.755.....   ( with x = 120.756 the result is wrong )

120.755  XEQ "FCT"  gives  2.497842660 E-00  which is actually  2.497842660 E200    ( press  ENTER^ LOG  to get the correct exponent )

c)  Log ( n! )

-This short program computes Log(n!) where n > -1 and it's especially usefull to get an idea of n! when n is a large number.
-It's almost the same as "LOGAM" listed in "Gamma Function for the HP-41"
-We employ an asymptotic series.

Data Registers: /
Flags: /
Subroutines: /

 01  LBL "LOGFCT"  02  1  03  +  04  LOG  05  STO M             06  16  07  LASTX  08  LBL 01  09  1  10  + 11  LOG  12  ST+ M   13  X<> L  14  XY   25  12  26  *  27  /  28  X<>Y               29  -  30  10 31  LN  32  /  33  X<>Y  34  ENTER^           35  LOG  36  *  37  +  38  X<>Y   39  PI  40  * 41  ST+ X  42  SQRT  43  LOG  44  +  45  0  46  X<> M             47  -  48  END

( 69 bytes / SIZE 000 )

 STACK INPUT OUTPUT X x Log (x!)

where  x > -1.

Examples:

1000   XEQ "LOGFCT"  >>>>  2567.604644
1234              R/S            >>>>  3280.708294                              ---Execution time = 3s---
2345              R/S            >>>>  6886.648594

Notes:

-The results are not very accurate to get n! but the routine is fast !
-In the last example,  FRC  10^X  gives  4.452398215  whence  2345 ! = 4.45239(8215) E6886

-The correct result is  4.45238860677855988 ......  E6886  we have at most 6 significant digits:
-That is logical since  FRC  gave  0.648594  with 6 significant digits too...

3°)  Multifactorials

a)  Focal Program

-Factorials may be generalized as follows:

double factorial   n!! = n(n-2)(n-4) .......          all the factors remaining positive.
triple factorial    n!!! = n(n-3)(n-6) .......

..........................................................

multifactorials  n !....! = n(n-k)(n-2k).....        where k = the number of  "!"s

Data Registers: /
Flags: /
Subroutines: /

 01  LBL "MFCT"  02  1  03  STO T  04  RDN  05  X<=0?  06  GTO 02  07  LBL 01  08  ST* Z  09  RCL Y  10  -  11  X>0?  12  GTO 01  13  LBL 02  14  X<> Z  15  END

( 30 bytes / SIZE 000 )

 STACK INPUTS OUTPUTS Y k k X n n !!......!

where n is a non-negative integer and  k = the number of "!"s

Examples:

2    ENTER^
100  XEQ "MFCT"  >>>>   100 !! = 3.424322474 E79

3    ENTER^
100    R/S        >>>>    100 !!! = 1.745486670 E53

4    ENTER^
100    R/S        >>>>    100 !!!! = 1.746406994 E40

Note:

-This program may also be used to compute factorials ( k = 1 )

b)  M-Code Routine

-An M-Code routine will give faster and more accurate results.
-This one is very similar to "FCT" listed in §1-c)

-It takes k in Y-register & n in X-register and returns the mantissa of n!....! ( k "!"s ) in X-register and the exponent in Y-register.
-There is no check for alpha data.
-Press any key to stop the routine if it's too slow.

094   "T"
003   "C"
006   "F"
00D  "M"
2A0   SETDEC
3C8  CLRKEY
0B8  C=Y
05E  C= | C |
2BE  C=-C
070   N=C ALL                         CPU register N contains  (-k)
0F8   C=X
128   L=C
04E  C=0 ALL
0A8  Y=C
35C   C=
050    1
0E8   X=C
138   C=L
2EE  ?C#0 ALL
3A0  ?NC RTN
268   Q=C                      LOOP
3CC  ?KEY
360   ?C RTN                                              Press a key to stop the routine if you think it's too slow
2EE   ?C#0 ALL
0AB   JNC+21d
2FE   ?C#0 MS
09F   JC+19d
1A0  A=B=C=0
0F8  C=X
0EE  B<>C ALL
278  C=Q
13D  C=
060  AB*C
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
10E  A=C ALL
0B0  C=N ALL
01D  C=
060   A+C
343  JNC-24d                       GOTO LOOP
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

( 65 words )

 STACK INPUTS OUTPUTS T T T Z Z Z Y k exponent X n mantissa L / n

where n is a non-negative integer & k is the number of "!"s

Examples:

5      ENTER^
1234   XEQ "MFCT"   >>>>   2.641604251   X<>Y    657   so   1234 !!!!! = 2.641604251 E657                           ---Execution time = 12s---

6       ENTER^
12345   XEQ "MFCT"   >>>>   7.556280567   X<>Y   7526   so   12345 !!!!!! = 7.556280567 E7526                  ---Execution time = 103s---

Notes:

-Press any key to stop the loop if you wish
-Actually, only | k | is taken into account: k = +5 or k = -5 will give the same output.
-If n or k are not integers, the product n(n-k)(n-2k).....  will be performed until the factor becomes non-positive.

-Of course, "MFCT" may also be used to compute factorials ( with k = 1 ), for instance:

1      ENTER^
2345   XEQ "MFCT"  >>>>     4.452388605  X<>Y  6886   whence  2345 ! = 4.452388605 E6886               ---Execution time = 166s---

-The reults are identical to those given by "FCT" listed in paragraph 1-c) ... and the execution times too !

c)  Log ( M(n) )

-"LOGMF" calculates  Log (M(n)) = Log n + Log (n-k) + ......

Data Registers: /
Flags: /
Subroutines: /

 01  LBL "LOGMF"  02  STO M  03  0  04  X<>Y  05  LBL 01  06  LOG  07  +  08  RCL M  09  RCL Z  10  -  11  STO M  12  X>0?  13  GTO 01  14  CLX  15  STO M  16  +  17  END

( 33 bytes / SIZE 000 )

 STACK INPUT OUTPUT Y k k X n > 0 Log M(n)

where  n is a positive integer

Examples:

2      ENTER^
100    XEQ "LOGMF"   >>>>   Log ( 100 !! )  =  79.53457468                     ---Execution time = 20s---

999     ENTER^
123456  XEQ "LOGMF"  >>>>   Log ( 123456 ! ..... ! ) = 578.0564932           ---Execution time = 53s---

Notes:

-In the last example, there are 999  "!"s
-We can write an M-Code routine for a better precision:

086   "F"
00D  "M"
00C  "L"
2A0  SETDEC
3C8  CLRKEY
0F8   C=X
128   L=C
1A0  A=B=C=0
0E8   X=C
089   AB
064   STO Q+
138   C=L
070   N=C ALL            Loop
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
3A0   ?NC RTN
2FE   ?C#0 MS
360    ?C RTN
088   C
115   =
06C  Log(C)
0D1  RCL
064  Q+
031   C=
060  AB+CM
0E8  X=C
089  AB
064  STO Q+
0B8  C=Y
2BE  C=-C
10E   A=C ALL
0B0  C=N ALL
01D  C=
060  A+C
34B  JNC-23d                    goto Loop

( 36 words )

 STACK INPUTS OUTPUTS Y k > 0 k X n > 0 Log M(n) L / n

where  n & k positive integers

Examples:

2      ENTER^
100    XEQ "LMF"   >>>>   Log ( 100 !! )  =  79.53457466                     ---Execution time = 13s---

999     ENTER^
123456  XEQ "LMF"  >>>>   Log ( 123456 ! ..... ! ) = 578.0564933           ---Execution time = 35s---

Note:

-With k = 1,  "LMF" computes Log (n!)

d)  Long Integers

-Like "LFCT", "LMFCT" computes M(n) by groups of 6 digits

Data Registers:            R00 = number of zeros to be added to the result in R01-R02 ................

Rmm , Rm-1 , Rm-2 , ............... , R01 =  the digits of  M(n)
Flags: /
Subroutines: /

 01  LBL "LMFCT"  02  STO M  03  X<>Y  04  STO N  05  1.001  06  STO O  07  CLX  08  STO 00  09  SIGN  10  STO 01            11  LBL 01  12  RCL O  13  RCL M  14  LBL 02  15  ST* IND Y  16  ISG Y  17  GTO 02  18  RCL O 19  LBL 03  20  RCL IND X  21   E6  22  X>Y?  23  GTO 05            24  MOD  25  ST- IND Y  26  X<> IND Y  27  LASTX  28  /  29  ISG Y  30  GTO 04  31  STO IND Y  32  X<>Y  33  INT  34   E3  35  /  36  ISG X 37  STO O  38  GTO 06  39  LBL 04  40  ST+ IND Y  41  ENTER^  42  DSE Z  43  LBL 05            44  X<> Z  45  ISG X  46  GTO 03  47  LBL 06  48  RCL 01  49  X#0?  50  GTO 07  51  6  52  ST+ 00  53  RCL O  54  FRC 55   E3  56  *  57  DSE X  58  STO Y  59  LASTX  60  X^2  61  /  62  2.001  63  +  64  REGMOVE  65  CLX  66   E3  67  /  68  ISG X  69  STO O  70  LBL 07            71  CLX  72  SIGN 73  RCL M  74  RCL N  75  -  76  STO M  77  X>Y?  78  GTO 01           79  RCL O  80  FRC  81   E3  82  ST* Y  83  1/X  84  +  85  CLA  86  END

( 147 bytes / SIZE ??? )

 STACK INPUTS OUTPUTS Y k > 0 / X n > 0 mmm.001

where  n & k positive integers ( n < 10000 ) and mmm.001 is the control number of the result

Example:

1234   ENTER^
9999   XEQ "LMFCT"  >>>>  6.001   and  R00 = 0  ( no zero must be added to the result )

-We have  R06 = 36    R05 = 139932    R04 = 60227    R03 = 617285    R02 = 723555    R01 = 932975

-Thus,  9999 !!....! ( 1234 "!"s ) = 36,139932,060227,617285,723555,932975   ( approximately  3.613993206 E31 )

Notes:

-If there are less than 6 digits, add zeros on the left ( for instance, read  R04 = 060227 )
-With k = 1 , "LMFCT" will calculate n !

4°)  Superfactorials

a)  Focal Program

-'SFCT" calculates Sf(n) = n! (n-1)! (n-2)! ....... 2! 1! 0!

Data Registers: /
Flags: /
Subroutines: /

 01  LBL "SFCT"  02  SIGN  03  LASTX  04  LBL 01  05  FACT  06  ST* Y  07  X<> L  08  DSE X  09  GTO 01  10  RDN  11  END

( 24 bytes / SIZE 000 )

 STACK INPUT OUTPUT X n Sf(n)

where  n is a non-negative integer & Sf(n) =  n! (n-1)! (n-2)! ....... 2! 1! 0!

Examples:

0   XEQ "SFCT"   >>>>   Sf(0) =   1
4          R/S           >>>>   Sf(4) =  288
16         R/S           >>>>  Sf(16) = 1.890966834 E90

-For n = 17 , there is an OUT OF RANGE

Note:

-Clifford A. Pickover also defines another superfactorial in "Keys to Infinity" page 102 ( reference 6 )  n\$ = n!^...^n!^n!  where n!  is repeated n! times.
-They seem very difficult to compute except for very small n-values...

b)  M-Code Routine

-We could modify the M-Code routine "FCT" but the following program ( "SMFCT" ) combines "MFCT" & "SFCT"
-So, it can be used to compute factorials ( k = 1 ) , multifactorials ( k > 1 ) and superfactorials ( k = -1 )

094   "T"
003   "C"
006   "F"
00D  "M"
013   "S"
2A0   SETDEC
3C8  CLRKEY
104  CLRF 8
0B8  C=Y
2FE  ?C#0 MS
013   JNC+02
108   SETF 8
05E  C= | C |
2BE  C=-C
070   N=C ALL                         CPU register N contains  - | k |
0F8   C=X
128   L=C
04E  C=0 ALL
0A8  Y=C
35C   C=
050    1
0E8   X=C
138   C=L
2EE  ?C#0 ALL
12B  JNC+37d
268   Q=C                      LOOP
3CC  ?KEY
360   ?C RTN                                              Press a key to stop the routine if you think it's too slow
2EE   ?C#0 ALL
0AB   JNC+21d
2FE   ?C#0 MS
09F   JC+19d
1A0  A=B=C=0
0F8  C=X
0EE  B<>C ALL
278  C=Q
13D  C=
060  AB*C
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
10E  A=C ALL
0B0  C=N ALL
01D  C=
060   A+C
343  JNC-24d                       GOTO LOOP
10C  ?FSET 8
053   JNC+10d
138   C=L
02E   C
0FA  ->
0AE  AB
009   C=
060   AB-1
128   L=C
2EE  ?C#0 ALL
2EF   JC-35d                         GOTO LOOP
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

( 81 words )

 STACK INPUTS OUTPUTS T T T Z Z Z Y k exponent X n mantissa

where n is a non-negative integer & k is the number of "!"s  for multifactorials.   k = -1  for superfactorials

Examples:

1      ENTER^
2345   XEQ "SMFCT"  >>>>     4.452388605  X<>Y   6886   whence  2345 ! = 4.452388605 E6886               ---Execution time = 111s---

6       ENTER^
12345   XEQ "SMFCT"   >>>>   7.556280567   X<>Y   7526   so   12345 !!!!!! = 7.556280567 E7526             ---Execution time = 103s---

-1     ENTER^
41    XEQ "SMFCT"   >>>>      4.885831876   X<>Y   873  whence  Sf(41) = 4.885831876  E873                   ---Execution time = 36s---

-1     ENTER^
100   XEQ "SMFCT"   >>>>      2.703176855   X<>Y   6940   thus    Sf(100) = 2.703176855  E6940               ---Execution time = 214s---

Note:

-"SMFCT" may also be used with k = -2 , -3 , .... to calculate  n!! (n-1)!! (n-2)!! ...... and   n!!! (n-1)!!! (n-2)!!! ......   though I don't know if it's really usefull.

c)  Log ( Sf(n) )

-"LOGSF" calculates  Log (Sf(n)) = Log [ n! (n-1)! (n-2)! ....... 2! 1! ]
-It uses the same formula as "LOGFCT" in paragraph 2-c)

Data Registers: /
Flags: /
Subroutines: /

 01  LBL "LOGSF"  02  CLA  03  STO N   04  LBL 10        05  RCL N            06  1  07  +  08  LOG  09  ST- M  10  16  11  LASTX 12  LBL 01   13  1  14  +  15  LOG  16  ST- M  17  X<> L             18  XY             29  12  30  *  31  /  32  X<>Y  33  - 34  10  35  LN  36  /  37  X<>Y  38  ENTER^          39  LOG  40  *  41  +  42  X<>Y  43  PI  44  * 45  ST+ X  46  SQRT  47  LOG  48  +  49  ST+ M  50  DSE N  51  GTO 10           52  X<> M  53  CLA  54  END

( 79 bytes / SIZE 000 )

 STACK INPUT OUTPUT X n Log [ Sf(n) ]

where  n is a non-negative integer & Sf(n) =  n! (n-1)! (n-2)! ....... 2! 1! 0!

Example:

10   XEQ "LOGSF"  >>>>   Log (Sf(10)) = 27.82338353             ---Execution time = 65s---

Notes:

-The last 2 decimals are wrong
-A better formua - with more terms in the asymptotic series - would give of course a better accuracy...

-The variant hereunder employs a more elementary method which is preferable if n is not too large:

Log Sf(n) = 1 Log n + 2 Log (n-1) + 3 Log (n-2) + ...... + n Log 1

Data Registers: /
Flags: /
Subroutines: /

 01  LBL "LOGSF"  02  STO M  03  SIGN  04  0  05  LBL 01  06  RCL M  07  LOG  08  RCL Z  09  *  10  +  11  ISG Y  12  CLX  13  DSE M  14  GTO 01  15  END

( 31 bytes / SIZE 000 )

 STACK INPUT OUTPUT X n > 0 Log Sf(n)

where  n is a positive integer

Examples:

10   XEQ "LOGSF"  >>>>   Log (Sf(10)) = 27.82338336             ---Execution time = 5s---

100  XEQ "LOGSF"  >>>>   Log (Sf(100)) = 6940.431879           ---Execution time = 54s---

Note:

-The following M-Code routine uses the same method:

086   "F"
013   "S"
00C  "L"
2A0  SETDEC
3C8  CLRKEY
0F8   C=X
070   N=C ALL
1A0  A=B=C=0
128   L=C
089   AB
064   STO Q+
138   C=L                              Loop
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
02E   C
0FA  ->
0AE  AB
001   C=
060   AB+1
128   L=C
088   C
115   =
06C  Log(C)
0B0  C=N ALL
13D  C=
060   AB*C
0D1  RCL
064  Q+
031   C=
060  AB+CM
0E8  X=C
089  AB
064  STO Q+
0B0  C=N ALL
02E   C
0FA  ->
0AE  AB
009  C=
060  AB-1
070  N=C ALL
2EE  ?C#0 ALL
317  JNC-30d                           goto Loop
3E0  RTN

( 43 words )

 STACK INPUT OUTPUT X n > 0 Log Sf(n) L / n

where  n is a positive integer

Examples:

10    XEQ "LSF"  >>>>   Log (Sf(10)) = 27.82338336             ---Execution time = 3s---

100   XEQ "LSF"  >>>>   Log (Sf(100)) = 6940.431874           ---Execution time = 31s---

1000  XEQ "LSF"  >>>>   Log (Sf(1000)) = 1177245.511         ---Execution time = 5m24s---

d)  Long Integers

-If we want all the digits, several data registers must be used to store them.

-"LSFCT" calculates Sf(n)  by groups of 6 digits.  The REGMOVE function from the X-functions module is used.

Data Registers:            R00 = number of zeros to be added to the result in R01-R02 ................

Rmm , Rm-1 , Rm-2 , ............... , R01 =  the digits of Sf(n)
Flags: /
Subroutines: /

-Line 90 is a three-byte GTO 10

 01  LBL "LSFCT"  02  STO 01   03   E6  04  STO N  05  1.001  06  STO O   07  CLX  08  STO 00   09  SIGN  10  X<> 01  11  LBL 10   12  RCL N  13  SQRT  14  /  15  2  16  +  17  STO M            18  LBL 01  19  RCL O  20  RCL M 21  INT  22  LBL 02  23  ST* IND Y  24  ISG Y  25  GTO 02   26  RCL O   27  LBL 03  28  RCL IND X  29  RCL N  30  X>Y?  31  GTO 05   32  MOD  33  ST- IND Y  34  X<> IND Y  35  LASTX  36  /  37  ISG Y  38  GTO 04           39  STO IND Y  40  X<>Y 41  INT  42  RCL N  43  SQRT  44  /  45  ISG X  46  STO O   47  GTO 06   48  LBL 04  49  ST+ IND Y  50  ENTER^  51  DSE Z  52  LBL 05   53  X<> Z  54  ISG X  55  GTO 03           56  LBL 06  57  RCL 01  58  X#0?  59  GTO 07  60  6 61  ST+ 00  62  RCL O   63  FRC  64  RCL N   65  SQRT  66  *  67  DSE X  68  STO Y  69  RCL N   70  /  71  2.001  72  +  73  REGMOVE  74  CLX  75  RCL N             76  SQRT  77  /  78  ISG X  79  STO O   80  LBL 07 81  ISG M  82  GTO 01   83  CLX  84  SIGN  85  RCL M   86  INT  87  2  88  -  89  X>Y?  90  GTO 10  91  RCL O            92  FRC  93   E3  94  ST* Y  95  1/X  96  +  97  CLA  98  END

( 164 bytes / SIZE ??? )

 STACK INPUT OUTPUT X n mmm.001

where  n is an integer ( 1 < n < 1000 ) and  mmm.001  is the control number of the result

Examples:

•  10  XEQ "LSFCT"  >>>>   4.001                               ---Execution time = 87s---

R04 = 6658    R03 = 606584    R02 = 104736    R01 = 522240  &  R00 = 6 zeros to add on the right

-Whence   Sf(10) = 6658,606584,104736,522240,000000    ( approximately  6.658606584 E27 )

•  41  XEQ "LSFCT"  >>>>   118.001                            ---Execution time = several hours---   ( V41 in turbo mode is preferable )

R118 = 4885   R117 = 831876  .......................  R02 = 724851    R01 = 200000        R00 = 168

-You can check that  Sf(41) =

4885831876911199922535923458596922414263022771295934189443274148270199837389494004711909972672987233752
5619370340788379771991357781209553324584667109104833395981620779095261652107715556366032754444863043260
0869714329763066401198372444861903682765000887343163113829267580062367575521410631749338487229360389773
2239349531719939588145981827516350700200493273745612968699958924658210871599738389102330295346404136128
8323220093103506346463801828526038711001495475735727877014022882457875749302679561878377839682128010664
1374901877816660520680981245203287001765885516903031502642011575504076480041176841698560314015530446023
8022531783028878525746632438552494719100713807005964600719820199559851929303724851200000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000.

Notes:

-Add zeros on the left if there are not enough digits in a register ( for instance; read  001234  instead of  1234 )
-Though the control numbers could handle n = 999, there are not enough registers to store all the digits of  Sf(999)

5°)  Hyperfactorials

a)  Focal Program

-'HFCT" calculates H(n) = nn (n-1)n-1  ....... 22 11

Data Registers: /
Flags: /
Subroutines: /

 01  LBL "HFCT"  02  1  03  LBL 01  04  RCL Y  05  ENTER^  06  Y^X  07  *  08  DSE Y  09  GTO 01  10  END

( 22 bytes / SIZE 000 )

 STACK INPUT OUTPUT X n H(n)

where  n is a non-negative integer & H(n) =  nn (n-1)n-1  ....... 22 11

Examples:

1   XEQ "HFCT"   >>>>   H(1)  =   1
4          R/S           >>>>   H(4)   =  27648
14         R/S           >>>>   H(14) =  1.847398448 E99                   ---Execution time = 8s---

Note:

n = 15  produces an OUT OF RANGE

b)  3 M-Code Routines

-"HFCT" computes the hyperfactorial of a non-negative integer with 13-digit routines.
-Synthetic register P is cleared ( it could be replaced by register Z or another stack-register T or L )

-There is no check for alpha data.

094   "T"
003   "C"
006   "F"
008   "H"
2A0   SETDEC
3C8  CLRKEY
0F8   C=X
128   L=C
04E   C=0 ALL
0A8  Y=C
35C   C=
050   1
0E8   X=C
138   C=L
070   N=C ALL
2EE  ?C#0 ALL
3A0  ?NC RTN
006   A=0 S&X              the 8 words from this one shift the digits of n into the right part of the mantissa field of register C
39C  PT=0                      then, it's stored into synthetic registers P & Q
1A2  A=A-1@PT
362   ?A#C @PT            Thus, it's simpler and faster to decrement these numbers by 1: we simply have to use  27A  C=C-1 M  to perform k-1 multiplications.
01B   JNC+03
3DA  RSHFC M
3E3   JNC-04
046   C=0 S&X
27A  C=C-1 M
268   Q=C                       Loop1
228   P=C                        Loop2
3CC  ?KEY
360   ?C RTN                                              Press a key to stop the routine if you think it's too slow
1A0  A=B=C=0
0F8  C=X
0EE  B<>C ALL
0B0  C=N ALL
13D  C=
060   AB*C
0EE  B<>C ALL
0E8  X=C
01A  A=0 M
0B8  C=Y
20E  C=A+C ALL
0A8  Y=C
238   C=P
27A  C=C-1 M
37B  JNC-17d                goto loop2
0B0  C=N ALL
02E   C
0FA  ->
0AE  AB
009   C=
060   AB-1
070  N=C ALL
278  C=Q
27A  C=C-1 M
323   JNC-28d                goto  loop1
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

( 75 words )

 STACK INPUTS OUTPUTS T T T Z Z Z Y Y exponent X n mantissa L L n

where n is a non-negative integer

Examples:

14    XEQ "HFCT"   gives    1.847398449   X<>Y   99     whence   H(14) =  1.847398449  E99                     ---Execution time = 3s---
100   XEQ "HFCT"   yields   3.455370850   X<>Y  9014    thus      H(100) = 3.455370850  E9014                ---Execution time = 148s---
234   XEQ "HFCT"   yields   6.891346366   X<>Y  59196   so       H(234) = 6.891346366  E59196               ---Execution time = 13m08s---

Note:

-The following variant avoids using synthetic register P
-It's slightly slower but it saves 3 words:

094   "T"
003   "C"
006   "F"
008   "H"
2A0   SETDEC
3C8  CLRKEY
0F8   C=X
128   L=C
04E   C=0 ALL
0A8  Y=C
35C   C=
050   1
0E8   X=C
138   C=L
070   N=C ALL
2EE  ?C#0 ALL
3A0  ?NC RTN
006   A=0 S&X              Loop1
39C  PT=0
1A2  A=A-1@PT
362   ?A#C @PT
01B   JNC+03
3DA  RSHFC M
3E3   JNC-04
27A  C=C-1 M
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
1A0  A=B=C=0
0F8  C=X
0EE  B<>C ALL
0B0  C=N ALL
13D  C=
060   AB*C
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
27A  C=C-1 M
37B  JNC-17d                goto loop2
0B0  C=N ALL
02E   C
0FA  ->
0AE  AB
009   C=
060   AB-1
070   N=C ALL
2EE  ?C#0 ALL
2F7   JNC-34d                goto  loop1
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

( 72 words )

 STACK INPUTS OUTPUTS T T T Z Z Z Y Y exponent X n mantissa L L n

where n is a non-negative integer

Example:   ( same results as above )

100   XEQ "HFCT"   yields   3.455370850   X<>Y  9014    thus      H(100) = 3.455370850  E9014                ---Execution time = 149s---

Note:

-The 2 routines listed above calculate  m^m  by performing m-1 multiplications.
-The following one performs much less operations, at least if n is not too small.
-So, we can expect faster and more accurate results.

-Synthetic registers O & P are cleared, except for n = 0.
-There is no check for alpha data.

094   "T"
003   "C"
006   "F"
008   "H"
2A0   SETDEC
3C8  CLRKEY
0F8   C=X
128   L=C
04E   C=0 ALL
0A8  Y=C
35C   C=
050   1
0E8   X=C
138   C=L
2EE  ?C#0 ALL
3A0  ?NC RTN
268   Q=C                     Loop1
070   N=C ALL
05A  C=0 M
228   P=C
0B0  C=N ALL
046   C=0 S&X
1E8   O=C
0B0   C=N ALL            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
10E   A=C ALL
04E   C
35C  =
090   2
261   C=
060   A/C
070   N=C ALL
084   C
0ED  =
064   frc(C)
2BE  C=-C
10E  A=C ALL
0F0  C<>N ALL
01D  C=
060   A+C
0F0  C<>N ALL
2FA  ?C#0 M
083   JNC+16d
1A0  A=B=C=0
1F8  C=O
0EE  B<>C 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
14E  A=A+C ALL
238  C=P
20E  C=A+C ALL
0A8  Y=C
0B0  C=N ALL
2EE  ?C#0 ALL
08B  JNC+17d
1A0  A=B=C=0
1F8  C=O
0EE  B<>C ALL
158  M=C ALL
1F8  C=O
149  C=
060  AB*CM
0EE  B<>C ALL
1E8  O=C
01A  A=0 M
238  C=P
1EE  C=C+C ALL
20E  C=A+C ALL
228  P=C
25B  JNC-53d                         goto loop2
21B  JNC-61d                         goto loop1
278  C=Q
02E   C
0FA  ->
0AE  AB
009   C=
060   AB-1
2EE  ?C#0 ALL
3C7  JC-08
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
05B  JNC+11d
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
04E   C=0 ALL
1E8   O=C
228   P=C
3E0   RTN

( 109 words )

 STACK INPUTS OUTPUTS T T T Z Z Z Y Y exponent X n mantissa L L n

where n is a non-negative integer

Examples:

14    XEQ "HFCT"   gives    1.847398449   X<>Y   99     whence   H(14)  = 1.847398449  E99                     ---Execution time = 4.6s---
100   XEQ "HFCT"   yields   3.455370850   X<>Y  9014    thus      H(100) = 3.455370853  E9014                ---Execution time = 64s---
234   XEQ "HFCT"   yields   6.891346366   X<>Y  59196   so       H(234) = 6.891346393  E59196               ---Execution time = 186s---

Notes:

-Though the routine is slightly slower for n = 14, we save more than 1 minute for n = 100 and more than 10 minutes for n = 234.
-For n = 100 & 234, roundoff-errors are also smaller.

-There will be an infinite loop if n is negative or fractional: press any key to stop the loop.

c)  Log ( H(n) )

-"LOGHF" simply uses the formula::

Log ( H(n) ) = n Log n + ( n-1 ) Log ( n-1 ) + ................. + 2 Log 2 + 1 Log 1

Data Registers: /
Flags: /
Subroutines: /

 01  LBL "LOGHF"  02  0  03  LBL 01  04  RCL Y  05  ENTER^  06  LOG  07  *  08  +  09  DSE Y  10  GTO 01  11  END

( 24 bytes / SIZE 000 )

 STACK INPUT OUTPUT X n > 0 Log H(n)

where  n is a positive integer

Examples:

4   XEQ "LOGHF"   >>>>     Log H(4)   =   4.441663720
14           R/S             >>>>     Log H(14)  =  99.26656058                   ---Execution time = 7s---
100          R/S             >>>>    Log H(100) =  9014.538503                   ---Execution time = 47s---

Note:

-The following M-Code routine uses the same method:

086   "F"
008   "H"
00C  "L"
2A0  SETDEC
3C8  CLRKEY
0F8   C=X
128   L=C
1A0  A=B=C=0
0E8   X=C
089   AB
064   STO Q+
138   C=L
070   N=C ALL                             Loop
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
3A0  ?NC RTN
088   C
115   =
06C  Log(C)
0B0  C=N ALL
13D  C=
060   AB*C
0D1  RCL
064  Q+
031   C=
060  AB+CM
0E8  X=C
089  AB
064  STO Q+
0B0  C=N ALL
02E   C
0FA  ->
0AE  AB
009  C=
060  AB-1
343  JNC-24d                goto Loop

( 37 words )

 STACK INPUT OUTPUT X n Log H(n) L / n

where  n is a non-negative integer

Examples:

100   XEQ "LHF"  >>>>   Log H(100)  =  9014.538495          ---Execution time = 29s---
234   XEQ "LHF"  >>>>   Log H(234)  =  59196.83830          ---Execution time = 71s---
1000  XEQ "LHF"  >>>>   Log H(1000) = 1392926.737          ---Execution time = 5m09s---

d)  Long Integers

-"LHFCT" calculates H(n)  by groups of 6 digits.  The REGMOVE function from the X-functions module is used.

Data Registers:            R00 = number of zeros to be added to the result in R01-R02 ................

Rmm , Rm-1 , Rm-2 , ............... , R01 =  the digits of H(n)
Flags: /
Subroutines: /

 01  LBL "LHFCT"  02   E3  03  /  04  ISG X  05  STO N   06  1.001  07  STO O   08  CLX  09  STO 00  10  SIGN  11  STO 01   12  LBL 10  13  RCL N  14  STO M           15  LBL 01  16  RCL O  17  RCL M 18  INT  19  LBL 02  20  ST* IND Y  21  ISG Y  22  GTO 02  23  RCL O   24  LBL 03   25  RCL IND X  26   E6  27  X>Y?  28  GTO 05           29  MOD  30  ST- IND Y  31  X<> IND Y  32  LASTX  33  /  34  ISG Y 35  GTO 04  36  STO IND Y  37  X<>Y  38  INT  39   E3  40  /  41  ISG X  42  STO O   43  GTO 06           44  LBL 04   45  ST+ IND Y  46  ENTER^  47  DSE Z  48  LBL 05  49  X<> Z  50  ISG X  51  GTO 03 52  LBL 06  53  RCL 01  54  X#0?  55  GTO 07  56  6  57  ST+ 00  58  RCL O            59  FRC  60   E3  61  *  62  DSE X  63  LASTX  64  /  65  STO O  66  LASTX  67  /  68  2.001 69  +  70  REGMOVE  71  ISG O  72  LBL 07  73  ISG M  74  GTO 01   75  ISG N  76  GTO 10  77  RCL O            78  FRC  79   E3  80  ST* Y  81  1/X  82  +  83  CLA  84  END

( 146 bytes / SIZE ??? )

 STACK INPUT OUTPUT X n mmm.001

where  n is an integer ( 0 < n < 1000 ) and  mmm.001  is the control number of the result

Example:

•  10  XEQ "LHFCT"  >>>>   6.001                                              ---Execution time = 144s---

R06 = 215                 R03 = 562091             and    R00 = 12   ( 12 zeros must be added on the right )
R05 = 779412           R02 = 680268
R04 = 229418           R01 = 288000

-Whence  H(10) = 215,779412,229418,562091,680268,288000,000000,000000.

-Approximately  H(10) = 2.157794122 E44

References:

   N.J.A. Sloane's On-Line Encyclopedia of Integer Sequences: www.research.att.com/~njas/sequences
   http://mathworld.wolfram.com/Multifactorial.html
   http://oeis.org/A000178
   http://mathworld.wolfram.com/Hyperfactorial.html
   http://oeis.org/A002109
   Clifford A. Pickover - "Keys to Infinity" - John Wiley & Sons -  ISBN  0-471-11857-5