hp41programs

LERCH

Lerch Transcendent Function for the HP-41


Overview
 

 1°)  Real Arguments

  a)  Focal Program
  b)  M-Code Routine

 2°)  Complex Arguments
 3°)  Quaternionic Arguments
 

-Lerch transcendent function is defined by    F( x , s , a ) = SUM k=0,1,2,....   xk / ( a + k )s        ( F is the greek letter "PHI" )
-The following programs compute this sum and stop when 2 consecutive partial sums are equal.
 

1°)  Real Arguments
 

     a)  Focal Program
 

-Here, we assume that  x , s , a  are  3 real numbers  ( a # 0 , -1 , -2 , ..... )
 

Data Registers:      R00 to R03: temp
Flags: /
Subroutines: /
 
 

 01  LBL "LERCH"
 02  STO 01
 03  CLX
 04  SIGN
 05  STO 00
 06  RDN
 07  STO 02
 08  X<>Y
 09  STO 03
 10  CHS
 11  Y^X
 12  LBL 01
 13  RCL 01
 14  RCL 00
 15  *
 16  STO 00
 17  RCL 02
 18  1
 19  +
 20  STO 02
 21  RCL 03
 22  Y^X
 23  /
 24  +
 25  X#Y?
 26  GTO 01
 27  END

 
( 38 bytes / SIZE 004 )
 
 

      STACK        INPUTS      OUTPUTS
           Z             s     F( x , s , a )
           Y             a     F( x , s , a )
           X             x     F( x , s , a )

 
Examples:

    PI   ENTER^
   0.6  ENTER^
   0.7  XEQ "LERCH"   >>>>  F( 0.7 ; PI ; 0.6 ) = 5.170601130                           ---Execution time = 28s---

     3    ENTER^
  -4.6  ENTER^
   0.8      R/S         >>>>   F( 0.8 ; 3 ; -4.6 ) =  3.152827048                              ---Execution time = 41s---

Note:

-Execution time tends to infinity as | x | tends to 1.
 

     b)  M-Code Routine
 

-Faster results may be obtained with M-Code.
-However, the Y^X function remains relatively slow, so the improvement is real but not fantastic !

-No data register is used and the alpha "register" is undisturbed.
-But synthetic register Q is employed.
 

088   "H"
003   "C"
012   "R"
005   "E"
00C  "L"
2A0   SETDEC
0F8   C=X
128   L=C
078   C=Z
2BE   C=-C
0E8   X=C
3C4   C
045    =
06C   Y^C
070    N=C ALL
04E   C
35C  =
050   1
068   Z=C
078   C=Z               LOOP
10E   A=C ALL
138   C=L
135   C=
060   A*C
068   Z=C
0B8   C=Y
02E   C
0FA  ->
0AE  AB
001   C=
060   AB+1
0A8  Y=C
0F8   C=X
3C4   C
045    =
06C   Y^C
078    C=Z
13D   C=
060    AB*C
0B0   C=N ALL
025   C=
060   AB+C
0F0   C<>N ALL
10E   A=C ALL
0B0  C=N ALL
36E   ?A#C ALL
32F   JC-27d                                  goto  LOOP
0E8   X=C
046   C
270   =
038   T
068   Z=C
0A8  Y=C
3E0   RTN

( 54 words )
 
 

      STACK        INPUTS      OUTPUTS
           T             T            T
           Z             s            T
           Y             a            T
           X             x     F( x , s , a )
           L             L             x

 
Examples:

    PI   ENTER^
   0.6  ENTER^
   0.7  XEQ "LERCH"   >>>>  F( 0.7 ; PI ; 0.6 ) = 5.170601129                           ---Execution time = 19s---

     3    ENTER^
  -4.6  ENTER^
   0.8      R/S         >>>>   F( 0.8 ; 3 ; -4.6 ) =  3.152827047                              ---Execution time = 27s---

Notes:

-Execution time also tends to infinity as | x | tends to 1.
-The M-Code routine is about 34% as fast as the focal program.
-There is no check for alpha data, overflow or underflow.
 

