Determinants for the HP-41
Overview
1°) Determinants of order 3
2°) Determinants of order 4
3°) Determinants of order 5 ( X-Functions
Module required )
4°) Determinants of order n ( n < 18
)
a) Program#1
b) Program#2
-Determinants of order n may be computed by the programs "LS" or "LS2"
which are listed in "Linear and non-linear systems for the HP-41"
-However, all the following programs are faster and give more accurate results.
( For n = 2 , writing a subroutine like LBL "D2" RCL
01 RCL 04 * RCL 02 RCL 03 * - END
would be probably wasteful )
1°) Deteminants of order 3
Data Registers: R00 = unused ( Registers R01 thru R09 are to be initialized before executing "D3" )
• R01 = a11 • R04 = a12
• R07 = a13
• R02 = a21 • R05 = a22
• R08 = a23
• R03 = a31 • R06 = a32
• R09 = a33
Flags: /
Subroutines: /
01 LBL "D3" 02 RCL 05 03 RCL 09 04 * 05 RCL 06 06 RCL 08 07 * |
08 - 09 RCL 01 10 * 11 RCL 02 12 RCL 09 13 * 14 RCL 03 |
15 RCL 08 16 * 17 - 18 RCL 04 19 * 20 - 21 RCL 02 |
22 RCL 06 23 * 24 RCL 03 25 RCL 05 26 * 27 - 28 RCL 07 |
29 * 30 + 31 END |
( 38 bytes / SIZE 010 )
STACK | INPUT | OUTPUT |
X | / | Deteminant |
Example: Calculate
|
4 9 2 | Store these
R01 R04 R07
D = | 3 5 7 |
9 numbers R02 R05 R08
respectively
|
8 1 6 |
into R03
R06 R09
and XEQ "D3" >>>> Det
= 360 ( in 1 second )
2°) Deteminants of order 4
-Determinants of order 4 are computed by a sum of products of determinants
of order 2.
Data Registers: R00 = determinant at the end ( Registers R01 thru R16 are to be initialized before executing "D4" )
• R01 = a11 • R05 = a12
• R09 = a13 • R13 = a14
• R02 = a21 • R06 = a22
• R10 = a23 • R14 = a24
• R03 = a31 • R07 = a32
• R11 = a33 • R15 = a34
• R04 = a41 • R08 = a42
• R12 = a43 • R16 = a44
Flags: /
Subroutines: /
01 LBL "D4" 02 RCL 02 03 RCL 07 04 * 05 RCL 03 06 RCL 06 07 * 08 - 09 RCL 09 10 RCL 16 11 * 12 RCL 12 13 RCL 13 14 * 15 - 16 * 17 STO 00 18 RCL 01 19 RCL 07 20 * |
21 RCL 03 22 RCL 05 23 * 24 - 25 RCL 10 26 RCL 16 27 * 28 RCL 12 29 RCL 14 30 * 31 - 32 * 33 ST- 00 34 RCL 01 35 RCL 06 36 * 37 RCL 02 38 RCL 05 39 * 40 - |
41 RCL 11 42 RCL 16 43 * 44 RCL 12 45 RCL 15 46 * 47 - 48 * 49 ST+ 00 50 RCL 01 51 RCL 08 52 * 53 RCL 04 54 RCL 05 55 * 56 - 57 RCL 10 58 RCL 15 59 * 60 RCL 11 |
61 RCL 14 62 * 63 - 64 * 65 ST+ 00 66 RCL 02 67 RCL 08 68 * 69 RCL 04 70 RCL 06 71 * 72 - 73 RCL 09 74 RCL 15 75 * 76 RCL 11 77 RCL 13 78 * 79 - 80 * |
81 ST- 00 82 RCL 03 83 RCL 08 84 * 85 RCL 04 86 RCL 07 87 * 88 - 89 RCL 09 90 RCL 14 91 * 92 RCL 10 93 RCL 13 94 * 95 - 96 * 97 ST+ 00 98 RCL 00 99 END |
( 114 bytes / SIZE 017 )
STACK | INPUT | OUTPUT |
X | / | Deteminant |
Example: Calculate
|
1 8 13 12 |
Store these R01
R05 R09 R13
D = | 14 11 2
7 | 16 numbers
R02 R06 R10 R14
respectively
|
4 5 16 9 |
into
R03 R07 R11 R15
| 15
10 3 6 |
R04 R08 R12 R16
XEQ "D4" >>>> Det = 0
( in 3 seconds )
3°) Deteminants of order 5
-Determinants of order 5 are computed by a sum of products of determinants
of order 2 by determinants of order 3.
-Registers R00 to R25 are temporarily disturbed during the calculations, but
their contents are finally restored.
Data Registers: R00 = det A at the end ( Registers R01 thru R25 are to be initialized before executing "D5" )
• R01 = a11 • R06 = a12
• R11 = a13 • R16 = a14
• R21 = a15
• R02 = a21 • R07 = a22
• R12 = a23 • R17 = a24
• R22 = a25
• R03 = a31 • R08 = a32
• R13 = a33 • R18 = a34
• R23 = a35
• R04 = a41 • R09 = a42
• R14 = a43 • R19 = a44
• R24 = a45
• R05 = a51 • R10 = a52
• R15 = a53 • R20 = a54
• R25 = a55
Flags: /
Subroutines: /
01 LBL "D5" 02 10.005 03 XEQ 01 04 CHS 05 STO 00 06 5.005 07 XEQ 01 08 ST+ 00 09 5 10 XEQ 01 11 ST- 00 12 CLX 13 XEQ 01 14 ST+ 00 15 .005 |
16 XEQ 01 17 ST- 00 18 5.005 19 XEQ 01 20 ST+ 00 21 10.005 22 XEQ 01 23 ST- 00 24 CLX 25 XEQ 01 26 ST+ 00 27 5 28 XEQ 01 29 ST- 00 30 10 |
31 XEQ 01 32 ST+ 00 33 RCL 00 34 RTN 35 LBL 01 36 1.016005 37 + 38 REGSWAP 39 RCL 07 40 RCL 13 41 * 42 RCL 08 43 RCL 12 44 * 45 - |
46 RCL 01 47 * 48 RCL 06 49 RCL 13 50 * 51 RCL 08 52 RCL 11 53 * 54 - 55 RCL 02 56 * 57 - 58 RCL 06 59 RCL 12 60 * |
61 RCL 07 62 RCL 11 63 * 64 - 65 RCL 03 66 * 67 + 68 RCL 19 69 RCL 25 70 * 71 RCL 20 72 RCL 24 73 * 74 - 75 * 76 END |
( 146 bytes / SIZE 026 )
STACK | INPUT | OUTPUT |
X | / | Deteminant |
Example: Calculate
|
1 7 13 19 25 |
R01 R06 R11 R16 R21
| 14
20 21 2 8 |
R02 R07 R12 R17 R22
D = | 22 3 9
15 16 |
= R03 R08
R13 R18 R23 respectively
| 10
11 17 23 4 |
R04 R09 R14 R19 R24
| 18
24 5 6 12 |
R05 R10 R15 R20 R25
XEQ "D5" >>>> Det = -4680000
( in 19 seconds )
Notes:
-When these first 3 programs stop, registers R01 thru Rn2 are
unchanged.
-All the examples are determinants of magic squares.
( those of "D4" & "D5" are panmagic squares )
4°) Deteminants of order n ( n < 18 )
a) Program#1
-This program tries to triangularize the matrix A by Gaussian elimination.
-The following listing is very similar to "LS2" ( cf "Linear and non-linear
Systems for the HP-41" )
-When a pivot equals zero, 0 is stored in register R00 and the algorithm stops.
Data Registers: R00 = det A at the end ( Registers R01 thru Rn2 are to be initialized before executing "DET" )
• R01 = a11 • Rn+1 = a12
..................... • Rn2-n+1 = a1n
• R02 = a21 • Rn+2 = a22
..................... • Rn2-n+2 = a2n
........................................................................................
• Rnn = an1 • R2n = an2 ..................... • Rn2 = ann
Flags: CF 00 = a pivot p is regarded
as zero if | p | < 10-7 ( line 60 )
CF 01 = partial pivoting
SF 00 = ---------------------------- if p = 0
SF 01 = no pivoting
Subroutines: /
-Line 60, E-7 may be replaced by another "small" number to identify
the "tiny" elements
-Delete lines 82 to 84 if you want to zero the sub-diagonal elements.
-Line 103 is a three-byte GTO 01
01 LBL "DET" 02 STO Y 03 .1 04 % 05 + 06 STO N 07 FRC 08 STO O 09 * 10 1 11 STO 00 12 ST+ O 13 LASTX 14 % 15 + 16 + 17 LBL 01 18 STO M 19 FS? 01 20 GTO 04 21 INT 22 RCL O |
23 FRC 24 + 25 ENTER^ 26 ENTER^ 27 CLX 28 LBL 02 29 RCL IND Z 30 ABS 31 X>Y? 32 STO Z 33 X>Y? 34 + 35 RDN 36 ISG Z 37 GTO 02 38 RCL M 39 ENTER^ 40 FRC 41 R^ 42 INT 43 + 44 X=Y? |
45 GTO 04 46 LBL 03 47 RCL IND X 48 X<> IND Z 49 STO IND Y 50 ISG Y 51 RDN 52 ISG Y 53 GTO 03 54 RCL 00 55 CHS 56 STO 00 57 LBL 04 58 CLX 59 FC? 00 60 E-7 61 RCL IND M 62 ST* 00 63 ABS 64 X<=Y? 65 GTO 07 66 ISG O |
67 X<0? 68 GTO 08 69 RCL O 70 STO P 71 LBL 05 72 RCL M 73 ENTER^ 74 FRC 75 RCL P 76 INT 77 + 78 RCL IND X 79 RCL IND Z 80 / 81 SIGN 82 ISG Y 83 CLX 84 ISG Z 85 LBL 06 86 CLX 87 RCL IND Z 88 LASTX |
89 * 90 ST- IND Y 91 ISG Y 92 CLX 93 ISG Z 94 GTO 06 95 ISG P 96 GTO 05 97 RCL N 98 ST+ O 99 SIGN 100 RCL M 101 + 102 ISG X 103 GTO 01 104 LBL 07 105 CLX 106 STO 00 107 LBL 08 108 RCL 00 109 CLA 110 END |
( 168 bytes / SIZE n2+1
)
STACK | INPUT | OUTPUT |
X | n | Deteminant |
where n is the order of the square matrix.
Example: Calculate
|
4 9 2 |
R01 R04 R07
D = | 3 5 7 |
into R02 R05 R08
respectively
|
8 1 6 |
R03 R06 R09
3 XEQ "DET" >>>> Det = 360 ( in 9 seconds )
-The triangularized matrix is now
8 1
6
0 8.5
-1
however, R02
do not contain 0
0 0
90/17 registers
R03 R06
-If you want to zero these sub-diagonal elements, delete lines 82-83-84
( but it will slow execution )
Notes:
-"DET" is approximately 35% faster than "LS2"
-Execution time t depends of course on the number of rows exchanges when
pivoting,
if n = 7 , t is
of the order of 1 minute
if n = 17 , t is of the order
of 11 minutes
-If you prefer to choose the "small" number p that identifies tiny elements by yourself:
-Replace register M by register Q
-Replace lines 58 to 60 by RCL M
-Replace line 02 by STO M X<> Y
-In this case, the inputs must be:
STACK | INPUTS | OUTPUTS |
Y | n | / |
X | p | det A |
where n is the order of the matrix,
and p is the "small" number you have choosen.
b) Program#2
-This variant is very similar to "LS1" ( cf "Linear and non-linear Systems
for the HP-41" )
-You can store the coefficients of the matrix from Rbb to Ree provided
bb > 00
Data Registers: R00 = det A at the end ( Registers Rbb thru Rbb-1+n2 are to be initialized before executing "DET" )
• Rbb = a11 .................... • Ree = ann
Flags: /
Subroutines: /
01 LBL "DET" 02 ENTER 03 INT 04 LASTX 05 FRC 06 ISG X 07 INT 08 STO O 09 RCL Y 10 + 11 DSE X 12 E3 13 / 14 + 15 X<> O 16 .1 17 % 18 + 19 STO M 20 SIGN 21 STO 00 22 X<>Y |
23 STO P 24 STO N 25 LBL 11 26 RCL N 27 INT 28 RCL O 29 FRC 30 + 31 ENTER 32 ENTER 33 CLX 34 LBL 08 35 RCL IND Z 36 ABS 37 X>Y? 38 STO Z 39 X>Y? 40 + 41 RDN 42 ISG Z 43 GTO 08 44 RCL N |
45 ENTER 46 FRC 47 R^ 48 INT 49 + 50 X=Y? 51 GTO 00 52 LBL 09 53 RCL IND X 54 X<> IND Z 55 STO IND Y 56 ISG Y 57 RDN 58 ISG Y 59 GTO 09 60 RCL 00 61 CHS 62 STO 00 63 LBL 00 64 RCL IND N 65 ST* 00 66 X=0? |
67 GTO 00 68 LBL 12 69 RCL N 70 ENTER 71 FRC 72 RCL O 73 INT 74 + 75 X=Y? 76 GTO 14 77 RCL IND X 78 RCL IND Z 79 / 80 SIGN 81 ISG Y 82 LBL 13 83 ISG Z 84 FS? 30 85 GTO 14 86 CLX 87 RCL IND Z 88 LASTX |
89 * 90 ST- IND Y 91 ISG Y 92 CLX 93 GTO 13 94 LBL 14 95 ISG O 96 GTO 12 97 RCL M 98 FRC 99 ST+ O 100 SIGN 101 ST+ N 102 ST+ O 103 ISG N 104 GTO 11 105 LBL 00 106 X<> P 107 SIGN 108 RCL 00 109 CLA 110 END |
( 168 bytes / SIZE ??? )
STACK | INPUT | OUTPUT |
X | bbb.eeenn | Deteminant |
L | / | bbb.eeenn |
where n is the order of the square matrix and bbb > 000
Example: Calculate the following determinant assuming the coefficients are stored in R11 to R19
|
4 9 2 |
R11 R14 R17
D = | 3 5 7 |
into R12 R15 R18
respectively
|
8 1 6 |
R13 R16 R19
11.01903 XEQ "DET" >>>> Det = 360 ( in 10 seconds )
Note:
-This program does not check that the control number is valid.