Anionic Special Functions(II) for the HP-41
Overview
1°) Spheroidal Wave Functions
2°) Jacobian Elliptic Functions
a) Sn( a |
m ) , Cn( a | m ) , Dn( a | m )
b) Sn( a
| m ) only
3°) Catalan Numbers
4°) Lambert W Function
5°) Weierstrass Elliptic Functions
a) Laurent Series
b) Duplication Formula
6°) Generalized Hypergeometric Functions
a) General Case
b) p+q < 4
c) 0F1 ( 2 versions )
d) 2F0
7°) Airy Functions
8°) Hermite Functions
9°) Chebyshev Functions
10°) Riemann Zeta Function
a) If Re(a) > 1
b) Borwein Algorithm
11°) Lommel Functions
1°) Spheroidal Wave Functions
-"SWFA" computes the angular spheroidal wave function of the
first
kind.
-Given m , n and c2
, the corresponding eigenvalue l
may be calculated by a program listed in "Spheroidal Harmonics for the
HP-41"
-We assume that | a | <= 1 and Smn(a) is computed by Smn(a) = ( 1 - a2 ) m/2 Sumk=0,1,.... dk ak
with (k+1)(k+2) dk+2
- [ k ( k + 2m + 1 ) - l
+ m ( m + 1 ) ] dk
- c2 dk-2 = 0
Flammer's Scheme: the coefficients are normalized as follows:
d0 = Pnm(0)
= 2m sqrt(PI) / [ Gam((1-m-n)/2)
Gam((2-m+n)/2 ]
d1 = P'nm(0)
= ( m + n ) 2m
sqrt(PI) / [ Gam((2-m-n)/2)
Gam((1-m+n)/2 ]
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "SWFA" )
• R01 ...... • Rnn = the n components of the anion
Rn+1 .......... R3n: temp R3n+1 = m , R3n+2 = n , R3n+3 = c2 , R3n+4 = l
>>> When the program stops: R01
...... Rnn = the n components of the result
Flag: F01
Subroutines: "ST*A" (
cf "Anionic Special Functions(I) "paragraph 0 )
"A*A1" ( cf "Anions for the HP-41" )
"1/G+" ( cf "Gamma Function for the HP-41"
)
-Lines 118 to 138 may be replaced by a single instruction:
DS*A ( an M-Code routine listed in "Anionic Special Functions" §0°)c)
01 LBL "SWFA"
02 R^ 03 STO M 04 X<> T 05 STO N 06 CLX 07 RCL 00 08 3 09 * 10 4 11 + 12 RDN 13 STO IND T 14 RDN 15 DSE Z 16 STO IND Z 17 CLX 18 RCL N 19 DSE Z 20 STO IND Z 21 RCL M 22 DSE T 23 STO IND T 24 + 25 CHS 26 2 27 ST+ Y 28 / 29 XEQ "1/G+" 30 STO O 31 1 32 RCL M 33 - 34 RCL N 35 ST+ M |
36 +
37 2 38 / 39 XEQ "1/G+" 40 RCL O 41 * 42 RCL M 43 * 44 STO N 45 RCL 00 46 .1 47 % 48 ISG X 49 + 50 E3 51 / 52 1 53 + 54 STO M 55 REGMOVE 56 XEQ "A*A1" 57 CLX 58 X<> M 59 REGSWAP 60 SIGN 61 STO O 62 RCL 00 63 3 64 * 65 .1 66 % 67 ISG X 68 + 69 RCL 00 70 - |
71 CLRGX
72 SF 01 73 RCL N 74 GTO 02 75 LBL 01 76 XEQ "A*A1" 77 RCL 00 78 3 79 * 80 1 81 + 82 RCL IND X 83 ENTER^ 84 ST+ X 85 1 86 + 87 RCL O 88 ST+ Y 89 * 90 3 91 ST+ T 92 CLX 93 RCL IND T 94 - 95 X<>Y 96 X^2 97 LASTX 98 + 99 + 100 RCL N 101 ST* Y 102 X<> M 103 DSE Z 104 RCL IND Z 105 * |
106 +
107 RCL O 108 1 109 + 110 RCL X 111 LASTX 112 + 113 STO O 114 * 115 / 116 LBL 02 117 STO N 118 RCL 00 119 3 120 * 121 STO P 122 RCL 00 123 ENTER^ 124 CLX 125 LBL 03 126 RCL IND Y 127 RCL N 128 * 129 RCL IND P 130 + 131 STO IND P 132 LASTX 133 - 134 ABS 135 + 136 DSE P 137 DSE Y 138 GTO 03 139 X#0? 140 GTO 01 |
141 CLA
142 RCL 00 143 3 144 * 145 2 146 + 147 RCL IND X 148 STO N 149 DSE Y 150 RCL IND Y 151 FC?C 01 152 GTO 00 153 ST+ N 154 - 155 2 156 ST+ Y 157 / 158 XEQ "1/G+" 159 X<> N 160 1 161 X<>Y 162 - 163 2 164 / 165 XEQ "1/G+" 166 RCL N 167 * 168 0 169 XEQ "ST*A" 170 SIGN 171 STO 01 172 X<>Y 173 GTO 02 174 LBL 00 175 STO M |
176 RCL 00
177 ST+ X 178 E3 179 / 180 ISG X 181 E3 182 / 183 1 184 + 185 RCL 00 186 + 187 REGMOVE 188 SIGN 189 CHS 190 XEQ "ST*A" 191 ST- 01 192 RCL M 193 2 194 / 195 XEQ "A^X" 196 XEQ "A*A1" 197 2 198 RCL M 199 Y^X 200 PI 201 SQRT 202 * 203 XEQ "ST*A" 204 X<>Y 205 CLA 206 END |
( 347 bytes
/ SIZE 3n+5 )
STACK | INPUTS | OUTPUTS |
T | m | / |
Z | n | / |
Y | c2 | / |
X | l | 1.nnn |
where 1.nnn is the control number of the result.
Example: m = 0.2 , n = 0.6 , c2 = 1.7 , l = 2.246866651 a = 0.1 + 0.2 i + 0.3 j + 0.4 k ( Quaternion -> 4 STO 00 )
0.1 STO 01
0.2 STO 02
0.3 STO 03
0.4 STO 04
0.2 ENTER^
0.6 ENTER^
1.7 ENTER^
2.246866651 XEQ "SWFA" >>>>
1.004
---Execution time = 86s---
( with DS*A )
R01 = 0.391049684
R02 = 0.161100168
R03 = 0.241650252
R04 = 0.322200335
-Whence S( 0.1 + 0.2 i + 0.3
j + 0.4 k ) = 0.391049684 + 0.161100168 i + 0.241650252 j + 0.322200335
k
2°) Jacobian Elliptic Functions
a) Sn( a | m ) , Cn( a | m
) , Dn( a | m )
"JEFA" employs Gauss' transformation to calculate sn ( a | m ) , cn ( a | m ) & dn ( a | m )
-If m < 1 , we have:
-With m' = 1-m , let be µ = [ ( 1-sqrt(m') / ( 1+sqrt(m') ]2 and v = a / ( 1+sqrt(µ) ] , then:
sn ( a | m ) = [ ( 1 + sqrt(µ) ) sn ( v | µ
) ] / [ 1 + sqrt(µ) sn2 ( v | µ ) ]
cn ( a | m ) = [ cn ( v | µ ) dn ( v | µ )
] / [ 1 + sqrt(µ) sn2 ( v | µ ) ]
dn ( a | m ) = [ 1 - sqrt(µ) sn2 ( v
| µ ) ] / [ 1 + sqrt(µ) sn2 ( v | µ ) ]
-These formulas are applied recursively until µ is small enough to use
sn ( v | 0 ) = Sin v
cn ( v | 0 ) = Cos v
dn ( v | 0 ) = 1
-If m > 1, the program uses the relations:
sn ( a | m ) = sn ( a m1/2
| 1/m ) / m1/2
cn ( a | m ) = dn ( a m1/2
| 1/m )
dn ( a | m ) = cn ( a m1/2
| 1/m )
-If m = 1: sn ( a | m ) = tanh a ; cn
( a | m ) = dn ( a | m ) = sech a
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "JEFA" )
• R01 ...... • Rnn = the n components of the anion
Rn+1 .......... R4n: temp R4n+1 = m , R4n+2 ..... temp
>>> When the program stops: R01
...... Rnn = the n components of sn ( a | m )
Rn+1 ...... R2n = -------------------- cn ( a | m )
R2n+1 .... R3n = -------------------- dn ( a | m )
Flags: F01-F10
Subroutines: "ST*A" "ST/A"
( cf "Anionic Special Functions(I) "paragraph 0 )
"A*A1" "1/A" "CHA" "THA" "SINA" "COSA"
( cf "Anions for the HP-41" )
-Lines 35 & 189 are three-byte GTOs
01 LBL "JEFA"
02 RCL 00 03 4 04 * 05 1 06 + 07 X<>Y 08 STO IND Y 09 RCL 00 10 .1 11 % 12 ISG X 13 + 14 E3 15 / 16 1 17 + 18 STO N 19 REGMOVE 20 CF 10 21 SIGN 22 X>Y? 23 GTO 01 24 X#Y? 25 GTO 00 26 XEQ "CHA" 27 XEQ "1/A" 28 FRC 29 RCL N 30 + 31 REGMOVE 32 LASTX 33 REGSWAP 34 XEQ "THA" 35 GTO 04 36 LBL 00 37 X<>Y 38 SQRT |
39 XEQ "ST*A"
40 LASTX 41 1/X 42 ENTER^ 43 SF 10 44 LBL 01 45 X<>Y 46 STO M 47 RCL 00 48 4 49 * 50 1 51 + 52 .1 53 % 54 + 55 STO O 56 SIGN 57 X<> M 58 LBL 02 59 ENTER^ 60 CHS 61 1 62 + 63 SQRT 64 1 65 ST+ O 66 + 67 RCL X 68 2 69 / 70 ST* M 71 RDN 72 X^2 73 / 74 STO IND O 75 X^2 76 X#0? |
77 GTO 02
78 RCL 00 79 4 80 * 81 .1 82 % 83 ISG X 84 + 85 RCL 00 86 - 87 CLRGX 88 SIGN 89 STO IND L 90 RCL M 91 XEQ "ST*A" 92 RCL N 93 REGMOVE 94 XEQ "SINA" 95 RCL N 96 REGSWAP 97 XEQ "COSA" 98 RCL N 99 RCL 00 100 E3 101 / 102 STO M 103 + 104 REGMOVE 105 LBL 03 106 RCL 00 107 3 108 * 109 RCL M 110 - 111 RCL N 112 + 113 REGMOVE 114 LASTX |
115 RCL 00
116 ST+ X 117 + 118 REGSWAP 119 XEQ "A*A1" 120 FRC 121 RCL N 122 + 123 REGSWAP 124 LASTX 125 REGMOVE 126 XEQ "A*A1" 127 RCL IND O 128 XEQ "ST*A" 129 RCL 00 130 ST+ X 131 RCL N 132 + 133 REGSWAP 134 LASTX 135 RCL M 136 ST+ X 137 + 138 REGMOVE 139 SIGN 140 ST+ 01 141 XEQ "1/A" 142 XEQ "A*A1" 143 FRC 144 RCL N 145 + 146 REGSWAP 147 SIGN 148 RCL IND O 149 + 150 XEQ "ST*A" 151 RCL N 152 REGMOVE |
153 RCL M
154 - 155 RCL 00 156 3 157 * 158 + 159 REGMOVE 160 SIGN 161 ST+ 01 162 XEQ "1/A" 163 XEQ "A*A1" 164 FRC 165 ST+ X 166 RCL N 167 + 168 REGSWAP 169 LASTX 170 REGMOVE 171 SIGN 172 CHS 173 XEQ "ST*A" 174 ST- 01 175 RCL N 176 REGSWAP 177 SIGN 178 ST+ 01 179 XEQ "1/A" 180 XEQ "A*A1" 181 FRC 182 ST+ X 183 RCL N 184 + 185 REGSWAP 186 LASTX 187 REGMOVE 188 DSE O 189 GTO 03 190 RCL M |
191 3
192 * 193 ISG X 194 E3 195 / 196 1 197 + 198 RCL 00 199 + 200 REGMOVE 201 FC?C 10 202 GTO 04 203 RCL 00 204 4 205 * 206 1 207 + 208 RCL IND X 209 SQRT 210 XEQ "ST/A" 211 RCL N 212 RCL 00 213 ST+ X 214 + 215 REGSWAP 216 LBL 04 217 CF 01 218 RCL 00 219 E3 220 / 221 ISG X 222 CLA 223 END |
( 410 bytes / SIZE 4n+10
)
STACK | INPUTS | OUTPUTS |
X | m | 1.nnn |
where 1.nnn is the control number of sn ( a | m )
Example1: m = 1/PI q = 1 + 2 i + 3 j + 4 k ( Quaternion -> 4 STO 00 )
1 STO 01
2 STO 02
3 STO 03
4 STO 04
PI 1/X XEQ "JEFA" >>>> 1.004 ---Execution time = 70s---
R01 = 1.498262248
R02 = 0.205407205
R03 = 0.308110807
R04 = 0.410814410
sn ( 1 + 2 i + 3 j + 4 k | 1/PI ) = 1.498262248 + 0.205407205 i + 0.308110807 j + 0.410814410 k and
cn ( 1 + 2 i + 3 j + 4 k | 1/PI ) = -0.694940081 + 0.442849491 i + 0.664274236 j + 0.885698980 k in R05 to 508
dn ( 1 + 2 i + 3 j + 4 k | 1/PI ) = -0.719248901
+ 0.136199160 i + 0.204298741 j + 0.272398321 k
in R09 to R12
Example2: m = PI a = 1 + 2 i + 3 j + 4 k ( Quaternion -> 4 STO 00 )
1 STO 01
2 STO 02
3 STO 03
4 STO 04
PI XEQ "JEFA" >>>> 1.004 ---Execution time = 72s---
R01 = 0.860242322
R02 = -0.005873618
R03 = -0.008810427
R04 = -0.011747237
sn ( 1 + 2 i + 3 j + 4 k | PI ) = 0.860242322 - 0.005873618 i - 0.008810427 j - 0.011747237 k and
cn ( 1 + 2 i + 3 j + 4 k | PI ) = 0.510825404 + 0.009891315 i + 0.014836973 j + 0.019782630 k in R05 to 508
dn ( 1 + 2 i + 3 j + 4 k | PI ) = -0.037125130
- 0.427571169 i - 0.645356753 j - 0.855142337 k
in R09 to R12
Example3: m = -PI q = 1 + 2 i + 3 j + 4 k ( Quaternion -> 4 STO 00 )
1 STO 01
2 STO 02
3 STO 03
4 STO 04
PI CHS XEQ "JEFA" >>>> 1.004 ---Execution time = 81s---
R01 = -1.473447237
R02 = -0.079007894
R03 = -0.118511841
R04 = -0.158015787
sn ( 1 + 2 i + 3 j + 4 k | -PI ) = -1.473447237 - 0.079007894 i - 0.118511841 j - 0.158015787 k and
cn ( 1 + 2 i + 3 j + 4 k | -PI ) = 0.285290836 - 0.408053637 i - 0.612080455 j - 0.816107274 k in R05 to 508
dn ( 1 + 2 i + 3 j + 4 k | -PI ) = -2.793322221 - 0.130928415 i - 0.196392622 j - 0.261856829 k in R09 to R12
Notes:
-The subroutine "1/A" is called 3 times instead of once inside the loop
LBL 03 ( lines 105 thru 189 )
-This avoids a SIZE = 5n+10 but it also increases the execution time...
b) Sn( a | m ) only
-If you just want to compute sn ( a | m ), the routine may of course
be simplified:
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "SNA" )
• R01 ...... • Rnn = the n components of the anion
Rn+1 .......... R2n: temp R2n+1 = m , R2n+2 ..... temp
>>> When the program stops: R01
...... Rnn = the n components of sn ( a | m )
Flags: F01-F10
Subroutines: "ST*A" "ST/A"
( cf "Anionic Special Functions(I) "paragraph 0 )
"A*A1" "1/A" "THA" "SINA" ( cf "Anions
for the HP-41" )
-Line 26 is three-byte GTO 04
01 LBL "SNA"
02 RCL 00 03 ST+ X 04 1 05 + 06 X<>Y 07 STO IND Y 08 RCL 00 09 .1 10 % 11 ISG X 12 + 13 E3 14 / 15 1 16 + 17 STO N 18 REGMOVE 19 CF 10 20 SIGN 21 X>Y? |
22 GTO 01
23 X#Y? 24 GTO 00 25 XEQ "THA" 26 GTO 04 27 LBL 00 28 X<>Y 29 SQRT 30 XEQ "ST*A" 31 LASTX 32 1/X 33 ENTER^ 34 SF 10 35 LBL 01 36 X<>Y 37 STO M 38 RCL 00 39 ST+ X 40 1 41 + 42 .1 |
43 %
44 + 45 STO O 46 SIGN 47 X<> M 48 LBL 02 49 ENTER^ 50 CHS 51 1 52 + 53 SQRT 54 1 55 ST+ O 56 + 57 RCL X 58 2 59 / 60 ST* M 61 RDN 62 X^2 63 / |
64 STO IND O
65 X^2 66 X#0? 67 GTO 02 68 RCL M 69 XEQ "ST*A" 70 XEQ "SINA" 71 LBL 03 72 RCL N 73 REGMOVE 74 XEQ "A*A1" 75 RCL IND O 76 XEQ "ST*A" 77 1 78 ST+ 01 79 XEQ "1/A" 80 XEQ "A*A1" 81 SIGN 82 RCL IND O 83 + 84 XEQ "ST*A" |
85 DSE O
86 GTO 03 87 FC?C 10 88 GTO 04 89 RCL 00 90 ST+ X 91 1 92 + 93 RCL IND X 94 SQRT 95 XEQ "ST/A" 96 LBL 04 97 CF 01 98 RCL 00 99 E3 100 / 101 ISG X 102 CLA 103 END |
( 197 bytes / SIZE 2n+10
)
STACK | INPUTS | OUTPUTS |
X | m | 1.nnn |
where 1.nnn is the control number of sn ( a | m )
Example: m = 1/PI a = 1 + 2 i + 3 j + 4 k ( Quaternion -> 4 STO 00 )
1 STO 01
2 STO 02
3 STO 03
4 STO 04
PI 1/X XEQ "JEFA" >>>> 1.004 ---Execution time = 26s---
R01 = 1.498262249
R02 = 0.205407205
R03 = 0.308110807
R04 = 0.410814409
sn ( 1 + 2 i + 3 j + 4 k | 1/PI ) = 1.498262249 + 0.205407205 i + 0.308110807 j + 0.410814409 k
-Similar results with m = PI & m = -PI
Notes:
-"SNA" runs of course faster than "JEFA"
-Moreover, since SIZE 2n+10 is sufficient, the argument may be a 128-on
!
3°) Catalan Numbers
-The Catalan numbers may be defined by C(n) = 4n Gam(n+1/2)
/ [ sqrt(PI) Gam(n+2) ]
-This formula is used hereunder after replacing n by the anion a
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "CATA" )
• R01 ...... • Rnn = the n components of the anion
Rn+1 .......... R6n: temp
>>> When the program stops: R01
...... Rnn = the n components of the result
Flag: F04
Subroutines: "ST*A" "GAMA"
( cf "Anionic Special Functions(I)" )
"A*A1" "X^A" "1/A" ( cf "Anions for the HP-41"
)
01 LBL "CATA"
02 RCL 00 03 E3 04 / 05 ISG X 06 RCL 00 07 4 08 * 09 + 10 E3 11 / 12 1 13 + 14 STO M |
15 REGMOVE
16 4 17 XEQ "X^A" 18 FRC 19 RCL M 20 + 21 REGMOVE 22 LASTX 23 REGSWAP 24 REGMOVE 25 .5 26 ST+ 01 27 XEQ "GAMA" 28 RCL 00 |
29 .1
30 % 31 ISG X 32 + 33 E3 34 / 35 1 36 + 37 RCL 00 38 5 39 * 40 + 41 STO M 42 REGMOVE |
43 XEQ "A*A1"
44 FRC 45 RCL 00 46 + 47 RCL M 48 X<>Y 49 - 50 REGSWAP 51 2 52 ST+ 01 53 XEQ "GAMA" 54 PI 55 SQRT 56 XEQ "ST*A" |
57 XEQ "1/A"
58 RCL 00 59 + 60 E3 61 / 62 1 63 + 64 RCL 00 65 4 66 * 67 + 68 REGMOVE 69 XEQ "A*A1" 70 END |
( 133 bytes / SIZE 6n+1 )
STACK | INPUTS | OUTPUTS |
X | m | 1.nnn |
where 1.nnn is the control number of the result
Example: a = 1 + i/2 + j/3 + k/4 ( Quaternion -> 4 STO 00 )
1 STO 01
2 STO 02
3 STO 03
4 STO 04 XEQ "CATA"
>>>> 1.004
---Execution time = 54s---
R01 = 0.844036224
R02 = 0.239299403
R03 = 0.159532935
R04 = 0.119649702
-Thus, C ( 1 + i/2 + j/3 + k/4 ) = 0.844036224 + 0.239299403 i + 0.159532935 j + 0.119649702 k
Note:
-Since SIZE = 6n+1 , the argument cannot be a 64-on.
4°) Lambert W Function
-We have to solve x = w(x) exp [ w(x) ]
-"LBWA" employs Newton's method.
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "LBWA" )
• R01 ...... • Rnn = the n components of the anion
Rn+1 .......... R4n: temp
>>> When the program stops: R01
...... Rnn = the n components of the result
Flags: /
Subroutines: "ST*A" "DSA"
( cf "Anionic Special Functions(I)" )
"A*A1" "1/A" "LNA" "E^A" ( cf "Anions
for the HP-41" )
01 LBL "LBWA"
02 RCL 00 03 E3 04 / 05 ISG X 06 E3 07 / 08 RCL 00 09 3 10 * 11 + 12 1 13 + 14 STO M |
15 REGSWAP
16 REGMOVE 17 SIGN 18 ST+ 01 19 XEQ "LNA" 20 RCL M 21 RCL 00 22 - 23 STO N 24 REGSWAP 25 LBL 01 26 RCL N 27 REGMOVE 28 VIEW 01 |
29 SIGN
30 CHS 31 XEQ "ST*A" 32 XEQ "E^A" 33 FRC 34 RCL M 35 + 36 REGMOVE 37 XEQ "A*A1" 38 3 39 RCL 00 40 ST* Y 41 LBL 02 42 RCL IND Y |
43 ST- IND Y
44 RDN 45 DSE Y 46 DSE X 47 GTO 02 48 RCL N 49 RCL 00 50 - 51 REGSWAP 52 RCL N 53 REGMOVE 54 SIGN 55 ST+ 01 56 XEQ "1/A" |
57 XEQ "A*A1"
58 XEQ "DSA" 59 E-8 60 X<Y? 61 GTO 01 62 RCL N 63 REGMOVE 64 RCL 00 65 E3 66 / 67 ISG X 68 CLA 69 CLD 70 END |
( 143 bytes / SIZE
4n+1 )
STACK | INPUTS | OUTPUTS |
X | / | 1.nnn |
where 1.nnn is the control number of the result
Example: a = 1 + 2 i + 3 j + 4 k ( Quaternion -> 4 STO 00 )
1 STO 01
2 STO 02
3 STO 03
4 STO 04 XEQ "LBWA" >>>>
1.004
---Execution time = 52s---
R01 = 1.281459811
R02 = 0.304051227
R03 = 0.456076840
R04 = 0.608102453
Whence, W(1 + 2 i + 3 j + 4 k) = 1.281459811 + 0.304051227 i + 0.456076840 j + 0.608102453 k
Note:
-This routine doesn't work if a = -1 but W(-1) =
-0.318131505 + 1.337235701 i
5°) Weierstrass Elliptic Functions
a) Laurent Series
-The Weierstrass Elliptic Function P(a;g2,g3) may be calculated by a Laurent series:
P(a;g2;g3) = a -2 + c2.a2 + c3.a4 + ...... + ck.a2k-2 + ....
where c2 = g2/20 ; c3 = g3/28 and ck = 3 ( c2. ck-2 + c3. ck-3 + ....... + ck-2. c2 ) / (( 2k+1 )( k-3 )) ( k > 3 )
-The successive ck are computed and stored into
registers R3n+1 R3n+2 ......
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "WEFA" )
• R01 ...... • Rnn = the n components of the anion
Rn+1 .......... R4n: temp
>>> When the program stops: R01 ...... Rnn = the n components of the result
Flags: /
Subroutines: "A*A" "1/A"
( cf "Anions for the HP-41" )
-If you can use the M-Code routine DS*A listed in "Anionic Functions (I) paragrah 0°)b)
Replace lines 111 to 133 by DS*A
-Likewise, replace lines 41 to 65 by DS*A XEQ
"A*A1" RCL N 1 + RCL IND
X DS*A
01 LBL "WEFA"
02 RCL 00 03 3 04 * 05 2 06 + 07 X<>Y 08 28 09 / 10 STO IND Y 11 X<> Z 12 20 13 / 14 DSE Y 15 STO IND Y 16 X<>Y 17 STO N 18 RCL 00 19 .1 20 % 21 ISG X 22 + 23 E3 24 / 25 1 26 + |
27 STO O
28 REGMOVE 29 XEQ "A*A1" 30 RCL O 31 REGMOVE 32 XEQ "1/A" 33 FRC 34 RCL O 35 + 36 REGMOVE 37 LASTX 38 REGSWAP 39 REGMOVE 40 RCL IND N 41 STO M 42 XEQ 00 43 XEQ "A*A1" 44 RCL N 45 1 46 + 47 RCL IND X 48 STO M 49 XEQ 00 50 GTO 02 51 LBL 00 52 3 |
53 RCL 00
54 ST* Y 55 LBL 01 56 RCL IND X 57 RCL M 58 * 59 ST+ IND Z 60 RDN 61 DSE Y 62 DSE X 63 GTO 01 64 RTN 65 LBL 02 66 3 67 STO M 68 LBL 03 69 3 70 STO O 71 LBL 04 72 XEQ "A*A1" 73 SIGN 74 ST+ M 75 RCL 00 76 RCL 00 77 E3 78 / |
79 +
80 X<>Y 81 - 82 3 83 * 84 RCL M 85 + 86 STO P 87 RCL N 88 ENTER^ 89 CLX 90 LBL 05 91 RCL IND Y 92 RCL IND P 93 * 94 + 95 ISG Y 96 CLX 97 DSE P 98 GTO 05 99 RCL M 100 ST+ X 101 1 102 ST+ T 103 + 104 / |
105 RCL M
106 3 107 ST* Z 108 - 109 / 110 STO IND Y 111 STO P 112 RCL 00 113 PI 114 INT 115 * 116 STO Q 117 RCL 00 118 ENTER^ 119 CLX 120 LBL 06 121 RCL IND Y 122 RCL P 123 * 124 RCL IND Q 125 + 126 STO IND Q 127 LASTX 128 - 129 ABS 130 + |
131 DSE Q
132 DSE Y 133 GTO 06 134 X#0? 135 GTO 03 136 DSE O 137 GTO 04 138 RCL 00 139 E3 140 / 141 ISG X 142 STO Y 143 LASTX 144 / 145 1 146 + 147 RCL 00 148 ST+ X 149 + 150 REGMOVE 151 X<>Y 152 CLA 153 END |
( 251 bytes / SIZE 3n+3+??? )
STACK | INPUTS | OUTPUTS |
Y | g2 | / |
X | g3 | 1.nnn |
where 1.nnn is the control number of the result
Example: a = 0.2 + 0.3 i + 0.4 j + 0.5 k ; g2 = 0.9 , g3 = 1.4 ( Quaternion -> 4 STO 00 )
0.2 STO 01
0.3 STO 02
0.4 STO 03
0.5 STO 05
0.9 ENTER^
1.4 XEQ "WEFA" >>>>
1.004
---Execution time = 41s--- ( With "DS*A" )
R01 = -1.591637275
R02 = -0.411614082
R03 = -0.548818776
R04 = -0.686023470
P( 0.2 + 0.3 i + 0.4 j + 0.5
k ; 0.9 , 1.4 ) = -1.591637275 -
0.411614082 i - 0.548818776 j - 0.686023470 k
b) Duplication Formula
-The argument q may be "large" and the Laurent series doesn't converge.
-The duplication formula may be used one or several times in this case.
-"WF2A" takes P(a) in registers R01 .......... Rnn and returns
P(2a) in the same registers
P(2a) = -2 P(a) + ( 6 P2(a)
- g2/2 )2 / ( 4 ( 4 P3(a) - g2
P(a) - g3 ) )
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "WF2A" )
• R01 ...... • Rnn = the n components of P(a)
Rn+1 .......... R3n: temp
>>> When the program stops: R01
...... Rnn = the n components of P(2a)
Flags: /
Subroutines: "ST*A"
( cf "Anionic Special Functions(I)" )
"A*A1" "1/A" ( cf "Anions for the HP-41"
)
01 LBL "WF2A"
02 STO N 03 X<>Y 04 STO M 05 RCL 00 06 .1 07 % 08 STO Z 09 ISG X 10 + 11 E3 12 / 13 1 14 + 15 STO O 16 REGMOVE 17 + |
18 REGMOVE
19 XEQ "A*A1" 20 6 21 XEQ "ST*A" 22 RCL M 23 2 24 / 25 ST- 01 26 RCL O 27 REGMOVE 28 XEQ "A*A1" 29 FRC 30 RCL O 31 + 32 REGSWAP 33 LASTX 34 REGMOVE |
35 XEQ "A*A1"
36 XEQ "A*A1" 37 RCL 00 38 ENTER^ 39 ST+ Y 40 LBL 01 41 RCL IND Y 42 RCL M 43 * 44 RCL IND Y 45 ST+ X 46 ST+ X 47 X<>Y 48 - 49 STO IND Y 50 RDN 51 DSE Y |
52 DSE X
53 GTO 01 54 RCL N 55 ST- 01 56 4 57 XEQ "ST*A" 58 XEQ "1/A" 59 FRC 60 RCL O 61 + 62 RCL 00 63 + 64 REGSWAP 65 XEQ "A*A1" 66 3 67 RCL 00 68 ST* Y |
69 LBL 02
70 RCL IND Y 71 ST+ X 72 ST- IND Y 73 RDN 74 DSE Y 75 DSE X 76 GTO 02 77 RCL M 78 RCL N 79 RCL 00 80 E3 81 / 82 ISG X 83 CLA 84 END |
( 173 bytes / SIZE 3n+1 )
STACK | INPUTS | OUTPUTS |
Y | g2 | / |
X | g3 | 1.nnn |
where 1.nnn is the control number of the result
Example: We have found P( 0.2 + 0.3 i + 0.4 j + 0.5 k ; 0.9 , 1.4 ) = -1.591637275 - 0.411614082 i - 0.548818776 j - 0.686023470 k
-If the result is still in registers R01 thru Rnn
0.9 ENTER^
1.4 XEQ "WF2A" >>>>
1.004
---Execution time = 9s---
R01 = -0.370892103
R02 = -0.169841922
R03 = -0.226455893
R04 = -0.283069868
-So, P( 0.4 + 0.6 i + 0.8 j
+ k ; 0.9 , 1.4 ) = -0.370892103
- 0.169841922 i - 0.226455893 j - 0.283069868 k
Note:
-In fact, the Laurent series still converges for 2a and a direct evaluation of P(2a) with "WEFA" yields ( in 2m01s )
P( 0.4 + 0.6 i + 0.8 j + k
; 0.9 , 1.4 ) = -0.370892103 - 0.169841920
i - 0.226455894 j - 0.283069867 k
6°) Generalized Hypergeometric Functions
a) General Case
-This program computes pFq( b1,b2,....,bp ; c1,c2,....,cq ; a ) = SUMk=0,1,2,..... [(b1)k(b2)k.....(bp)k] / [(c1)k(c2)k.....(cq)k] . ak/k! if X > 0
where (bi)k = bi(bi+1)(bi+2) ...... (bi+k-1) & (bi)0 = 1 , likewise for (cj)k ( Pochhammer's symbol )
or the regularized function F tilde:
pF~q( b1,b2,....,bp ; c1,c2,....,cq ; a ) = SUMk=0,1,2,..... [ (b1)k(b2)k.....(bp)k ] / [Gam(k+c1) Gam(k+c2).....Gam(k+cq)] . ak/k! if X < 0
where Gam = Euler's Gamma function.
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn & R3n+1 ...... are to be initialized before executing "HGFA+" )
• R01 ...... • Rnn = the n components of the anion a
Rn+1 .......... R3n: temp • R3n+1 = b1 ...... • R3n+p = bp • R3n+p+1 = c1 ........... • R3n+p+q = cq
>>> When the program stops: R01
...... Rnn = the n components of f(a)
Flags: /
Subroutines: "ST*A" "DSA"
( cf "Anionic Special Functions(I)" )
"A*A1" "A^X"
( cf "Anions for the HP-41" )
"1/G" M-Code routine ( cf "Gamma
Function for the HP-41" paragraph 1-f) )
01 LBL "HGFA+"
02 CLA 03 STO M 04 RCL 00 05 PI 06 INT 07 10^X 08 / 09 ISG X 10 RCL X 11 RCL 00 12 + 13 PI 14 INT 15 10^X 16 / 17 ENTER^ 18 SIGN 19 + 20 REGMOVE 21 RDN 22 CLRGX 23 SIGN 24 STO 01 25 X<>Y 26 ABS 27 INT 28 RCL X 29 PI 30 INT 31 10^X 32 / 33 STO O 34 CLX 35 RCL M 36 FRC 37 PI 38 INT 39 10^X 40 * 41 ABS |
42 +
43 RCL X 44 PI 45 INT 46 10^X 47 / 48 RCL 00 49 ENTER^ 50 SIGN 51 CHS 52 10^X 53 % 54 + 55 PI 56 INT 57 * 58 ST+ O 59 + 60 STO N 61 CLX 62 RCL O 63 + 64 RCL M 65 X>0? 66 GTO 05 67 CLX 68 SIGN 69 ENTER^ 70 LBL 01 71 RCL IND Z 72 FRC 73 X#0? 74 GTO 01 75 X<> L 76 X>0? 77 GTO 01 78 X<Y? 79 X<>Y 80 GTO 00 81 LBL 01 82 CLX |
83 RCL IND T
84 1/G 85 ST* Z 86 LBL 00 87 RDN 88 DSE Z 89 GTO 01 90 X>0? 91 GTO 00 92 1 93 X<>Y 94 - 95 STO P 96 LBL 02 97 ST/ Y 98 ENTER^ 99 SIGN 100 - 101 X<>Y 102 ISG N 103 LBL 03 104 RCL Y 105 RCL IND N 106 + 107 ISG O 108 GTO 04 109 STO L 110 X>0? 111 GTO 03 112 FRC 113 X#0? 114 GTO 03 115 CLX 116 SIGN 117 SIGN 118 LBL 03 119 X<> L 120 1/X 121 LBL 04 122 * 123 ISG N |
124 GTO 03
125 RCL 00 126 PI 127 INT 128 * 129 RCL N 130 FRC 131 X<>Y 132 + 133 STO N 134 X<> O 135 LASTX 136 X<>Y 137 FRC 138 + 139 STO O 140 X<> Z 141 X#0? 142 GTO 02 143 LBL 00 144 X<>Y 145 RCL 00 146 ST+ X 147 ENTER^ 148 SIGN 149 + 150 X<>Y 151 STO IND Y 152 RCL 00 153 PI 154 INT 155 10^X 156 / 157 ISG X 158 LASTX 159 / 160 ENTER^ 161 SIGN 162 + 163 RCL 00 164 + |
165 REGMOVE
166 RCL P 167 XEQ "A^X" 168 RCL 00 169 ST+ X 170 ENTER^ 171 SIGN 172 + 173 RCL IND X 174 XEQ "ST*A" 175 LBL 05 176 RCL 00 177 PI 178 INT 179 10^X 180 / 181 ISG X 182 RCL 00 183 ST+ X 184 + 185 PI 186 INT 187 10^X 188 / 189 ENTER^ 190 SIGN 191 + 192 REGMOVE 193 LBL 06 194 XEQ "A*A1" 195 SIGN 196 ST+ N 197 LBL 07 198 RCL IND N 199 RCL P 200 + 201 ISG O 202 FS? 30 203 1/X 204 * 205 ISG N |
206 GTO 07
207 RCL N 208 FRC 209 RCL 00 210 PI 211 INT 212 * 213 + 214 STO N 215 X<> O 216 LASTX 217 X<>Y 218 FRC 219 + 220 STO O 221 SIGN 222 RCL P 223 + 224 STO P 225 / 226 XEQ "ST*A" 227 XEQ "DSA" 228 X#0? 229 GTO 06 230 RCL M 231 RCL 00 232 E3 233 / 234 ISG X 235 RCL X 236 LASTX 237 / 238 1 239 + 240 RCL 00 241 ST+ X 242 + 243 REGMOVE 244 RDN 245 CLA 246 END |
( 354 bytes / SIZE 3n+1+p+q )
STACK | INPUTS | OUTPUTS |
Y | / | +/- p.qqq |
X | +/- p.qqq | 1.nnn |
where 1.nnn is the control number of the result.
+ p.qqq for the hypergeometric
function
- p.qqq for the regularized hypergeometric
function
Example1: b1 = PI , b2 = e ; c1 = 1 , c2 = 2 , c3 = 4 ; a = 1 + 2 i + 3 j + 4 k ( Quaternion -> 4 STO 00 )
-Since n = 4 , the parameters must be stored into R13 R14 R15 ................
PI STO 13 1 E^X STO 14 , 1 STO 15 2 STO 16 4 STO 17
• 1 STO 01 2 STO 02 3 STO 03 4 STO 04
2.003 XEQ "HGFA+" >>>> 1.004 ---Execution Time= 45s---
R01 = -6.691126901
R02 = 1.302530584
R03 = 1.953795876
R04 = 2.605061166
2F3( PI , e ; 1 , 2 , 4 ; 1 + 2 i + 3 j + 4 k ) = -6.691126901 + 1.302530584 i + 1.953795876 j + 2.605061166 k
• 1 STO 01 2 STO 02 3 STO 03 4 STO 04
2.003 CHS XEQ "HGFA+" >>>> 1.004 ---Execution Time= 53s---
R01 = -1.115187818
R02 = 0.217088431
R03 = 0.325632646
R04 = 0.434176861
2F~3( PI , e ; 1 , 2 , 4 ; 1 + 2 i + 3 j + 4 k ) = -1.115187818 + 0.217088431 i + 0.325632646 j + 0.434176861 k
-The first result has been simply divided by Gam(1) Gam(2) Gam(4)
= 6
Example2: b1 = PI , b2 = e ; c1 = 1 , c2 = -2 , c3 = -4 ; a = 1 + 2 i + 3 j + 4 k
PI STO 13 1 E^X STO 14 , 1 STO 15 -2 STO 16 -4 STO 17
( the non-regularized hypergeometric function does not exist for these parameters )
• 1 STO 01 2 STO 02 3 STO 03 4 STO 04
2.003 CHS XEQ "HGFA+" >>>> 1.004 ---Execution Time= 67s---
R01 = -2910223.711
R02 = 192140.2259
R03 = 288210.3384
R04 = 384280.4514
2F~3(
PI , e ; 1 , -2 , -4 ; 1 + 2 i + 3 j + 4 k ) = -2910223.711
+ 192140.2259 i + 288210.3384 j + 384280.4514 k
b) p + q < 4
-If p+q < 4 , the parameters bi & cj may
be entered in the stack without using registers R3n+1 ... and so on ...
-However, it requires several M-Code routines + the 2 following ones:
RCLIX and @HG
RCLIX takes an integer m in X-register and replaces it by the content of
M-register if m = 1
N-register if m = 2
O-register if m = 3
@HG corresponds to the loop LBL 06 in the previous listing.
-It takes q in register Y and p+q in register X and also the required data in registers R00 thru R3n.
-But first RCLIX:
098 "X"
009 "I"
00C "L"
003 "C"
012 "R"
0F8 C=X
38D C->
008 S&X
106 A=C S&X
130 LDI S&X
004 004
146 A=A+C S&X
130 LDI S&X
009 009
306 ?A<C S&X
0B5 ?NCGO
0A2 ERROR
0A6 A<>C S&X
270 RAMSLCT
038 READATA
0E8 X=C
3E0 RTN
Note:
"RCLIX" gives a DATA ERROR message if X > 4
-Then @HG
087 "G"
008 "H"
000 "@"
0B8 C=Y
38D C->
008 S&X
070 N=C ALL
0F8 C=X
38D C->
008 S&X
106 A=C S&X
0B0 C=N ALL
1BC RCR 11
0A6 A<>C S&X
10E A=C ALL
130 LDI S&X
004 004
306 ?A<C S&X
0B5 ?NCGO
gives a DATA ERROR message if p+q > 3
0A2 ERROR
0E6 B<>C S&X
0C6 C=B S&X
1BC RCR 11
0C6 C=B S&X
20E C=A+C ALL
1BC RCR 11
0C6 C=B S&X
226 C=C+1 S&X
03C RCR 3
268 Q=C = addresses q , p+q , 005
3C8 CLRKEY
119 ?NCXQ
LOOP1
384 E146
E146 = the address of the 1st executable word of "A*A1" in my ROM -> Change
these 2 words according to your own ROM
04E C
35C =
I've modified the M-Code routine A*A1 so that it does not use synthetic
register Q
050 1
0E8 X=C
278 C=Q
070 N=C ALL
0B0 C=N ALL
LOOP2
03C RCR 3
106 A=C S&X
0B0 C=N ALL
244 CLRF 9
306 ?A<C S&X
013 JNC+02
248 SETF 9
270 RAMSLCT
038 READATA
10E A=C ALL
238 C=P
01D C=
060 A+C
24C ?FSET 9
239 ?NCXQ
060 1/AB
0F8 C=X
13D C=
060 AB*C
0E8 X=C
0B0 C=N ALL
266 C=C-1 S&X
070 N=C ALL
106 A=C S&X
1BC RCR 11
306 ?A<C S&X
32B JNC -27d
GOTO LOOP2
238 C=P
02E C
0FA ->
0AE AB
001 C=
060 AB+1
228 P=C
10E A=C ALL
0F8 C=X
0AE A<>C ALL
261 C=
060 A/C
0E8 X=C
3D5 ?NCXQ
388 E2F5 = the 1st executable
word of "ST*A" in my ROM. -> Change these 2 words
according to your own ROM
046 C=0 S&X
270 RAMSLCT
2F1 ?NCXQ
384 E1BC = the 1st executable word
of "DSA" in my ROM. -> Change these 2 words according
to your own ROM
0F8 C=X
3CC ?KEY
360 ?C RTN
Press a key to stop an infinite loop or if the routine is too slow.
2EE ?C#0 ALL
227 JC-60d
GOTO LOOP1
3C1
002 ( END )
( 93 words )
-Only use @HG with the program below !
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "HGFB" )
• R01 ...... • Rnn = the n components of the anion a which are saved in Rn+1 .... R2n
Rn+1 .......... R3n: temp
>>> When the program stops: R01
...... Rnn = the n components of f(a)
Flags: /
Subroutines: "ST*A"
( cf "Anionic Special Functions(I)" )
"A^X"
( cf "Anions for the HP-41" )
"1/G"
( cf "Gamma Function for the HP-41" paragraph 1-f) )
"ST<>A" "X+1" "X-1" "X*E3" "X/E3" ( cf
"A few M-Code routines for the HP-41" )
and RCLIX & @HG which are listed above
-Line 39 is a three-byte GTO 04
01 LBL "HGFB"
02 CLA 03 RDN 04 ST<>A 05 R^ 06 RCL 00 07 X/E3 08 ISG X 09 RCL X 10 RCL 00 11 + 12 X/E3 13 X+1 14 REGMOVE 15 RDN 16 CLRGX 17 SIGN 18 STO 01 19 X<>Y 20 CF 00 21 X<0? 22 SF 00 23 ABS 24 FRC 25 STO Y 26 LASTX 27 INT 28 X/E3 29 + 30 RCL 00 31 X+1 |
32 ST+ X
33 RDN 34 STO IND T 35 DSE T 36 X<>Y 37 STO IND T 38 FC?C 00 39 GTO 04 40 X*E3 41 PI 42 SIGN 43 ENTER^ 44 LBL 01 45 RCL Z 46 RCLIX 47 FRC 48 X#0? 49 GTO 01 50 CLX 51 LASTX 52 X>0? 53 GTO 01 54 X<Y? 55 X<>Y 56 GTO 00 57 LBL 01 58 X<> L 59 1/G 60 ST* Z 61 LBL 00 62 RDN |
63 DSE Z
64 GTO 01 65 X>0? 66 GTO 00 67 CHS 68 X+1 69 STO P 70 RCL 00 71 X+1 72 ST+ X 73 STO Q 74 RDN 75 LBL 02 76 ST/ Y 77 X-1 78 X<>Y 79 ISG IND Q 80 LBL 03 81 RCL Y 82 RCL IND Q 83 RCLIX 84 + 85 DSE Q 86 ISG IND Q 87 GTO 02 88 * 89 GTO 03 90 LBL 02 91 STO L 92 X>0? 93 GTO 02 |
94 FRC
95 X#0? 96 GTO 02 97 CLX 98 SIGN 99 SIGN 100 LBL 02 101 X<> L 102 / 103 LBL 03 104 ISG Q 105 CLX 106 ISG IND Q 107 GTO 03 108 RCL IND Q 109 FRC 110 STO IND Q 111 DSE Q 112 X<> IND Q 113 FRC 114 STO IND Q 115 SIGN 116 ST+ Q 117 X<> Z 118 X#0? 119 GTO 02 120 LBL 00 121 X<>Y 122 RCL 00 123 ST+ X 124 X+1 |
125 X<>Y
126 X<> IND Y 127 X*E3 128 ISG Y 129 CLX 130 ST+ IND Y 131 RCL 00 132 X/E3 133 ISG X 134 X/E3 135 X+1 136 RCL 00 137 + 138 REGMOVE 139 RCL P 140 XEQ "A^X" 141 RCL 00 142 ST+ X 143 X+1 144 RCL IND X 145 ST*A 146 CLX 147 SIGN 148 + 149 RCL IND X 150 FRC 151 LASTX 152 INT 153 X/E3 154 LBL 04 155 RCL 00 |
156 X/E3
157 ISG X 158 RCL 00 159 ST+ X 160 + 161 X/E3 162 X+1 163 REGMOVE 164 RDN 165 X*E3 166 X<>Y 167 X*E3 168 @HG 169 RCL 00 170 X/E3 171 ISG X 172 ENTER^ 173 X/E3 174 X+1 175 RCL 00 176 ST+ X 177 + 178 REGMOVE 179 R^ 180 R^ 181 ST<>A 182 R^ 183 CLA 184 END |
( 293 bytes /SIZE 3n+1 )
STACK | INPUTS | OUTPUTS |
T | bi or cj | bi or cj |
Z | bi or cj | bi or cj |
Y | bi or cj | bi or cj |
X | +/- p.qqq | 1.nnn |
where 1.nnn is the control number of the result.
+ p.qqq for the hypergeometric
function
- p.qqq for the regularized hypergeometric
function
>>> Enter the bi first, then the cj and finally +/- p.qqq
Example1: 2F1 a = 0.1 + 0.2 i + 0.3 j + 0.4 k p = 1.1 q = 1.2 s = 1.3 ( Quaternion -> 4 STO 00 )
0.1 STO 01
0.2 STO 02
0.3 STO 03
0.4 STO 04
1.1 ENTER^
1.2 ENTER^
1.3 ENTER^
2.001 XEQ "HGFB" >>>>
1.004
---Execution time = 42s---
R01
= 0.814236592
R02 = 0.184421233
R03 = 0.276631850
R04 = 0.368842467
2F1 ( 1.1 , 1.2
; 1.3 ; 0.1 + 0.2 i + 0.3 j + 0.4
k ) = 0.814236592 + 0.184421233 i + 0.276631850 j
+ 0.368842467 k
Example2: 2F~1 a = 0.1 + 0.2 i + 0.3 j + 0.4 k p = 1 q = 2 s = -4 ( Quaternion -> 4 STO 00 )
0.1 STO 01
0.2 STO 02
0.3 STO 03
0.4 STO 04
1 ENTER^
2 ENTER^
-4 ENTER^
2.001 CHS XEQ "HGFB" >>>>
1.004
---Execution time = 92s---
R01
= -7.152496297
R02 = -9.061272756
R03 = -13.59190873
R04 = -18.12254510
2F~1 ( 1 , 2 ; -4
; 0.1 + 0.2 i + 0.3 j + 0.4 k ) = -7.152496297
- 9.061272756 i - 13.59190873 j - 18.12254510 k
Example3: 1F2 a = 0.1 + 0.2 i + 0.3 j + 0.4 k p = 1.1 q = 1.2 s = 1.3 ( Quaternion -> 4 STO 00 )
0.1 STO 01
0.2 STO 02
0.3 STO 03
0.4 STO 04
1.1 ENTER^
1.2 ENTER^
1.3 ENTER^
1.002 XEQ "HGFB" >>>>
1.004
---Execution time = 10s---
R01
= 1.028367021
R02 = 0.146116085
R03 = 0.219174127
R04 = 0.292232170
-Whence, 1F2 ( 1.1 ; 1.2 , 1.3 ; 0.1 + 0.2 i + 0.3 j + 0.4 k ) = 1.028367021 + 0.146116085 i + 0.219174127 j + 0.292232170 k
Notes:
-Likewise, for the Kummer's Function 1F1
, place 1.001 in X-register
and -1.001 in X-register for the regularized
Kummer's
Function 1F~1 and so on ....
c) 0F1
-It's also possible to write programs that don't use M-Code routines
to compute all kinds of hypergeometric functions:
-For example, the following one, 0F1 , is useful
to calculate Airy's functions and Lommel functions:
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "0F1A" )
• R01 ...... • Rnn = the n components of the anion a which are saved in Rn+1 .... R2n
Rn+1 .......... R3n: temp
>>> When the program stops: R01
...... Rnn = the n components of f(a)
Flags: /
Subroutines: "ST/A" "DSA"
( cf "Anionic Special Functions(I)" )
"A*A1"
( cf "Anions for the HP-41" )
01 LBL "0F1A"
02 CLA 03 STO M 04 RCL 00 05 E3 06 / 07 ISG X 08 STO O 09 RCL 00 10 + 11 E3 |
12 /
13 1 14 + 15 REGMOVE 16 RCL O 17 CLRGX 18 SIGN 19 STO 01 20 LASTX 21 RCL 00 22 ST+ X |
23 +
24 E3 25 / 26 + 27 REGMOVE 28 LBL 01 29 XEQ "A*A1" 30 RCL M 31 RCL N 32 ST+ Y 33 ISG X |
34 CLX
35 STO N 36 * 37 XEQ "ST/A" 38 XEQ "DSA" 39 X#0? 40 GTO 01 41 SIGN 42 RCL O 43 E3 44 / |
45 +
46 RCL 00 47 ST+ X 48 + 49 REGMOVE 50 RCL O 51 CLA 52 END |
( 97 bytes / SIZE 3n+1 )
STACK | INPUTS | OUTPUTS |
X | m | 1.nnn |
where 1.nnn is the control number of the result
Example: Calculate 0F1( m ; a ) with m = PI a = 1 + 2 i + 3 j + 4 k ( Quaternion -> 4 STO 00 )
1 STO 01
2 STO 02
3 STO 03
4 STO 04
PI XEQ "0F1A" >>>> 1.004 ---Execution time = 15s--- ( with M-Code routines... )
R01 = 0.106086113
R02 = 0.641727862
R03 = 0.962591792
R04 = 1.283455724
-Whence, 0F1( PI ; 1 + 2 i + 3 j + 4 k ) = 0.106086113 + 0.641727862 i + 0.962591792 j + 1.283455724 k
Notes:
-To get the regularized functions, simply divide the result by
the product of the Gamma(cj)
.... but it will not work if a cj is a non-positive
integer !
-Lommel functions also call "0F1A" but it is preferable to save registers
Y & Z in this case ( cf paragraph 11 below )
-For "A*A1" - line 34 - use a version that does not alter synthetic
register P
01 LBL "0F1A"
02 STO M 03 RDN 04 STO N 05 X<>Y 06 STO O 07 RCL 00 08 RCL 00 09 E3 10 / 11 ISG X 12 STO Z 13 + |
14 E3
15 / 16 1 17 + 18 REGMOVE 19 X<>Y 20 CLRGX 21 SIGN 22 STO 01 23 LASTX 24 RCL 00 25 ST+ X 26 + |
27 E3
28 / 29 + 30 REGMOVE 31 CLX 32 STO P 33 LBL 01 34 XEQ "A*A1" 35 RCL M 36 RCL P 37 ST+ Y 38 ISG X 39 CLX |
40 STO P
41 * 42 XEQ "ST/A" 43 XEQ "DSA" 44 X#0? 45 GTO 01 46 RCL 00 47 E3 48 / 49 ISG X 50 STO Y 51 LASTX 52 / |
53 1
54 + 55 RCL 00 56 ST+ X 57 + 58 REGMOVE 59 X<> O 60 RCL N 61 RCL M 62 R^ 63 CLA 64 END |
( 114 bytes / SIZE 3n+1 )
STACK | INPUTS | OUTPUTS |
T | / | Z |
Z | Z | Y |
Y | Y | m |
X | m | 1.nnn |
where 1.nnn is the control number of the result
-The same example gives the same result.
-Use this variant to compute Lommel functions of the second kind in
paragraph 11.
d) 2F0
-"2F0A" computes the asymptotic function 2F0
(p,q;;a)
-It is used to calculate an asymptotic expansion of the exponential
integral Em(a)
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "2F0A" )
• R01 ...... • Rnn = the n components of the anion a which are saved in Rn+1 .... R2n
Rn+1 .......... R3n: temp
>>> When the program stops: R01
...... Rnn = the n components of f(a)
Flags: /
Subroutines: "ST*A" "DSA"
( cf "Anionic Special Functions(I)" )
"A*A1"
( cf "Anions for the HP-41" )
01 LBL "2F0A"
02 STO M 03 X<>Y 04 STO N 05 RCL 00 06 .1 07 % 08 STO Z 09 ISG X 10 + 11 E3 12 / |
13 1
14 + 15 REGMOVE 16 + 17 STO O 18 CLX 19 XEQ "ST*A" 20 SIGN 21 STO 01 22 CLX 23 X<> O 24 REGMOVE |
25 LBL 01
26 XEQ "A*A1" 27 RCL M 28 RCL N 29 RCL O 30 ST+ Y 31 ST+ Z 32 ISG X 33 CLX 34 STO O 35 / 36 * |
37 XEQ "ST*A"
38 XEQ "DSA" 39 X#0? 40 GTO 01 41 RCL N 42 RCL M 43 RCL 00 44 E3 45 / 46 ISG X 47 STO O 48 LASTX |
49 /
50 1 51 + 52 RCL 00 53 ST+ X 54 + 55 REGMOVE 56 X<> O 57 CLA 58 END |
( 112 bytes / SIZE 3n+1 )
STACK | INPUTS | OUTPUTS |
Z | / | p |
Y | p | q |
X | q | 1.nnn |
where 1.nnn is the control number of the result
Notes:
-See "Anionic Special Functions (I)" paragraph 4°)c) for an application
of this routine.
- XEQ "2F0A" may be replaced by 2 XEQ "HGFB"
7°) Airy Functions
Formulae:
Ai(a) = f(a) - g(a)
with
f(a) = [ 3 -2/3 / Gamma(2/3) ] 0F1(
2/3 ; a3/9 )
Bi(a) = [ f(a) + g(a) ] sqrt(3)
and g(a)
= [ 3 -1/3 / Gamma(1/3) ] 0F1( 4/3
; a3/9 ) a
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "AIRYA" )
• R01 ...... • Rnn = the n components of the anion a
Rn+1 .......... R4n: temp
>>> When the program stops: R01
...... Rnn = the n components of Ai(a)
and Rn+1....... R2n = --------------------
Bi(a)
Flags: /
Subroutines: "ST/A" "ST*A"
( cf "Anionic Special Functions(I)" )
"A*A1"
( cf "Anions for the HP-41" )
"0F1A"
( cf paragraph 6°c) above )
01 LBL "AIRYA"
02 RCL 00 03 .1 04 % 05 STO Z 06 ST+ Z 07 ISG X 08 + 09 E3 10 / 11 1 12 + 13 REGMOVE 14 + |
15 REGMOVE
16 XEQ "A*A1" 17 XEQ "A*A1" 18 9 19 XEQ "ST/A" 20 4 21 3 22 / 23 XEQ "0F1A" 24 RCL 00 25 3 26 * 27 + 28 E3 |
29 /
30 1 31 + 32 STO M 33 RCL 00 34 + 35 REGSWAP 36 XEQ "A*A1" 37 .2588194038 38 XEQ "ST*A" 39 RCL M 40 REGSWAP 41 2 42 3 |
43 /
44 XEQ "0F1A" 45 .3550280539 46 XEQ "ST*A" 47 RCL 00 48 STO M 49 ST+ X 50 ENTER^ 51 ST+ Y 52 LBL 01 53 RCL IND M 54 RCL IND Z 55 ST- IND M 56 + |
57 3
58 SQRT 59 * 60 STO IND Y 61 RDN 62 DSE Y 63 DSE X 64 DSE M 65 GTO 01 66 RCL 00 67 E3 68 / 69 ISG X 70 END |
( 167 bytes / SIZE 4n+1 )
STACK | INPUTS | OUTPUTS |
X | m | 1.nnn |
where 1.nnn is the control number of Ai(a) [ Bi(a) is in registers Rn+1 ..... R2n ]
Example: a = 1 + i/2 + j/3 + k/4 ( Quaternion -> 4 STO 00 )
1 STO 01
2 1/X STO 02
3 1/X STO 03
4 1/X STO 04
XEQ "AIRYA" >>>> 1.004
---Execution time = 27s---
R01 = 0.105299445
R02 = -0.078442074
R03 = -0.052294716
R04 = -0.039221037
Thus, Ai ( 1 + i/2 + j/3 + k/4 ) = 0.105299445 - 0.078442074 i - 0.052294716 j - 0.039221037 k
and Bi ( 1 + i/2 + j/3 + k/4 ) = 0.973463977
+ 0.394832415 i + 0.263221610 j + 0.197416207 k
in R05 to R08
Notes:
-This program returns accurate results for "small" arguments only.
-Lines 23 & 44 may be replaced by E-3 XEQ "HGFB"
8°) Hermite Functions
Formula: Hm(a) = 2m sqrt(PI) [ (1/Gam((1-m)/2)) M(-m/2,1/2,a2) - ( 2.a / Gam(-m/2) ) M((1-m)/2,3/2,a2) ]
where Gam = Gamma function
and
M = Kummer's function = 1F1
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "HMTA" )
• R01 ...... • Rnn = the n components of the anion
Rn+1 .......... R4n: temp R4n+1 = -m/2
>>> When the program stops: R01
...... Rnn = the n components of the result
Flags: /
Subroutines: "ST*A" "KUMA"
( cf "Anionic Special Functions(I) )
"A*A1"
( cf "Anions for the HP-41" )
"1/G+"
( cf "Gamma Function for the HP-41" )
01 LBL "HMTA"
02 CHS 03 2 04 / 05 STO M 06 RCL 00 07 4 08 * 09 1 10 + 11 X<>Y 12 STO IND Y 13 RCL 00 14 .1 15 % 16 STO Z 17 ST+ Z 18 ISG X 19 + 20 E3 21 / |
22 1
23 + 24 REGMOVE 25 + 26 REGMOVE 27 XEQ "A*A1" 28 RCL M 29 .5 30 ST+ Y 31 3 32 * 33 XEQ "KUMA" 34 SIGN 35 RCL 00 36 4 37 * 38 + 39 RCL IND X 40 STO N 41 XEQ "1/G+" 42 ST+ X |
43 XEQ "ST*A"
44 RCL 00 45 E3 46 / 47 ISG X 48 RCL 00 49 3 50 * 51 + 52 E3 53 / 54 RCL 00 55 + 56 1 57 + 58 REGSWAP 59 XEQ "A*A1" 60 E3 61 / 62 RCL 00 63 3 |
64 *
65 + 66 1 67 + 68 REGSWAP 69 RCL N 70 .5 71 XEQ "KUMA" 72 X<> Z 73 STO N 74 + 75 XEQ "1/G+" 76 XEQ "ST*A" 77 4 78 RCL 00 79 ST* Y 80 LBL 01 81 RCL IND Y 82 ST- IND Y 83 RDN 84 DSE Y |
85 DSE X
86 GTO 01 87 2 88 RCL N 89 ST+ X 90 CHS 91 Y^X 92 PI 93 SQRT 94 * 95 XEQ "ST*A" 96 RCL 00 97 E3 98 / 99 ISG X 100 CLA 101 END |
( 190 bytes / SIZE 4n+2 )
STACK | INPUTS | OUTPUTS |
X | m | 1.nnn |
where 1.nnn is the control number of the result
Example: a = 1 + i/2 + j/3 + k/4 m = PI ( Quaternion -> 4 STO 00 )
1 STO 01
2 1/X STO 02
3 1/X STO 03
4 1/X STO 04
PI XEQ "HMTA" >>>> 1.004 ---Execution time = 45s---
R01 = -17.81760490
R02 = 2.845496135
R03 = 1.896997426
R04 = 1.422748067
-Whence, Hpi( 1 + i/2 + j/3 + k/4 ) = -17.81760490 + 2.845496135 i + 1.896997426 j + 1.422748067 k
Note:
-Lines 71 & 33 may be replaced by 1.001
XEQ "HGFB"
9°) Chebyshev Functions
Formulae:
CF 02
Tm(cos A) = cos m.A
( first kind )
with cos A = a
SF 02
Um(cos A) = [ sin (m+1).A
] / sin A ( second kind )
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "CHBA" )
• R01 ...... • Rnn = the n components of the anion a
Rn+1 .......... R2n: temp R2n+1 = m
>>> When the program stops: R01
...... Rnn = the n components of f(a)
Flag: F02 CF 02
for the Chebyshev Functions of the 1st kind
SF 02 ----------------------------------- 2nd kind
Subroutines: "ST*A"
( cf "Anionic Special Functions(I)" )
"A*A1" "ACOSA" "COSA" "SINA" "1/A"
( cf "Anions for the HP-41" )
01 LBL "CHBA"
02 RCL 00 03 ST+ X 04 1 05 + 06 X<>Y 07 STO IND Y 08 XEQ "ACOSA" 09 RCL 00 |
10 STO Z
11 ST+ Z 12 + 13 E3 14 / 15 1 16 + 17 FS? 02 18 REGMOVE |
19 SIGN
20 + 21 RCL IND X 22 LASTX 23 FC? 02 24 CLX 25 + 26 XEQ "ST*A" 27 FS? 02 |
28 GTO 00
29 XEQ "COSA" 30 RTN 31 LBL 00 32 XEQ "SINA" 33 RCL 00 34 + 35 E3 36 / |
37 1
38 + 39 REGSWAP 40 XEQ "SINA" 41 XEQ "1/A" 42 XEQ "A*A1" 43 END |
( 100 bytes / SIZE 2n+2 )
STACK | INPUTS | OUTPUTS |
X | m | 1.nnn |
where 1.nnn is the control number of the result
Example: a = 0.1 + 0.2 i + 0.3 j + 0.4 k m = PI ( Quaternion -> 4 STO 00 )
• CF 02 Chebyshev Function 1st kind
0.1 STO 01
0.2 STO 02
0.3 STO 03
0.4 STO 04
PI XEQ "CHBA" >>>> 1.004 ---Execution time = 15s---
R01 = -0.143159414
R02 = -0.905090619
R03 = -1.357635928
R04 = -1.810181237
TPI( 0.1 + 0.2 i + 0.3 j + 0.4 k ) = -0.143159414 - 0.905090619 i - 1.357635928 j - 1.810181237 k
• SF 02 Chebyshev Function 2nd kind
0.1 STO 01
0.2 STO 02
0.3 STO 03
0.4 STO 04
PI XEQ "CHBA" >>>> 1.004 ---Execution time = 20s---
R01 = -0.386199512
R02 = -1.369695948
R03 = -2.054543921
R04 = -2.739391894
And UPI( 0.1 + 0.2 i + 0.3 j + 0.4 k ) = -0.386199512 - 1.369695948 i - 2.054543921 j - 2.739391894 k
Note:
-Here is a variant that employs the M-Code routines AMOVE &
ASWAP listed in "Anionic Special Function(I)"
and the M-Code routines X+1 STO W &
RCL W listed in "A few M-Code routines for the HP-41"
01 LBL "CHBA"
02 STO W 03 ACOSA 04 12 05 FS? 02 06 AMOVE 07 RCL W 08 FS? 02 09 X+1 10 ST*A 11 FS? 02 12 GTO 00 13 COSA 14 RTN 15 LBL 00 16 SINA 17 12 18 ASWAP 19 SINA 20 1/A 21 A*A1 22 END |
( 49 bytes / SIZE 2n+1 )
-Assuming the focal programs "ACOSA" "COSA" "SINA" "1/A" are in
a HEPAX or a NOVRAM module, we've saved 51 bytes !
-The results are of course identical.
10°) Riemann Zeta Function
a) If Re(a) > 1
-"ZETAA" uses Zeta(a) = 1 + 1/2a + 1/3a
+ ........ + 1/na + ......
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "ZETAA" )
• R01 ...... • Rnn = the n components of the anion a
Rn+1 .......... R3n: temp
>>> When the program stops: R01
...... Rnn = the n components of f(a)
Flags: /
Subroutines: "DSA"
( cf "Anionic Special Functions(I)" )
"X^A" ( cf "Anions
for the HP-41" )
01 LBL "ZETAA"
02 CLA 03 RCL 00 04 .1 05 % 06 ISG X 07 + 08 E3 09 / 10 1 11 + 12 REGMOVE |
13 RCL 00
14 3 15 * 16 .1 17 % 18 ISG X 19 + 20 RCL 00 21 - 22 CLRGX 23 LBL 01 24 RCL 00 |
25 E3
26 / 27 ISG X 28 LASTX 29 / 30 1 31 + 32 RCL 00 33 + 34 REGMOVE 35 SIGN 36 RCL M |
37 +
38 STO M 39 1/X 40 XEQ "X^A" 41 XEQ "DSA" 42 X#0? 43 GTO 01 44 RCL 00 45 E3 46 / 47 ISG X 48 LASTX |
49 /
50 1 51 + 52 RCL 00 53 ST+ X 54 + 55 REGMOVE 56 FRC 57 E3 58 * 59 CLA 60 END |
( 96 bytes / SIZE 3n+1 )
STACK | INPUT | OUTPUT |
X | / | 1.nnn |
where 1.nnn is the control number of the result
Example: a = 6 + 7 i + 8 j + 9 k ( Quaternion -> 4 STO 00 )
6 STO 01
7 STO 02
8 STO 03
9 STO 04
XEQ "ZETAA" >>>> 1.004 ---Execution time = 2m53s---
R01 = 0.983702003
R02 = 0.001473512
R03 = 0.001684014
R04 = 0.001894515
Zeta ( 6 + 7 i + 8 j + 9 k ) = 0.983702003 + 0.001473512 i + 0.001684014 j + 0.001894515 k
Notes:
-Add RND after line 41 and the accuracy will be controlled
by the display settings.
-If Re(a) is close to 1, the execution time becomes prohibitive and
a better method must be used:
b) Borwein Algorithm
-The following program employs the method given by P. Borwein in
"An
Efficient Algorithm for the Riemann Zeta Function" if Re(a)
>= 1/2
-If Re(a) < 1/2, it uses: Zeta(a)
= Zeta(1-a) Pi a-1/2 Gamma((1-a)/2) / Gamma(a/2)
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "ZETAA" )
• R01 ...... • Rnn = the n components of the anion a
Rn+1 .......... R6n: temp
>>> When the program stops: R01
...... Rnn = the n components of f(a)
Flags: /
Subroutines: "ST*A" "ST/A"
"GAMA" "DSA"
( cf "Anionic Special Functions(I)" )
"A*A1" "X^A" "1/A"
( cf "Anions for the HP-41" )
-Lines 20 & 139 are three-byte GTO's
01 LBL "ZETAA"
02 XEQ 14 03 RCL 01 04 X^2 05 + 06 X#0? 07 GTO 00 08 .5 09 CHS 10 STO 01 11 RCL 00 12 E3 13 / 14 ISG X 15 RTN 16 LBL 00 17 RCL 01 18 .5 19 X<=Y? 20 GTO 01 21 RCL 00 22 E3 23 / 24 ISG X 25 RCL 00 26 5 27 * 28 + 29 E3 30 / 31 1 32 + 33 STO M 34 REGMOVE 35 X<>Y 36 ST- 01 37 PI 38 XEQ "X^A" 39 RCL 00 40 E3 41 / 42 ISG X 43 RCL 00 44 3 45 * 46 + 47 E3 48 / |
49 1
50 + 51 REGMOVE 52 RCL M 53 REGSWAP 54 REGMOVE 55 SIGN 56 CHS 57 XEQ "ST*A" 58 ST- 01 59 XEQ 01 60 RCL 00 61 .1 62 % 63 ISG X 64 + 65 E3 66 / 67 1 68 + 69 RCL 00 70 3 71 * 72 + 73 REGMOVE 74 XEQ "A*A1" 75 FRC 76 LASTX 77 RCL 00 78 4 79 * 80 + 81 E3 82 / 83 1 84 + 85 REGMOVE 86 + 87 REGSWAP 88 REGMOVE 89 2 90 CHS 91 XEQ "ST/A" 92 1/X 93 ST- 01 94 XEQ "GAMA" 95 RCL 00 96 + |
97 E3
98 / 99 1 100 + 101 RCL 00 102 4 103 * 104 + 105 REGMOVE 106 XEQ "A*A1" 107 FRC 108 LASTX 109 RCL 00 110 4 111 * 112 + 113 E3 114 / 115 1 116 + 117 REGMOVE 118 + 119 REGSWAP 120 REGMOVE 121 2 122 XEQ "ST/A" 123 XEQ "GAMA" 124 XEQ "1/A" 125 RCL 00 126 .1 127 % 128 ISG X 129 + 130 E3 131 / 132 1 133 + 134 RCL 00 135 4 136 * 137 + 138 REGMOVE 139 GTO 03 140 LBL 14 141 RCL 00 142 E-3 143 + 144 0 |
145 LBL 13
146 RCL IND Y 147 X^2 148 + 149 DSE Y 150 GTO 13 151 SQRT 152 RTN 153 LBL 01 154 RCL 00 155 .1 156 % 157 ISG X 158 + 159 E3 160 / 161 1 162 + 163 REGMOVE 164 RCL 00 165 3 166 * 167 .1 168 % 169 ISG X 170 + 171 RCL 00 172 - 173 CLRGX 174 XEQ 14 175 PI 176 2 177 / 178 X<>Y 179 ST* Y 180 ST+ X 181 LN1+X 182 + 183 3 E10 184 LN 185 + 186 8 187 SQRT 188 3 189 + 190 LN 191 / 192 INT |
193 1
194 STO O 195 STO P 196 + 197 STO M 198 STO N 199 LBL 02 200 RCL 00 201 PI 202 INT 203 10^X 204 / 205 ISG X 206 LASTX 207 / 208 ENTER^ 209 SIGN 210 + 211 RCL 00 212 + 213 REGMOVE 214 RCL M 215 1/X 216 XEQ "X^A" 217 SIGN 218 CHS 219 RCL M 220 Y^X 221 RCL O 222 * 223 XEQ "ST*A" 224 XEQ "DSA" 225 RCL M 226 ENTER^ 227 ST+ Y 228 ST* Y 229 - 230 RCL P 231 * 232 RCL N 233 X^2 234 RCL M 235 ENTER^ 236 SIGN 237 - 238 X^2 239 - 240 ST+ X |
241 /
242 ST+ O 243 STO P 244 DSE M 245 GTO 02 246 RCL 00 247 E3 248 / 249 ISG X 250 LASTX 251 / 252 1 253 + 254 RCL 00 255 + 256 REGMOVE 257 SIGN 258 CHS 259 XEQ "ST*A" 260 ST- 01 261 2 262 XEQ "X^A" 263 SIGN 264 ST- 01 265 XEQ "1/A" 266 RCL 00 267 .1 268 % 269 ISG X 270 + 271 E3 272 / 273 1 274 + 275 RCL 00 276 ST+ X 277 + 278 REGMOVE 279 RCL O 280 XEQ "ST/A" 281 LBL 03 282 XEQ "A*A1" 283 CLA 284 END |
( 469 bytes / SIZE 6n+1 )
STACK | INPUT | OUTPUT |
X | / | 1.nnn |
where 1.nnn is the control number of the result
Examples: a = -7.6 + 7.7 i + 7.8 j + 7.9 k ( Quaternion -> 4 STO 00 )
7.6 CHS STO 01
7.7 STO 02
7.8 STO 03
7.9 STO 04
XEQ "ZETAA" >>>> 1.004 ---Execution time = 3m00s---
R01 = 762.9852912
R02 = -14.26823510
R03 = -14.45353680
R04 = -14.63883870
-Whence, Zeta ( -7.6 + 7.7
i + 7.8 j + 7.9 k ) = 762.9852912 - 14.26823510
i - 14.45353680 j - 14.63883870 k
-Likewise, Zeta( 1.1 + 7 i + 8 j + 9 k ) = 0.389296028
- 0.027737071 i - 0.031699509 j - 0.035661948 k
( in 2m08s )
Notes:
-If a is very close to 1, there could be a loss of accuracy when 2^(1-a)-1
is executed:
-Replace lines 261 to 264 by
261 2
262 LN 263 RCL 01 264 * 265 STO 01 266 E^X-1 267 XEQ 14 |
268 STO M
269 2 270 LN 271 * 272 STO N 273 X<>Y 274 RDN |
275 RAD
276 COS 277 ST* Y 278 1 279 - 280 + 281 RCL 01 |
282 E^X
283 RCL N 284 SIN 285 * 286 RCL M 287 X=0? 288 SIGN |
289 /
290 XEQ "ST*A" 291 X<>Y 292 STO 01 |
-The last decimals may depend on the version of "E^A" , "A*A1" , ....
that you are using.
-If Re(a) is large, it could be preferable to employ the 1st version
of "ZETAA".
-In all other cases, Borwein algorithm is the best !
-Using the M-Code routines AMOVE & ASWAP would save many bytes...
11°) Lommel Functions
-"LOMA" calculates the Lommel functions of the 1st kind if flag
F02 is clear and the Lommel functions of the 2nd kind if flag
F02 is set.
-It uses the formulae:
s(1)m,p(a) = am+1 / [ (m+1)2 - p2 ] 1F2 ( 1 ; (m-p+3)/2 , (m+p+3)/2 ; -a2/4 )
s(2)m,p(a) = am+1
/ [ (m+1)2 - p2 ] 1F2
( 1 ; (m-p+3)/2 , (m+p+3)/2 ; a2/4 )
+ 2m+p-1 Gam(p) Gam((m+p+1)/2) a -p / Gam((-m+p+1)/2)
0F1
( ; 1-p ; -a2/4 )
+ 2m-p-1 Gam(-p) Gam((m-p+1)/2) ap / Gam((-m-p+1)/2)
0F1
( ; 1+p ; -a2/4 )
where pFq is the generalized
hypergeometric function and Gam is Euler Gamma function.
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn are to be initialized before executing "LOMA" )
• R01 ...... • Rnn = the n components of the anion a
Rn+1 .......... R5n: temp
>>> When the program stops: R01
...... Rnn = the n components of f(a)
Flags: F02 & F04
CF 02 to compute s(1)m,p(a)
SF 02 to compute s(2)m,p(a)
Subroutines: "0F1A"
( cf paragraph 6°)c) above - the second version )
"DSA" "ST*A" "ST/A" "HGFA" ( cf
"Anionic Special Functions(I)" )
"A*A1" "A^X"
( cf "Anions for the HP-41" )
"1/G+"
( cf "Gamma Function for the HP-41" )
-Line 139 may be replaced by
E-3 XEQ "HGFB" ( cf paragraph 6°)b)
above )
-Lines 59-60 may be replaced by 1.002 XEQ
"HGFB"
-Lines 102 & 103 are synthetic three-byte GTOs
01 LBL "LOMA"
02 RCL 00 03 .1 04 % 05 ISG X 06 + 07 RCL 00 08 ST+ X 09 + 10 E3 11 / 12 1 13 + 14 REGMOVE 15 CLX 16 RCL 00 17 4 18 * 19 2 20 + 21 STO T 22 RDN 23 STO IND Z 24 DSE Z 25 STO N 26 X<>Y 27 STO IND Z 28 STO O 29 2 30 XEQ "ST/A" 31 RCL 00 32 .1 33 % 34 ISG X 35 + 36 E3 37 / 38 1 39 + 40 REGMOVE 41 XEQ "A*A1" 42 SIGN 43 CHS 44 FC? 02 45 XEQ "ST*A" |
46 CHS
47 RCL O 48 RCL N 49 - 50 RCL O 51 LASTX 52 + 53 3 54 ST+ Z 55 + 56 2 57 ST/ Z 58 / 59 SF 04 60 XEQ "HGFA" 61 STO Y 62 RCL 00 63 + 64 E3 65 / 66 1 67 + 68 REGMOVE 69 CLX 70 E3 71 / 72 1 73 + 74 RCL 00 75 3 76 * 77 + 78 REGMOVE 79 LASTX 80 RCL 00 81 + 82 2 83 + 84 RCL IND X 85 STO N 86 DSE Y 87 RCL IND Y 88 STO O 89 1 90 + |
91 XEQ "A^X"
92 XEQ "A*A1" 93 RCL O 94 1 95 + 96 X^2 97 RCL N 98 X^2 99 - 100 XEQ "ST/A" 101 FC? 02 102 GTO 03 103 GTO 02 104 LBL 01 105 RCL 00 106 E3 107 / 108 ISG X 109 LASTX 110 / 111 RCL 00 112 3 113 * 114 + 115 1 116 + 117 REGMOVE 118 2 119 XEQ "ST/A" 120 RCL 00 121 .1 122 % 123 ISG X 124 + 125 E3 126 / 127 1 128 + 129 REGMOVE 130 XEQ "A*A1" 131 SIGN 132 CHS 133 XEQ "ST*A" 134 RCL O 135 RCL N |
136 1
137 RCL Y 138 - 139 XEQ "0F1A" 140 RDN 141 STO M 142 RDN 143 STO N 144 X<>Y 145 STO O 146 RCL 00 147 .1 148 % 149 ISG X 150 STO Z 151 + 152 E3 153 ST/ Z 154 / 155 1 156 ST+ Z 157 + 158 REGMOVE 159 CLX 160 RCL 00 161 3 162 * 163 + 164 REGMOVE 165 RCL N 166 CHS 167 XEQ "A^X" 168 XEQ "A*A1" 169 2 170 RCL O 171 RCL M 172 - 173 Y^X 174 STO M 175 RCL N 176 1 177 + 178 RCL O 179 - 180 2 |
181 /
182 XEQ "1/G+" 183 ST* M 184 RCL N 185 XEQ "1/G+" 186 ST/ M 187 RCL N 188 RCL O 189 + 190 1 191 + 192 2 193 / 194 XEQ "1/G+" 195 ST/ M 196 RCL M 197 XEQ "ST*A" 198 RCL 00 199 .1 200 % 201 ISG X 202 + 203 RCL 00 204 + 205 E3 206 / 207 1 208 + 209 RCL 00 210 4 211 * 212 + 213 REGMOVE 214 XEQ "DSA" 215 RTN 216 LBL 02 217 RCL 00 218 E3 219 / 220 ISG X 221 RCL 00 222 4 223 * 224 + 225 E3 |
226 /
227 1 228 + 229 REGMOVE 230 XEQ 01 231 RCL 00 232 E3 233 / 234 ISG X 235 RCL 00 236 4 237 * 238 + 239 E3 240 / 241 1 242 + 243 RCL 00 244 2 245 * 246 + 247 REGMOVE 248 SIGN 249 CHS 250 ST* N 251 XEQ 01 252 RCL 00 253 E3 254 / 255 ISG X 256 LASTX 257 / 258 1 259 + 260 RCL 00 261 ST+ X 262 + 263 REGMOVE 264 LBL 03 265 RCL 00 266 E3 267 / 268 ISG X 269 CLA 270 END |
( 462 bytes / SIZE 4n+3 or 5n+1
)
STACK | INPUTS | OUTPUTS |
Y | m | / |
X | p | 1.nnn |
where 1.nnn is the control number of the result
Examples: m = sqrt(2) , p = sqrt(3) , a = 1 + 1.1 i + 1.2 j + 1.3 k ( Quaternion -> 4 STO 00 )
CF 02 Lommel functions of the 1st kind:
CF 02
1 STO 01
1.1 STO 02
1.2 STO 03
1.3 STO 04
2 SQRT
3 SQRT XEQ "LOMA"
>>>> 1.004
---Execution time = 19s---
R01 = -2.555663121
R02 = 1.081642020
R03 = 1.179973113
R04 = 1.278304206
-Whence s(1)sqrt(2),sqrt(3)( 1 + 1.1 i + 1.2 j + 1.3 k ) = -2.555663121 + 1.081642020 i + 1.179973113 j + 1.278304206 k
SF 02 Lommel functions of the 2nd kind:
SF 02
1 STO 01
1.1 STO 02
1.2 STO 03
1.3 STO 04
2 SQRT
3 SQRT XEQ "LOMA"
>>>> 1.004
---Execution time = 68s---
R01 = 1.461743799
R02 = -0.935738231
R03 = -1.020805344
R04 = -1.105872457
-Whence s(2)sqrt(2),sqrt(3)( 1 + 1.1
i + 1.2 j + 1.3 k ) = 1.461743799 - 0.935738231 i - 1.020805344
j - 1.105872457 k
Note:
-Using M-Code routines + AMOVE & ASWAP would reduce the number
of bytes to 247 instead of 462 !