2°)  Complex Arguments
 

-We now assume that  z , s , a  may be complex numbers.
 
 

Data Registers:      R00 & R05 to R10: temp               ( Registers R01 thru R04 are to be initialized before executing "ZLER" )

                                 •  R01-R02  =  s
                                 •  R03-R04  =  a

Flags: /
Subroutines:  "Z*Z"  "Z^Z"  ( cf "Complex Functions for the HP-41" )
 
 

 01  LBL "ZLER"
 02  STO 05
 03  X<>Y
 04  STO 06
 05  CLX
 06  STO 00 
 07  STO 10      
 08  SIGN
 09  STO 09
 10  RCL 04
 11  RCL 03
 12  RCL 02
 13  CHS
 14  RCL 01
 15  CHS
 16  XEQ "Z^Z"
 17  STO 07
 18  X<>Y
 19  STO 08
 20  LBL 01
 21  RCL 10      
 22  RCL 09
 23  RCL 06
 24  RCL 05
 25  XEQ "Z*Z"
 26  STO 09 
 27  X<>Y
 28  STO 10
 29  RCL 04
 30  RCL 03
 31  RCL 00
 32  1
 33  +
 34  STO 00      
 35  +
 36  RCL 02 
 37  CHS
 38  RCL 01
 39  CHS
 40  XEQ "Z^Z"
 41  RCL 10
 42  RCL 09
 43  XEQ "Z*Z"
 44  RCL 07 
 45  +
 46  ENTER^
 47  X<> 07
 48  -
 49  ABS
 50  X<>Y
 51  RCL 08      
 52  +
 53  ENTER^
 54  X<> 08
 55  -
 56  ABS
 57  +
 58  X#0?
 59  GTO 01
 60  RCL 08 
 61  RCL 07      
 62  END

 
   ( 90 bytes / SIZE 011 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             y             Y
           X             x             X

   where   X + i Y = F( x+i.y , s , a )

Example:   Compute   F( 0.3 + 0.4 i  , 3 + 4 i , 1 + 2 i )

      3   STO 01        1   STO 03
      4   STO 02        2   STO 04

     0.4   ENTER^
     0.3   XEQ "ZLER"  >>>>      7.658159106                                        ---Execution time = 60s---
                                   X<>Y    -1.515114365

-So,   F( 0.3 + 0.4 i  , 3 + 4 i , 1 + 2 i ) =  7.658159106 - 1.515114365 i

Notes:

-The last decimals may differ according to the version of "Z^Z" or "Z*Z" that you are using.
-The execution time was measured with an M-Code routine for Z*Z
 

3°)  Quaternionic Arguments
 

-We can generalize the formulas above in several ways since the multiplication is not commutative.
-Moreover, q^q'  has also several definitions.

-"QLER"  calculates   F( x , s , a ) = SUM k=0,1,2,....   qk  ( a + k ) -s

   with   b^c = exp [ ( Ln b ) c ]
 

Data Registers:      R00 to R08: temp                   ( Registers R09 thru R16 are to be initialized before executing "QLER" )

                                 •  R09 to R12  =  s                 R17 to R20 = q        R22 to R25 = q^k
                                 •  R13 to R16  =  a                     R21 = k               R26 to R29 = Sum

Flags: /
Subroutines:  "Q*Q"  "Q^Q" - the 2nd version - ( cf "Quaternions for the HP-41" )

