Anions for the HP-41
Overview
0°) Addition & Multiplication ( Special Case )
a) Focal Program#1
b) Focal Program#2
c) M-Code Routines
c1- Initialization
c2- Multiplication & Addition
Routines
1°) Multiplication ( General Case )
a) Program#1
b) Program#2
c) Program#3
2°) Miscellaneous Functions
3°) Anionic Polynomials - Real Coefficients
4°) Anionic Equations
-The Cayley-Dickinson formula ( a , b ) ( c , d ) = ( a c - d* b , d a + b c* ) where * = conjugate
may be used to construct the complexes from the real numbers, regarding a complex as a pair of real numbers.
-Likewise, the quaternions from the complexes, the octonions from the
quaternions, the sedenions from the octonions,
the 32-ons from the sedenions, the 64-ons from the 32-ons ...
and so on ... for the 2^n-ons
-I've used the word "anion" though it's perhaps not "official".
0°) Addition & Multiplication ( Special
Case )
a) Focal Program#1
-The Cayley-Dickinson formula is not very easy to handle with an HP-41
and it employs many registers.
-But fortunately, there is a much easier case when the anions have
the same imaginary direction,
it's often the case to compute elementary or special functions
of an anion:
Data Registers: • R00 = n ( 2 , 4 , 8 , 16 , 32 , 64 or 128 ) ( Registers R00 thru R2n are to be initialized before executing "A*A1" )
• R01 ...... • Rnn = the n components of
the 1st anion
• Rn+1 ...... • R2n = the n components of the 2nd anion
>>> When the program stops: R01 ...... Rnn = the n components of the product
Flags: /
Subroutines: /
01 LBL "A*A1"
02 RCL 00 03 E-3 04 + 05 STO P 06 ISG X 07 ABS 08 RCL 00 |
09 ST+ X
10 STO Q 11 RCL IND Y 12 STO Y 13 RCL 01 14 * 15 LBL 01 16 RCL 01 |
17 RCL IND Q
18 * 19 RCL IND P 20 R^ 21 ST* Y 22 RDN 23 + 24 X<> IND P |
25 RCL IND Q
26 * 27 - 28 DSE Q 29 DSE P 30 GTO 01 31 STO 01 32 CLX |
33 STO P
34 RCL 00 35 E3 36 / 37 ISG X 38 END |
( 66 bytes / SIZE 2n+1 )
STACK | INPUT | OUTPUT |
X | / | 1.nnn |
where 1.nnn is the control number of the product.
Example: a = 8 + 3 i + 4 j + 7 k ; a' = 5 - 6 i - 8 j - 14 k
-These are quaternions so 4 STO 00
8 STO 01
5 STO 05
3 STO 02
-6 STO 06
4 STO 03
-8 STO 07
7 STO 04
-14 STO 08
XEQ "A*A1" >>>> 1.004 and we get in registers R01 thru R04
R01 = 188 , R02 = -33 , R03 = -44 , R04 = -77
-Therefore, a.a' = 188 - 33 i - 44 j - 77 k
Notes:
-"A*A1" does not check that the imaginary parts are proportional.
-This routine uses synthetic registers P & Q but registers
M , N , O are undisturbed.
-This is useful to compute special functions.
-Otherwise, P & Q could be replaced by M & N.
b) Focal Program#2
-There are special functions - like the hypergeometric functions - that
use synthetic register P.
-The variant hereunder leaves registers M , N , O , P undisturbed.
Data Registers: • R00 = n ( 2 , 4 , 8 , 16 , 32 , 64 or 128 ) ( Registers R00 thru R2n are to be initialized before executing "A*A1" )
• R01 ...... • Rnn = the n components of
the 1st anion
• Rn+1 ...... • R2n = the n components of the 2nd anion
>>> When the program stops: R01 ...... Rnn = the n components of the product
Flags: /
Subroutines: /
01 LBL "A*A1"
02 CLX 03 SIGN 04 RCL 00 05 + 06 STO Y 07 PI 08 INT 09 10^X 10 / |
11 RCL 00
12 ST+ X 13 + 14 STO Q 15 RCL IND Y 16 STO Y 17 RCL 01 18 * 19 LBL 01 20 RCL 01 |
21 RCL IND Q
22 * 23 RCL Q 24 SIGN 25 CLX 26 RCL 00 27 ST- L 28 CLX 29 RCL IND L 30 R^ |
31 ST* Y
32 RDN 33 ST+ Y 34 RDN 35 X<> IND L 36 RCL IND Q 37 * 38 - 39 DSE Q 40 GTO 01 |
41 STO 01
42 RCL 00 43 PI 44 INT 45 10^X 46 / 47 ISG X 48 END |
( 73 bytes / SIZE 2n+1 )
STACK | INPUT | OUTPUT |
X | / | 1.nnn |
where 1.nnn is the control number of the product.
Example: The same one: a = 8 + 3 i + 4 j + 7 k ; a' = 5 - 6 i - 8 j - 14 k
-These are quaternions so 4 STO 00
8 STO 01
5 STO 05
3 STO 02
-6 STO 06
4 STO 03
-8 STO 07
7 STO 04
-14 STO 08
XEQ "A*A1" >>>> 1.004 and we get in registers R01 thru R04
R01 = 188 , R02 = -33 , R03 = -44 , R04 = -77
-Therefore, a.a' = 188 - 33 i - 44 j - 77 k
Notes:
-"A*A1" does not check that the imaginary parts are proportional.
-This second version is of course slightly slower.
-The M-code routine below does not disturb the alpha "register"
but it's also much faster:
c) M-Code Routines
c1)
Initialization
-These codes take a positive integer n in register R00 and place
1.nnn
in CPU register
N[5;3] N[2;0] if CPU flag 9 is set
or 1.nnn.2n in CPU register
N[8;6] N[5;3] N[2;0] if CPU flag 9 is clear
where 1 , nnn & 2n mean the absolute addresses ( in hexadecimal ) of registers R01 , Rnn & R2n
-There is no check for alpha data in these registers but if R00 contains
an alpha string, you'll get the message "ALPHA DATA"
-You will also get "DATA ERROR" if R00 = 0
-Of course, the existence of R00 and Rnn ( or R2n if CPU flag 9 is clear
) is tested
and "NONEXISTENT" is displayed if these registers don't
exist.
260 SETHEX
@EFC8 in my ROM
378 C=c
03C RCR 3
106 A=C S&X
130 LDI S&X
200 200h
correct value for an HP-41CV/CX or an HP-41C with a QUAD memory module
306 ?A<C S&X
381 ?NCGO
00A NEXIST
0A6 A<>C S&X
270 RAMSELECT
038 READATA
38D ?NCXQ
008 N->S&X
2E6 ?C#0 S&X
0B5 ?NCGO
0A2 ERROR
05A C=0 M
23A C=C+1 M
106 A=C S&X
1BC RCR 11
0A6 A<>C S&X
1E6 C=C+C S&X
10E A=C ALL
378 C=c
03C RCR 3
0E6 B<>C S&X
378 C=c
0C6 C=B S&X
1BC RCR 11
0C6 C=B S&X
20E C=A+C ALL
24C ?FSET 9
013 JNC+02
03C RCR 3
070 N=C ALL
10E A=C ALL
130 LDI S&X
200 200h
306 ?A<C S&X
381 ?NCGO
00A NEXIST
3E0 RTN
@EFF2 in my ROM
( 43 words )
-To call this subroutine: ?NCXQ
EFC8 = 321 3BC in my
ROM
-Change these 2 words if you have loaded this routine at another address...
c2)
Multiplication & Addition Routines
-This routine "A*A1" does the same calculations as the 2 focal programs
above
0B1 "1"
001 "A"
02A "*"
001 "A"
244 CLRF 9
321 ?NCXQ
executes the initialization
3BC EFC8
routine above
0B0 C=N ALL
17C RCR 6
270 RAMSLCT
038 READATA
10E A=C ALL
0B0 C=N ALL
03C RCR 3
226 C=C+1 S&X
270 RAMSLCT
038 READATA
0EE B<>C ALL
04E C=0 ALL
270 RAMSLCT
0AE A<>C ALL
068 Z=C
10E A=C ALL
0EE B<>C ALL
0A8 Y=C
2A0 SETDEC
135 C=
060 A*C
0E8 X=C
0B0 C=N ALL
LOOP
270 RAMSLCT
038 READATA
10E A=C ALL
0B0 C=N ALL
03C RCR 3
270 RAMSLCT
038 READATA
0EE B<>C ALL
046 C=0 S&X
270 RAMSLCT
0EE B<>C ALL
028 T=C
2BE C=-C
0AE A<>C ALL
128 L=C
135 C=
060 A*C
0F8 C=X
025 C=
060 AB+C
0E8 X=C
078 C=Z
10E A=C ALL
138 C=L
135 C=
060 A*C
10E A=C ALL
046 C
270 =
038 T
0AE A<>C ALL
128 L=C
0B8 C=Y
135 C=
060 A*C
138 C=L
025 C=
060 AB+C
10E A=C ALL
0B0 C=N ALL
03C RCR 3
270 RAMSLCT
0AE A<>C ALL
2F0 WRITDATA
260 SETHEX
0B0 C=N ALL
266 C=C-1 S&X
27A C=C-1 M
070 N=C ALL
2A0 SETDEC
17C RCR 6
106 A=C S&X
1BC RCR 11
306 ?A<C S&X
24F JC-55d
GOTO LOOP
046 C=0 S&X
270 RAMSLCT
0F8 C=X
10E A=C ALL
0B0 C=N ALL
17C RCR 6
270 RAMSLCT
0AE A<>C ALL
2F0 WRITDATA
0B0 C=N ALL
17C RCR 6
260 SETHEX
266 C=C-1 S&X
270 RAMSLCT
038 READATA
2A0 SETDEC
266 C=C-1 S&X
266 C=C-1 S&X
266 C=C-1 S&X
10E A=C ALL
046 C=0 S&X
270 RAMSLCT
04E C
35C =
050 1
01D C=
060 A+C
0E8 X=C
3E0 RTN
( 114 words / SIZE 2n+1 )
STACK | INPUT | OUTPUT |
X | / | 1.nnn |
where 1.nnn is the control number of the product.
Example: Again the same one: a = 8 + 3 i + 4 j + 7 k ; a' = 5 - 6 i - 8 j - 14 k
-These are quaternions so 4 STO 00
8 STO 01
5 STO 05
3 STO 02
-6 STO 06
4 STO 03
-8 STO 07
7 STO 04
-14 STO 08
XEQ "A*A1" >>>> 1.004 and we get in registers R01 thru R04
R01 = 188 , R02 = -33 , R03 = -44 , R04 = -77
-Therefore, a.a' = 188 - 33 i - 44 j - 77 k
Notes:
-"A*A1" does not check that the imaginary parts are proportional.
-Synthetic register Q is not used.
-If n = 64 the execution time = 10.7 seconds.
-The addition & subtraction routines are similar but much
simpler:
081 "A"
02B "+"
001 "A"
287 CLRF 7
02B JNC+05
081 "A"
02D "-"
001 "A"
288 SETF 7
244 CLRF 9
321 ?NCXQ
executes the initialization
3BC EFC8
routine above
2A0 SETDEC
LOOP
0B0 C=N ALL
270 RAMSLCT
038 READATA
28C ?FSET 7
013 JNC+02
2BE C=-C
10E A=C ALL
0B0 C=N ALL
03C RCR 3
270 RAMSLCT
038 READATA
01D C=
060 A+C
10E A=C ALL
0B0 C=N ALL
03C RCR 3
270 RAMSLCT
0AE A<>C ALL
2F0 WRITDATA
260 SETHEX
0B0 C=N ALL
266 C=C-1 S&X
27A C=C-1 M
070 N=C ALL
03C RCR 3
106 A=C S&X
03C RCR 3
306 ?A<C S&X
31B JNC-29d
GOTO LOOP
266 C=C-1 S&X
270 RAMSLCT
038 READATA
2A0 SETDEC
266 C
266 =
266 C/1000
10E A=C ALL
046 C=0 S&X
270 RAMSLCT
04E C
35C =
050 1
01D C
060 A+C
028 T=C
3B5 ?NCGO
052 R^
( 60 words / SIZE 2n+1 )
STACK | INPUT | OUTPUT |
X | / | 1.nnn |
where 1.nnn is the control number of the sum or the difference
-The following focal program does the same job:
01 LBL "A+A"
02 CF 05 03 GTO 00 04 LBL "A-A" 05 SF 05 06 LBL 00 07 RCL 00 08 ENTER^ 09 ST+ Y 10 LBL 01 11 RCL IND Y 12 FS? 05 13 CHS 14 ST+ IND Y 15 RDN 16 DSE Y 17 DSE X 18 GTO 01 19 RCL 00 20 E3 21 / 22 ISG X 23 END |
-The sum - or the difference - is stored in registers R01 thru Rnn
1°) Multiplication ( General Case )
a) Program#1
-All these programs employ the Cayley-Dickinson formula recursively.
-The 1st version starts with complexes and may be used to compute the
product of two 64-ons:
-Unfortunately, there are not enough registers for 128-ons.
Data Registers: • R00 = n ( 2 , 4 , 8 , 16 , 32 or 64 ) ( Registers R00 thru R2n are to be initialized before executing "A*A" )
• R01 ...... • Rnn = the n components of
the 1st anion
• Rn+1 ...... • R2n = the n components of the 2nd anion
>>> When the program stops: R01 ...... Rnn = the n components of the product
-During the calculations,
R01-R02 = complex1 R05 to R08 = quaternion1
R13 to R20 = octonion1 R29 to R44 = sedenion1 R61 to R92 =
32-on1 R125 to R188 = 64-on1
R03-R04 = complex2 R09 to R12 = quaternion2
R21 to R28 = octonion2 R45 to R60 = sedenion2 R93 to R124 =
32-on2 R189 to R252 = 64-on2
Flags: /
Subroutines: /
01 LBL "A*A"
02 RCL 00 03 ST+ X 04 .1 05 % 06 + 07 3 08 - 09 E3 10 / 11 1 12 + 13 REGMOVE 14 XEQ 01 15 RCL 00 16 E3 17 / 18 ISG X 19 STO Y 20 E3 21 / 22 RCL 00 23 ST+ X 24 + 25 3 26 - 27 REGMOVE 28 X<>Y 29 RTN 30 LBL 01 31 2 32 ST/ 00 33 SIGN 34 RCL 00 35 X#Y? 36 GTO 02 37 RCL 01 38 RCL 03 39 * |
40 RCL 02
41 RCL 04 42 * 43 - 44 X<> 01 45 RCL 04 46 * 47 RCL 02 48 RCL 03 49 * 50 + 51 STO 02 52 RCL 00 53 ST+ 00 54 RTN 55 LBL 02 56 RCL 00 57 E3 58 / 59 RCL 00 60 ST+ X 61 + 62 STO Y 63 3 64 - 65 E3 66 / 67 RCL 00 68 4 69 * 70 + 71 3 72 - 73 REGMOVE 74 + 75 REGMOVE 76 XEQ 01 77 RCL 00 78 E3 |
79 /
80 RCL 00 81 4 82 * 83 + 84 3 85 - 86 E3 87 / 88 RCL 00 89 ST+ X 90 + 91 3 92 - 93 REGSWAP 94 RCL 00 95 E3 96 / 97 - 98 REGMOVE 99 LASTX 100 - 101 RCL 00 102 5 103 * 104 + 105 REGMOVE 106 XEQ 01 107 RCL 00 108 E3 109 / 110 RCL 00 111 7 112 * 113 + 114 3 115 - 116 E3 117 / |
118 RCL 00
119 ST+ X 120 + 121 3 122 - 123 REGSWAP 124 SIGN 125 CHS 126 ST* IND L 127 LASTX 128 RCL 00 129 2.996 130 * 131 + 132 REGMOVE 133 XEQ 01 134 RCL 00 135 3 136 * 137 4 138 - 139 RCL 00 140 ST+ X 141 LASTX 142 - 143 E3 144 / 145 + 146 RCL 00 147 5 148 * 149 4 150 - 151 STO Z 152 ISG Z 153 LBL 03 154 RCL IND Y 155 ST+ IND Y 156 RDN |
157 DSE X
158 DSE Y 159 GTO 03 160 X<> Z 161 RCL 00 162 E3 163 / 164 RCL 00 165 ST+ X 166 + 167 3 168 - 169 E3 170 / 171 + 172 REGMOVE 173 RCL 00 174 .1 175 % 176 + 177 + 178 REGMOVE 179 FRC 180 E3 181 * 182 SIGN 183 CHS 184 ST* IND L 185 XEQ 01 186 RCL 00 187 3 188 * 189 4 190 - 191 RCL 00 192 ST+ X 193 LASTX 194 - 195 E3 |
196 /
197 + 198 RCL 00 199 8 200 * 201 4 202 - 203 LBL 04 204 RCL IND Y 205 ST- IND Y 206 RDN 207 DSE X 208 DSE Y 209 GTO 04 210 RCL 00 211 E3 212 / 213 RCL 00 214 5 215 * 216 + 217 3 218 - 219 E3 220 / 221 RCL 00 222 7 223 * 224 + 225 3 226 - 227 REGMOVE 228 RCL 00 229 ST+ 00 230 RTN 231 END |
( 315 bytes / SIZE 4n-3 )
STACK | INPUT | OUTPUT |
X | / | 1.nnn |
where 1.nnn is the control number of the product.
Example: Product of 2 octonions. 8 STO 00
w = 2 + 4 e1
+ 5 e2 + 10 e3 + 3 e4 + 7 e5
+ 6 e6 + 9 e7
w' = 3 + 5 e1
+ 6 e2 + 2 e3 + 7 e4 + 4 e5
+ 9 e6 + 8 e7
2 STO 01
3 STO 05
3 STO 09 7
STO 13
4 STO 02
7 STO 06
5 STO 10 4
STO 14
5 STO 03
6 STO 07
6 STO 11 9
STO 15
10 STO 04
9 STO 08
2 STO 12 8
STO 16
XEQ "A*A" >>>> 1.008 ---Execution time = 52s---
-The result is in registers R01 thru R08
R01 = -239 , R02 = -32 , R03 = 74 , R04 = -45 , R05 = -29 , R06 = 134 , R07 = 14 , R08 = 79
whence w.w' = - 239 - 32 e1 + 74 e2 - 45 e3 - 29 e4 + 134 e5 + 14 e6 + 79 e7
Notes:
-To save execution time, add the synthetic instruction STO M after
line 09 and replace all the other E3 by RCL M
-This version may also be used to compute the product of 2 complexes,
but "A*A" will run faster
if we use "Q*Q" ( focal program or M-Code routine ) to calculate
the product of 2 quaternions:
b) Program#2
Data Registers: • R00 = n ( 4 , 8 , 16 , 32 or 64 ) ( Registers R00 thru R2n are to be initialized before executing "A*A" )
• R01 ...... • Rnn = the n components of
the 1st anion
• Rn+1 ...... • R2n = the n components of the 2nd anion
>>> When the program stops: R01 ...... Rnn = the n components of the product
-During the calculations,
R01 to R04 = quaternion1 R09 to
R16 = octonion1 R25 to R40 = sedenion1 R57 to R88 = 32-on1
R121 to R184 = 64-on1
R05 to R08 = quaternion2 R17 to
R24 = octonion2 R41 to R56 = sedenion2 R89 to R120 = 32-on2
R185 to R248 = 64-on2
Flags: /
Subroutine: The M-Code routine Q*Q
( cf "M-Code routines for quaternions ) line 36,
or the focal program "Q*Q" ( cf "Quaternions for the HP-41 )
01 LBL "A*A"
02 RCL 00 03 ST+ X 04 .1 05 % 06 + 07 7 08 - 09 E3 10 / 11 1 12 + 13 REGMOVE 14 XEQ 01 15 RCL 00 16 E3 17 / 18 ISG X 19 STO Y 20 E3 21 / 22 RCL 00 23 ST+ X 24 + 25 7 26 - 27 REGMOVE 28 X<>Y 29 RTN 30 LBL 01 31 2 32 ST/ 00 33 RCL 00 34 X#Y? 35 GTO 02 36 Q*Q 37 STO 01 |
38 RDN
39 STO 02 40 RDN 41 STO 03 42 X<>Y 43 STO 04 44 RCL 00 45 ST+ 00 46 RTN 47 LBL 02 48 RCL 00 49 E3 50 / 51 RCL 00 52 ST+ X 53 + 54 STO Y 55 7 56 - 57 E3 58 / 59 RCL 00 60 4 61 * 62 + 63 7 64 - 65 REGMOVE 66 + 67 REGMOVE 68 XEQ 01 69 RCL 00 70 E3 71 / 72 RCL 00 73 4 74 * |
75 +
76 7 77 - 78 E3 79 / 80 RCL 00 81 ST+ X 82 + 83 7 84 - 85 REGSWAP 86 RCL 00 87 E3 88 / 89 - 90 REGMOVE 91 LASTX 92 - 93 RCL 00 94 5 95 * 96 + 97 REGMOVE 98 XEQ 01 99 RCL 00 100 E3 101 / 102 RCL 00 103 7 104 * 105 + 106 7 107 - 108 E3 109 / 110 RCL 00 111 ST+ X |
112 +
113 7 114 - 115 REGSWAP 116 SIGN 117 CHS 118 ST* IND L 119 LASTX 120 RCL 00 121 2.996 122 * 123 + 124 REGMOVE 125 XEQ 01 126 RCL 00 127 3 128 * 129 8 130 - 131 RCL 00 132 ST+ X 133 LASTX 134 - 135 E3 136 / 137 + 138 RCL 00 139 5 140 * 141 8 142 - 143 STO Z 144 ISG Z 145 LBL 03 146 RCL IND Y 147 ST+ IND Y 148 RDN |
149 DSE X
150 DSE Y 151 GTO 03 152 X<> Z 153 RCL 00 154 E3 155 / 156 RCL 00 157 ST+ X 158 + 159 7 160 - 161 E3 162 / 163 + 164 REGMOVE 165 RCL 00 166 .1 167 % 168 + 169 + 170 REGMOVE 171 FRC 172 E3 173 * 174 SIGN 175 CHS 176 ST* IND L 177 XEQ 01 178 RCL 00 179 3 180 * 181 8 182 - 183 RCL 00 184 ST+ X 185 LASTX |
186 -
187 E3 188 / 189 + 190 RCL 00 191 8 192 ST* Y 193 - 194 LBL 04 195 RCL IND Y 196 ST- IND Y 197 RDN 198 DSE X 199 DSE Y 200 GTO 04 201 RCL 00 202 E3 203 / 204 RCL 00 205 5 206 * 207 + 208 7 209 - 210 E3 211 / 212 RCL 00 213 7 214 * 215 + 216 7 217 - 218 REGMOVE 219 RCL 00 220 ST+ 00 221 RTN 222 END |
( 307 bytes / SIZE 4n-7 )
STACK | INPUT | OUTPUT |
X | / | 1.nnn |
where 1.nnn is the control number of the product.
Example: Same product of 2 octonions. 8 STO 00
w = 2 + 4 e1
+ 5 e2 + 10 e3 + 3 e4 + 7 e5
+ 6 e6 + 9 e7
w' = 3 + 5 e1
+ 6 e2 + 2 e3 + 7 e4 + 4 e5
+ 9 e6 + 8 e7
2 STO 01
3 STO 05
3 STO 09 7
STO 13
4 STO 02
7 STO 06
5 STO 10 4
STO 14
5 STO 03
6 STO 07
6 STO 11 9
STO 15
10 STO 04
9 STO 08
2 STO 12 8
STO 16
XEQ "A*A" >>>> 1.008 ---Execution time = 16s---
-The result is in registers R01 thru R08
R01 = -239 , R02 = -32 , R03 = 74 , R04 = -45 , R05 = -29 , R06 = 134 , R07 = 14 , R08 = 79
whence w.w' = - 239 - 32 e1 + 74 e2 - 45 e3 - 29 e4 + 134 e5 + 14 e6 + 79 e7
Note:
-The M-Code routine Q*Q clears the alpha register.
-But if you use the focal program "Q*Q", add the synthetic instruction
STO O after line 09
and replace all the other E3 by RCL O: the
routine will run faster.
c) Program#3
-This 3rd version runs faster:
-The control numbers ( for REGMOVE and REGSWAP ) appears directly in
the listing.
Data Registers: • R00 = n ( 8 , 16 , 32 or 64 ) ( Registers R00 thru R2n are to be initialized before executing "A*A" )
• R01 ...... • Rnn = the n components of
the 1st anion
• Rn+1 ...... • R2n = the n components of the 2nd anion
>>> When the program stops: R01 ...... Rnn = the n components of the product
-During the calculations,
R01 to R04 = quaternion1 R09 to
R16 = octonion1 R25 to R40 = sedenion1 R57 to R88 = 32-on1
R121 to R184 = 64-on1
R05 to R08 = quaternion2 R17 to
R24 = octonion2 R41 to R56 = sedenion2 R89 to R120 = 32-on2
R185 to R248 = 64-on2
Flags: /
Subroutine: The M-Code routine Q*Q
( cf "M-Code routines for quaternions" )
or the focal program "Q*Q" ( cf "Quaternions for the HP-41" )
01 LBL "A*A"
02 RCL 00 03 ST+ X 04 .1 05 % 06 + 07 7 08 - 09 E3 10 / 11 1 12 + 13 REGMOVE 14 XEQ IND 00 15 RCL 00 16 E3 17 / 18 ISG X 19 STO Y 20 E3 21 / 22 RCL 00 23 ST+ X 24 + 25 7 26 - 27 REGMOVE 28 X<>Y 29 RTN 30 LBL 08 31 9.001004 32 REGMOVE 33 17.005004 34 REGMOVE 35 Q*Q 36 X<> 09 37 STO 05 |
38 RDN
39 X<> 10 40 STO 06 41 RDN 42 X<> 11 43 STO 07 44 X<>Y 45 X<> 12 46 STO 08 47 21.001004 48 REGMOVE 49 Q*Q 50 STO 21 51 RDN 52 STO 22 53 RDN 54 STO 23 55 X<>Y 56 STO 24 57 RCL 01 58 CHS 59 STO 01 60 13.005004 61 REGMOVE 62 Q*Q 63 ST+ 09 64 RDN 65 ST+ 10 66 RDN 67 ST+ 11 68 X<>Y 69 ST+ 12 70 13.001004 71 REGMOVE 72 17.005004 73 REGMOVE 74 RCL 05 |
75 CHS
76 STO 05 77 Q*Q 78 ST- 21 79 RDN 80 ST- 22 81 RDN 82 ST- 23 83 X<>Y 84 ST- 24 85 21.013004 86 REGMOVE 87 RTN 88 LBL 16 89 25.009008 90 REGMOVE 91 41.017008 92 REGMOVE 93 XEQ 08 94 9.025008 95 REGSWAP 96 9.017008 97 REGMOVE 98 49.009008 99 REGMOVE 100 XEQ 08 101 9.049008 102 REGSWAP 103 RCL 09 104 CHS 105 STO 09 106 33.017008 107 REGMOVE 108 XEQ 08 109 16.008 110 32 111 XEQ 00 |
112 33.009008
113 REGMOVE 114 41.017008 115 REGMOVE 116 SIGN 117 CHS 118 ST* 17 119 XEQ 08 120 16.008 121 56 122 XEQ 01 123 49.033008 124 REGMOVE 125 RTN 126 LBL 32 127 57.025016 128 REGMOVE 129 89.041016 130 REGMOVE 131 XEQ 16 132 25.057016 133 REGSWAP 134 25.041016 135 REGMOVE 136 105.025016 137 REGMOVE 138 XEQ 16 139 25.105016 140 REGSWAP 141 SIGN 142 CHS 143 ST* 25 144 73.041016 145 REGMOVE 146 XEQ 16 147 40.024 148 72 |
149 XEQ 00
150 73.025016 151 REGMOVE 152 89.041016 153 REGMOVE 154 SIGN 155 CHS 156 ST* 41 157 XEQ 16 158 40.024 159 120 160 XEQ 01 161 105.073016 162 REGMOVE 163 RTN 164 LBL 64 165 121.057032 166 REGMOVE 167 185.089032 168 REGMOVE 169 XEQ 32 170 57.121032 171 REGSWAP 172 57.089032 173 REGMOVE 174 217.057032 175 REGMOVE 176 XEQ 32 177 57.217032 178 REGSWAP 179 SIGN 180 CHS 181 ST* 57 182 153.089032 183 REGMOVE 184 XEQ 32 185 88.056 |
186 152
187 XEQ 00 188 153.057032 189 REGMOVE 190 185.089032 191 REGMOVE 192 SIGN 193 CHS 194 ST* 89 195 XEQ 32 196 88.056 197 248 198 XEQ 01 199 217.153032 200 REGMOVE 201 RTN 202 LBL 00 203 RCL IND Y 204 ST+ IND Y 205 RDN 206 DSE X 207 DSE Y 208 GTO 00 209 RTN 210 LBL 01 211 RCL IND Y 212 ST- IND Y 213 RDN 214 DSE X 215 DSE Y 216 GTO 01 217 RTN 218 END |
( 694 bytes / SIZE 4n-7 )
STACK | INPUT | OUTPUT |
X | / | 1.nnn |
where 1.nnn is the control number of the product.
Example: Again the same product of 2 octonions. 8 STO 00
w = 2 + 4 e1
+ 5 e2 + 10 e3 + 3 e4 + 7 e5
+ 6 e6 + 9 e7
w' = 3 + 5 e1
+ 6 e2 + 2 e3 + 7 e4 + 4 e5
+ 9 e6 + 8 e7
2 STO 01
3 STO 05
3 STO 09 7
STO 13
4 STO 02
7 STO 06
5 STO 10 4
STO 14
5 STO 03
6 STO 07
6 STO 11 9
STO 15
10 STO 04
9 STO 08
2 STO 12 8
STO 16
XEQ "A*A" >>>> 1.008 ---Execution time = 9s---
-The result is in registers R01 thru R08
R01 = -239 , R02 = -32 , R03 = 74 , R04 = -45 , R05 = -29 , R06 = 134 , R07 = 14 , R08 = 79
whence w.w' = - 239 - 32 e1 + 74 e2 - 45 e3 - 29 e4 + 134 e5 + 14 e6 + 79 e7
Note:
-Several bytes may be saved, for instance, line 96 may be replaced
by .008 -
-But the control numbers listed above are easier to understand.
2°) Miscellaneous Functions
-These programs compute elementary functions of an "anion":
• "1/A" inverse of an anion a # 0
A-1 = A* / | A |2 where A* is the conjugate of A and | A |2 = x02 + x12 + ................. + xN-12
• "E^A" exponential
exp( x0 + x1 e1 + .... + xN-1 eN-1 ) = ex0 [ cos µ + ( sin µ ). I ]
where µ = ( x12 + ............... + xN-12 )1/2 and I = ( x1 e1 + ............. + xN-1 eN-1 ) / µ
• "LNA" natural logarithm
Ln( x0 + x1 e1 + .................+ xN-1 eN-1 ) = Ln ( x02 + x12 + .................. + xN-12 )1/2 + Atan2(µ,x0). I
where µ = ( x12 + ............... + xN-12 )1/2 and I = ( x1 e1 + ............. + xN-1 eN-1 ) / µ
-If µ = 0 , I is replaced by e1
• "A^X" raising an anion to a real power A^X = exp ( X Ln A )
• "X^A" raising a real to an anionic power X^A = exp ( A Ln X )
• "SHA" hyperbolic sine
Sinh ( x0 + x1 e1 + .... + xN-1 eN-1 ) = Sinh x0 Cos µ + I ( Cosh x0 ) ( Sin µ )
where µ = ( x12 + ............... + xN-12 )1/2 and I = ( x1 e1 + ............. + xN-1 eN-1 ) / µ
• "CHA" hyperbolic cosine
Cosh ( x0 + x1 e1 + .... + xN-1 eN-1 ) = Cosh x0 Cos µ + I ( Sinh x0 ) ( Sin µ )
where µ = ( x12 + ............... + xN-12 )1/2 and I = ( x1 e1 + ............. + xN-1 eN-1 ) / µ
• "THA" hyperbolic tangent
Tanh a = ( Sinh a ) ( Cosh a ) -1
• "ASHA" arc sinh a = Ln [ a + ( a2 + 1 )1/2 ]
• "ACHA" arc cosh a = Ln [ a + ( a2 - 1 )1/2 ]
• "ATHA" arc tanh a = 1/2) [ Ln ( 1 + a ) - Ln ( 1 - a ) ]
• "SINA" sine
Sin ( x0 + x1 e1 + .... + xN-1 eN-1 ) = Sin x0 Cosh µ + I ( Cos x0 ) ( Sinh µ )
where µ = ( x12 + ............... + xN-12 )1/2 and I = ( x1 e1 + ............. + xN-1 eN-1 ) / µ
• "COSA" cosine
Cos ( x0 + x1 e1 + .... + xN-1 eN-1 ) = Cos x0 Cosh µ - I ( Sin x0 ) ( Sinh µ )
where µ = ( x12 + ............... + xN-12 )1/2 and I = ( x1 e1 + ............. + xN-1 eN-1 ) / µ
• "TANA" Tan a = ( Sin a ) ( Cos a ) -1
• "ASINA" arc sin a
If a = x0 + x1 e1 + .... + xN-1 eN-1 , Arc Sin a = - I Arc Sinh ( a I )
where µ = ( x12 + ............... + xN-12 )1/2 and I = ( x1 e1 + ............. + xN-1 eN-1 ) / µ
• "ACOSA" arc cos a = PI/2 - ArcSin
a
• "ATANA" arc tan a
If a = x0 + x1 e1 + .... + xN-1 eN-1 , Arc Tan a = - I Arc Tanh ( a I )
where µ = ( x12 + ............... + xN-12 )1/2 and I = ( x1 e1 + ............. + xN-1 eN-1 ) / µ
Remark:
-I've used arc cosh a = Ln [ a + ( a2 - 1 )1/2 ]
instead of the standard definition Arc Cosh a = Ln [ a + ( a + 1 )1/2 ( a - 1 )1/2 ]
-So, "ACHA" may give a result that requires a sign change to get the
principal value of Arc Cosh a.
-See the notes below if you prefer the standard definition.
Data Registers: • R00 = n ( 2 , 4 , 8 , .... , 128 or 256 ) ( Registers R00 thru Rnn are to be initialized before executing these programs )
• R01 ...... • Rnn = the n components of the anion
( In some cases, Rn+1 .......... R2n are used for temporary data storage )
>>> When the program stops: R01
...... Rnn = the n components of the result
Flags: F01 & F02 ( not always )
Subroutines: /
-Lines 16-26-159-199-216-256-400 are three-byte GTO's
-However, these instructions are executed only once, so they could
be replaced by two-byte GTO's to save a few bytes.
01 LBL "1/A"
02 XEQ 14 03 LASTX 04 RCL 01 05 X^2 06 + 07 CHS 08 RCL 00 09 X<>Y 10 LBL 07 11 ST/ IND Y 12 DSE Y 13 GTO 07 14 SIGN 15 ST* 01 16 GTO 01 17 LBL "ACOSA" 18 XEQ 04 19 RCL 00 20 PI 21 2 22 / 23 ST- 01 24 SIGN 25 CHS 26 GTO 03 27 LBL 04 28 LBL "ASINA" 29 CF 01 30 GTO 04 31 LBL "ATANA" 32 SF 01 33 LBL 04 34 RCL 01 35 X#0? 36 GTO 04 37 XEQ 14 38 FC? 01 39 GTO 17 40 1 41 X<>Y 42 CF 02 43 X>Y? 44 SF 02 45 STO Z 46 X>Y? 47 1/X 48 ENTER 49 ST+ X 50 X<> Z 51 - 52 CHS 53 / 54 LN1+X 55 2 56 / 57 R^ 58 X=0? 59 SIGN 60 / 61 XEQ 18 62 PI 63 2 64 / 65 FC?C 02 66 CLX 67 STO 01 68 GTO 01 69 LBL 17 70 ENTER 71 ENTER 72 X^2 73 1 74 + 75 SQRT 76 + 77 LN 78 X<>Y 79 X=0? |
80 SIGN
81 / 82 XEQ 18 83 GTO 01 84 LBL 04 85 XEQ 14 86 CHS 87 X#0? 88 GTO 04 89 SIGN 90 STO 02 91 CLX 92 LBL 04 93 X<> 01 94 RCL 00 95 E-3 96 + 97 CLA 98 LBL 00 99 RCL N 100 ABS 101 RCL IND Y 102 ABS 103 X<Y? 104 GTO 00 105 X<> Z 106 STO O 107 X<> Z 108 CLX 109 LASTX 110 STO N 111 LBL 00 112 RDN 113 X<> L 114 RCL Z 115 * 116 RCL 01 117 CHS 118 X=0? 119 SIGN 120 / 121 STO IND Y 122 RDN 123 DSE X 124 GTO 00 125 FC? 01 126 XEQ 15 127 FS? 01 128 XEQ 16 129 XEQ 14 130 X#0? 131 GTO 04 132 SIGN 133 STO 02 134 CLX 135 LBL 04 136 RCL IND O 137 RCL N 138 * 139 SIGN 140 * 141 X<> 01 142 CHS 143 RCL 00 144 E-3 145 + 146 LBL 11 147 RCL IND X 148 RCL Z 149 * 150 RCL 01 151 X=0? 152 SIGN 153 / 154 STO IND Y 155 RDN 156 DSE X 157 GTO 11 158 CLA |
159 GTO 01
160 LBL 12 161 LBL "A^X" 162 XEQ 14 163 R^ 164 X<>Y 165 LASTX 166 RCL 01 167 X^2 168 + 169 X<>Y 170 PI 171 INT 172 CHS 173 10^X 174 SIGN 175 CLX 176 RCL 00 177 ST+ L 178 RDN 179 LBL 09 180 X#0? 181 ST/ IND L 182 DSE L 183 GTO 09 184 X#0? 185 GTO 04 186 SIGN 187 STO 02 188 CLX 189 LBL 04 190 RCL 01 191 R-P 192 R^ 193 ST* Z 194 Y^X 195 P-R 196 STO 01 197 CLX 198 SIGN 199 GTO 02 200 LBL "X^A" 201 LN 202 RCL 00 203 X<>Y 204 XEQ 03 205 LBL "E^A" 206 XEQ 14 207 ENTER 208 R-D 209 RCL 01 210 E^X 211 P-R 212 STO 01 213 X<> Z 214 X=0? 215 SIGN 216 GTO 02 217 LBL "SINA" 218 CF 01 219 GTO 04 220 LBL "COSA" 221 SF 01 222 LBL 04 223 XEQ 14 224 ENTER 225 E^X 226 LASTX 227 CHS 228 E^X 229 + 230 2 231 / 232 RCL 01 233 R-D 234 1 235 P-R 236 FS? 01 237 X<>Y |
238 RDN
239 * 240 STO 01 241 RDN 242 STO Z 243 E^X-1 244 LASTX 245 CHS 246 E^X-1 247 - 248 2 249 / 250 * 251 FS? 01 252 CHS 253 X<>Y 254 X=0? 255 SIGN 256 GTO 02 257 LBL "SHA" 258 CF 01 259 GTO 04 260 LBL "CHA" 261 SF 01 262 LBL 04 263 XEQ 14 264 X<> 01 265 ENTER 266 E^X 267 LASTX 268 CHS 269 E^X 270 + 271 X<>Y 272 E^X-1 273 LASTX 274 CHS 275 E^X-1 276 - 277 2 278 ST/ Z 279 / 280 FS? 01 281 X<>Y 282 RCL 01 283 R-D 284 1 285 P-R 286 X<>Y 287 ST* T 288 RDN 289 * 290 X<> 01 291 X=0? 292 SIGN 293 GTO 02 294 LBL 15 295 LBL "ASHA" 296 CF 01 297 GTO 04 298 LBL "ACHA" 299 SF 01 300 LBL 04 301 CF 02 302 RCL 01 303 X=0? 304 SF 02 305 XEQ 14 306 FS? 02 307 STO M 308 XEQ 06 309 2 310 XEQ 12 311 1 312 FS? 01 313 CHS 314 ST+ 01 315 .5 316 XEQ 12 |
317 RCL 01
318 FS?C 02 319 X#0? 320 GTO 04 321 RCL 02 322 RCL 00 323 E3 324 / 325 ISG X 326 STO Z 327 LASTX 328 / 329 1 330 + 331 RCL 00 332 + 333 REGMOVE 334 CLX 335 X<> M 336 R^ 337 SIGN 338 ST+ L 339 LBL 20 340 CLX 341 RCL IND L 342 X#0? 343 GTO 21 344 ISG L 345 GTO 20 346 LBL 21 347 SIGN 348 FC? 01 349 ST* Z 350 RDN 351 ST+ Y 352 X=0? 353 SIGN 354 / 355 XEQ 18 356 GTO 13 357 LBL 04 358 RCL 00 359 ENTER 360 ST+ Y 361 LBL 08 362 RCL IND Y 363 ST+ IND Y 364 RDN 365 DSE Y 366 DSE X 367 GTO 08 368 LBL 13 369 LBL "LNA" 370 XEQ 14 371 STO Y 372 LASTX 373 RCL 01 374 X^2 375 + 376 SQRT 377 LN 378 X<> 01 379 R-P 380 RDN 381 D-R 382 X<>Y 383 X#0? 384 GTO 02 385 SIGN 386 STO 02 387 LBL 02 388 / 389 RCL 00 390 PI 391 INT 392 CHS 393 10^X 394 + 395 X<>Y |
396 LBL 03
397 ST* IND Y 398 DSE Y 399 GTO 03 400 GTO 01 401 LBL "TANA" 402 XEQ 14 403 X<> 01 404 R-D 405 1 406 P-R 407 ST* Y 408 X^2 409 RCL 01 410 E^X-1 411 LASTX 412 CHS 413 E^X-1 414 - 415 2 416 / 417 STO T 418 X^2 419 + 420 ST/ Z 421 / 422 X<> 01 423 STO Z 424 E^X 425 LASTX 426 CHS 427 E^X 428 + 429 2 430 / 431 * 432 X<>Y 433 X=0? 434 SIGN 435 GTO 02 436 LBL "THA" 437 XEQ 14 438 RCL 01 439 E^X 440 LASTX 441 CHS 442 E^X 443 + 444 RCL 01 445 E^X-1 446 LASTX 447 CHS 448 E^X-1 449 - 450 2 451 ST/ Z 452 / 453 ST* Y 454 X^2 455 RCL Z 456 R-D 457 COS 458 STO 01 459 X^2 460 + 461 STO T 462 / 463 X<> 01 464 RCL Y 465 R-D 466 SIN 467 * 468 X<>Y 469 X=0? 470 SIGN 471 / 472 X<>Y 473 GTO 02 474 LBL 14 |
475 DEG
476 RCL 00 477 PI 478 INT 479 CHS 480 10^X 481 ST+ Y 482 CLX 483 LBL 05 484 RCL IND Y 485 X^2 486 + 487 DSE Y 488 GTO 05 489 SQRT 490 RTN 491 LBL 06 492 RCL 00 493 .1 494 % 495 ISG X 496 + 497 E3 498 / 499 1 500 + 501 REGMOVE 502 RTN 503 LBL 18 504 RCL 00 505 X<>Y 506 LBL 19 507 ST* IND Y 508 DSE Y 509 GTO 19 510 RTN 511 LBL 16 512 LBL "ATHA" 513 XEQ 06 514 STO M 515 SIGN 516 ST- 01 517 RCL 00 518 X<>Y 519 ST+ Y 520 ST+ IND Y 521 RCL 00 522 X<>Y 523 CHS 524 XEQ 03 525 XEQ 13 526 CLX 527 X<> M 528 REGSWAP 529 XEQ 13 530 RCL 00 531 ENTER 532 ST+ Y 533 LBL 10 534 RCL IND X 535 RCL IND Z 536 - 537 2 538 / 539 STO IND Y 540 RDN 541 DSE Y 542 DSE X 543 GTO 10 544 LBL 01 545 RCL 00 546 PI 547 INT 548 10^X 549 / 550 ISG X 551 END |
( 893 bytes / SIZE n+1 or 2n+1 )
STACK | INPUT | OUTPUT |
X | / or x | 1.nnn |
X-input x is required for "A^X" & "X^A" only and 1.nnn is the control number of the result.
Example: You can use the examples given in "Octonions for the HP-41" or "Sedenions for the HP-41"
-The instructions are identical except that here, R00 = n.
-So, for raising an anion to a real power x, x must be in X-register instead of R00:
w = 1 + 0.9 e1 + 0.8 e2 + 0.7 e3 + 0.6 e4 + 0.5 e5 + 0.4 e6 + 0.3 e7 and x = PI
8 STO 00 ( octonion )
1 STO 01
0.6 STO 05
0.9 STO 02
0.5 STO 06
0.8 STO 03
0.4 STO 07
0.7 STO 04
0.3 STO 08
PI XEQ "A^X" >>>> 1.008 ---Execution time = 7s---
-The components of wx are stored in R01 thru R08
R01 = -8.100378663 R02 = -0.441313112
R03 = -0.392278322 R04 = -0.343243532
R05 = -0.294208741 R06 = -0.245173951
R07 = -0.196139161 R08 = -0.147104371
-So, wPI = -8.100378663
- 0.441313112 e1 - 0.392278322 e2
- 0.343243532 e3
- 0.294208741 e4 - 0.245173951 e5 -
0.196139161 e6 - 0.147104371 e7
Notes:
-These programs may be used with complexes, quaternions, octonions,
sedenions, 32-ons, 64-ons, 128-ons,
and even 256-ons for "1/A" , "A^X" , "X^A" , "E^A" , "LNA"
, "SHA" , "CHA" , "THA" , "SINA" , "COSA" , "TANA"
-I've sometimes used PI INT CHS 10^X
instead of E-3 to keep the content of synthetic register P
-This is useful when "A^X" is called as a subroutine by special functions
like the hypergeometric functions.
-If possible, line 143 should be an M-Code routine Y^X to get 0^0 = 1
-The routines do not check that n is an integer power of 2.
-The standard definition of Arc Cosh a = = Ln [ a + ( a + 1 )1/2
( a - 1 )1/2 ] is applied by the following routine:
01 LBL "ACHA"
02 RCL 00 03 .1 04 % 05 STO Z 06 + 07 1 08 + 09 STO Z |
10 E3
11 / 12 1 13 + 14 STO M 15 REGMOVE 16 + 17 REGMOVE 18 SIGN |
19 ST+ 01
20 ST- IND Y 21 .5 22 XEQ "A^X" 23 0 24 X<> M 25 REGSWAP 26 .5 27 XEQ "A^X" |
28 XEQ "A*A1"
29 RCL 00 30 3 31 * 32 RCL 00 33 LBL 01 34 RCL IND Y 35 ST+ IND Y 36 RDN |
37 DSE Y
38 DSE X 39 GTO 01 40 XEQ "LNA" 41 END |
( 85 bytes / SIZE 3n+1 )
-However, since the SIZE = 3n+1, this variant cannot compute the
Arc Cosh of a 128-on !
-This routine may of course be inserted in the programs above to save
bytes ( replace LBL 01 by another unused LBL )
Other elementary functions
-The "self-power function" is defined unambiguously by a^a
= exp ( ( Ln a ) a )
01 LBL "A^A0"
02 RCL 00 03 .1 04 % 05 ISG X 06 + 07 E3 08 / 09 1 10 + 11 REGMOVE 12 XEQ "LNA" 13 XEQ "A*A1" 14 XEQ "E^A" 15 END |
( 41 bytes / SIZE 2n+1 )
-The more general function a^b may be defined in several
ways.
-If you define it by a^b = exp ( ( Ln a ) b ) ,
>>> simply replace line 13 above by XEQ "A*A" - where "A*A" is listed in §1°)a) above - and delete lines 02 to 11
-The square of an anion may be computed with "A*A1"
-The short routine "A^2" hereunder will be faster and, since it uses
only n+1 registers, it can compute the square of a 256-on !
01 LBL "A^2"
02 RCL 00 03 E-3 04 + 05 RCL 01 06 X^2 07 LBL 01 08 RCL IND Y 09 X^2 10 - 11 RCL 01 12 ST+ X 13 ST* IND Z 14 RDN 15 DSE Y 16 GTO 01 17 STO 01 18 RCL 00 19 E3 20 / 21 ISG X 22 END |
( 39 bytes / SIZE n+1 )
STACK | INPUT | OUTPUT |
X | / | 1.nnn |
Example:
a = 4 + 5 i + 6 j + 7 k
( quaternion -> 4 STO 00 )
4 STO 01
5 STO 02
6 STO 03
7 STO 04 XEQ "A^2"
>>>> 1.004
---Execution time = 1.5s---
R01 = -94
R02 = 40
R03 = 48
R04 = 56
-Thus, ( 4 + 5 i + 6 j + 7 k )2 = - 94 + 40 i + 48 j + 56 k
Notes:
-If n = 64 , execution time = 24 seconds
-"A^X" may also be used with X = 2, but with slightly less
accurate results.
Gudermannian Function
Formulae: Gd(a) = 2 ArcTan [ Tanh (a/2) ] and its inverse: Agd(a) = 2 ArcTanh [ Tan(a/2) ]
( "ST*A" & "ST/A" are listed in "Anionic Special Functions(I)
for the HP-41" )
01 LBL "GDA"
02 2 03 XEQ "ST/A" 04 XEQ "THA" 05 XEQ "ATANA" 06 2 07 XEQ "ST*A" 08 X<>Y 09 RTN 10 LBL "AGDA" 11 2 12 XEQ "ST/A" 13 XEQ "TANA" 14 XEQ "ATHA" 15 2 16 XEQ "ST*A" 17 X<>Y 18 END |
( 73 bytes / SIZE 2n+1 )
STACK | INPUT | OUTPUT |
X | / | 1.nnn |
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 "GDA"
>>>> 1.004
---Execution time = 15s---
R01 = 1.083236673
R02 = -0.207409846
R03 = -0.311114768
R04 = -0.414819691
-So, Gd( 1 + 2 i + 3 j + 4 k ) = 1.083236673 - 0.207409846 i - 0.311114768 j - 0.414819691 k
-Likewise, you'll find: Agd( 1 + 2 i + 3 j + 4 k ) = 0.007714740 + 0.581539372 i + 0.872309058 j + 1.163078744 k ( in 10 seconds )
Note:
-Of course, this list of functions is not exhaustive...
3°) Anionic Polynomials - Real Coefficients
APVAL evaluates p(a) = cm am
+ cm-1 am-1 + ................ + c1 a
+ c0 for a given anion a and
(m+1) real numbers cm , .............. , c1
, c0
-Store the anion a in registers R01 trhu Rnn as usual, and
the coefficients of the polynomial in Rbb thru Ree with
bb > 2n
Data Registers: • R00 = n > 1 ( Registers R00 thru Rnn & Rbb thru Ree are to be initialized before executing "APVAL" )
• R01 ...... • Rnn = a
Rn+1 ........ R2n = a ( a is saved in Rn+1 thru
R2n )
• Rbb = cm , • Rb+1 = cm-1 , ................. , • Ree = c0
>>> When the program stops: R01 ...... Rnn = the n components of p(a)
Flags: /
Subroutine: "ST*A"
( cf paragraph 0 above )
"A*A1" ( cf "Anionic Functions(I) for the HP-41" )
01 LBL "APVAL"
02 STO M 03 RCL 00 04 .1 05 % 06 ISG X 07 + 08 E3 09 / 10 1 11 + 12 REGMOVE 13 CLX 14 XEQ "ST*A" 15 LBL 01 16 XEQ "A*A1" 17 RCL IND M 18 ST+ 01 19 ISG M 20 GTO 01 21 CLX 22 X<> M 23 RCL 00 24 E3 25 / 26 ISG X 27 END |
( 59 bytes )
STACK | INPUT | OUTPUT |
X | bbb.eee | 1.nnn |
where bbb.eee is the control number of the polynomial ( bbb > 2n )
Example: a = 1 + 2 i + 3 j + 4 k ( quaternion -> 4 STO 00 ) p(a) = 6 a5 + 2 a4 + 3 a3 + 7 a2 + 4 a + 1
1 STO 01
and if you choose bb = 9 6
STO 09 7 STO
12 control number
9.014
2 STO 02
2 STO 10 4
STO 13
3 STO 03
3 STO 11 1
STO 14
4 STO 04
9.014 XEQ "APVAL" >>>> 1.004 ( in 4 seconds with the M-Code routine A*A1 )
R01 = 24383
R02 = 6104
R03 = 9156
R04 = 12208
-Whence,
p(a) = 24383 + 8104 i + 9156 j + 12208 k
4°) Anionic Equations
-The following program uses the iterative method also used for quaternionic ( or octonionic or sedenionic ) equations:
-The equation must be rewritten in the form: f ( a
) = a
and if f satisfies a Lipschitz condition
| f(a) - f(a') | < h | a - a' | with h <
1 , provided a and a' are close to a solution,
then the sequence an+1 = f ( an
) converges to a root.
Data Registers: • R00 = n ( 2 , 4 , 8 , .... ) ( Registers R00 thru Rnn are to be initialized before executing "AEQ" )
• R01 to Rnn = the n components of the anion a R2n+1 to R3n: temp , R3n+1 = fname
Rnn+1 to R2n may be used by the subroutine.
>>>> When the program stops, R01 to Rnn = the n components of a solution a
Flags: /
Subroutine: A program that takes the anion
a in R01 thru Rnn , calculates and stores f ( a )
in R01 thru Rnn
without disturbing R2n+1 to R3n+1
01 LBL "AEQ"
02 RCL 00 03 3 04 * 05 1 06 + 07 ASTO IND X 08 LBL 01 09 VIEW 01 10 RCL 00 11 E3 |
12 /
13 ISG X 14 RCL 00 15 ST+ X 16 + 17 E3 18 / 19 1 20 + 21 REGMOVE 22 SIGN |
23 RCL 00
24 3 25 * 26 + 27 RCL IND X 28 XEQ IND X 29 3 30 RCL 00 31 ST* Y 32 0 33 LBL 02 |
34 RCL IND Y
35 ST- IND T 36 CLX 37 RCL IND T 38 ABS 39 + 40 DSE Z 41 DSE Y 42 GTO 02 43 X#0? 44 GTO 01 |
45 RCL 00
46 3 47 * 48 1 49 + 50 ARCL IND X 51 RCL 00 52 E3 53 / 54 ISG X 55 END |
( 83 bytes / SIZE
3n+2 )
STACK | INPUTS | OUTPUTS |
Alpha | f name | f name |
X | / | 1.nnn |
where 1.nnn = control number of the solution
Example: Find a solution of the octonionic equation w2 - Ln w + 1 + 0.9 e1 + 0.8 e2 + 0.7 e3 + 0.6 e4 + 0.5 e5 + 0.4 e6 + 0.3 e7 = 0
near 1 + e1 + e2 + e3
+ e4 + e5 + e6 + e7
-First, we re-write this equation: w = ( Ln w - 1 - 0.9 e1 - 0.8 e2 - 0.7 e3 - 0.6 e4 - 0.5 e5 - 0.4 e6 - 0.3 e7 ) 1/2 = f ( w )
-The short routine "T" hereunder computes f (
w
)
-Note that here, the exponent 1/2 must be in X-register before calling
"A^X"
01 LBL "T"
02 XEQ "LNA" 03 1 04 ST- 01 05 .9 06 ST- 02 07 .8 08 ST- 03 09 .7 10 ST- 04 11 .6 12 ST- 05 13 .4 14 ST- 07 15 .3 16 ST- 08 17 .5 18 ST- 06 19 XEQ "A^X" 20 RTN 21 END |
-Then, n = 8 ASTO 00
-Initial approximation: 1 STO 01 STO 02 STO 03 STO 04 STO 05 STO 06 STO 07 STO 08
-Place the subroutine name in the alpha register: alpha "T" alpha
XEQ "AEQ" >>>> the successive approximations of the real part of the solution are displayed, and eventually, we get:
X = 1.008 = control number of the solution.
R01
= 1.022547760 , R02 = -0.673000418 , R03
= -0.598222594 , R04 = -0.523444770
R05 = -0.448666946 , R06 = -0.373889122
, R07 = -0.299111297 , R08 = -0.224333473
-Whence:
w
= 1.022547760 - 0.673000418 e1 - 0.598222594
e2 - 0.523444770 e3
- 0.448666946 e4 - 0.373889122 e5 -
0.299111297 e6 - 0.224333473 e7
is a solution of this equation.
Notes:
-The convergence is very slow.
-If f doesn't satisfy the required Lipschitz condition or if
we choose a bad initial guess, the algorithm may be divergent.
-Rewriting the equation in a proper form is often very difficult.
-Instead of displaying the real parts of the successive approximations,
you could display the difference between 2 successive approximations:
-Add VIEW X after line 42 and delete line 09 VIEW
01
-If the algorithm converges, these differences tend to 0.
-The termination criterion X#0? ( line 43 ) may lead to an infinite
loop.
-Line 43 may be replaced by
E-8 ( or
another "small" number )
X<Y?
Remark:
-In this example, registers Rn+1 to R2n are actually unused.
-In similar cases, the "AEQ'" listing may be modified as follows:
Replace lines 03-24-29-46 by 2 ( instead of 3 )
And delete line 15 ( ST+ X )
-SIZE 2n+2 becomes sufficient.