-Line 144 is a three-byte  GTO 01
 
 

  01  LBL "QLER"
  02  STO 17        
  03  RDN
  04  STO 18
  05  RDN
  06  STO 19
  07  X<>Y
  08  STO 20
  09  CLX
  10  STO 21
  11  STO 23
  12  STO 24
  13  STO 25
  14  SIGN
  15  STO 22
  16  RCL 13
  17  STO 01
  18  RCL 14
  19  STO 02
  20  RCL 15
  21  STO 03
  22  RCL 16
  23  STO 04
  24  RCL 09
  25  CHS
  26  STO 05
  27  RCL 10
  28  CHS
  29  STO 06
  30  RCL 11
  31  CHS
  32  STO 07
  33  RCL 12        
  34  CHS
  35  STO 08
  36  XEQ "Q^Q"
  37  STO 26
  38  RDN
  39  STO 27
  40  RDN
  41  STO 28
  42  X<>Y
  43  STO 29
  44  LBL 01
  45  RCL 17
  46  STO 01
  47  RCL 18
  48  STO 02
  49  RCL 19
  50  STO 03
  51  RCL 20
  52  STO 04
  53  RCL 22
  54  STO 05
  55  RCL 23
  56  STO 06
  57  RCL 24
  58  STO 07
  59  RCL 25
  60  STO 08
  61  XEQ "Q*Q"
  62  STO 22
  63  RDN
  64  STO 23        
  65  RDN
  66  STO 24
  67  X<>Y
  68  STO 25
  69  RCL 13
  70  RCL 21
  71  1
  72  +
  73  STO 21
  74  +
  75  STO 01
  76  RCL 14
  77  STO 02
  78  RCL 15
  79  STO 03
  80  RCL 16
  81  STO 04
  82  RCL 09
  83  CHS
  84  STO 05
  85  RCL 10
  86  CHS
  87  STO 06
  88  RCL 11
  89  CHS
  90  STO 07
  91  RCL 12
  92  CHS
  93  STO 08
  94  XEQ "Q^Q"
  95  STO 05        
  96  RDN
  97  STO 06
  98  RDN
  99  STO 07
100  X<>Y
101  STO 08
102  RCL 22
103  STO 01
104  RCL 23
105  STO 02
106  RCL 24
107  STO 03
108  RCL 25
109  STO 04
110  XEQ "Q*Q"
111  STO 01
112  CLX
113  RCL 27
114  +
115  ENTER^
116  X<> 27
117  -
118  ABS
119  X<>Y
120  RCL 28
121  +
122  ENTER^
123  X<> 28
124  -
125  ABS
126  +
127  X<>Y
128  RCL 29
129  +
130  ENTER^
131  X<> 29
132  -
133  ABS
134  +
135  RCL 01        
136  RCL 26
137  +
138  ENTER^
139  X<> 26
140  -
141  ABS
142  +
143  X#0?
144  GTO 01
145  RCL 29
146  RCL 28
147  RCL 27
148  RCL 26
149  END

 
    ( 221 bytes / SIZE 030 )
 
 

      STACK        INPUTS      OUTPUTS
           T             t             T
           Z             z             Z
           Y             y             Y
           X             x             X

   where   X + i Y + j Z + k T  = F( x+i.y+j.z+k.t , s , a )   provided   R09 thru R12 = s  &  R13 thru R16 = a

Example:    Calculate  q = F( 0.1 + 0.2 i + 0.3 j + 0.4 k , 3 + 4 i + 5 j + 6 k , 4 + 3 i + 2 j + k )

     3  STO 09       4  STO 13
     4  STO 10       3  STO 14
     5  STO 11       2  STO 15
     6  STO 12       1  STO 16

    0.4   ENTER^
    0.3   ENTER^
    0.2   ENTER^
    0.1   XEQ "QLER"   >>>>     -0.306202194 = R26                               ---Execution time = 3m42s---
                                    RDN        1.087605292 = R27
                                    RDN        0.829024250 = R28
                                    RDN        1.330181628 = R29

-So,   q = -0.306202194 + 1.087605292 i + 0.829024250 j + 1.330181628 k

Notes:

-A different definition for  q^q'  would give a different result, at least in the imaginary part.
-I've used an M-Code routine for Q*Q, so you could find small differences in the last decimals.
-Several bytes may be saved if you employ the M-Code routines listed in "M-Code routines for hypercomplex numbers"
-For instance, lines 111 to 142 may be simply replaced by  DSQ  26
 

Reference:

[1]  http://mathworld.wolfram.com/LerchTranscendent.html