Heron's Formula and its Generalizations for the HP-41
Overview
1°) Area of a Triangle
a) Heron's Formula & Another
one
b) M-Code Routines ( Heron
& Brahmagupta Formulae )
c) Heronian Triangles
2°) Volume of a Tetrahedron
a) Francesca's Formula & Another
one
b) 2 M-Code Routines
c) 6 Edges-lengths --->
30 Volumes ?
3°) Hypervolume of a Simplex
-In all these programs - except §1°-c) - we assume that all the
edge lengths are known.
1°) Area of a Triangle
a) Heron's Formula &
Another one
-Let a triangle ABC with 3 known sides a , b , c
-Heron's formula is Area = [ p(p-a)(p-b)(p-c) ]1/2
where p = (a+b+c)/2 = semiperimeter
Data Registers: /
Flags: /
Subroutines: /
-Lines 08-09-10-11 may be replaced by the M-Code function X/2
01 LBL "HERON" 02 ENTER 03 R^ 04 ST+ Z 05 R^ 06 ST+ T 07 R^ 08 SIGN 09 ST+ X 10 ST/ L 11 X<> L 12 ST- Y 13 ST- Z 14 ST- T 15 * 16 * 17 * 18 CHS 19 SQRT 20 END |
( 38 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
Z | a | / |
Y | b | / |
X | c | Area |
Example: a = 2
b = 3 c = 4
2 ENTER^
3 ENTER^
4 XEQ "HERON" >>>>
Area = 2.904737510
Note:
-The formula may be re-written in a more stable one, that is given in reference
[2]
-There will be less roundoff-errors in "difficult cases"
01 LBL "HERON" 02 STO T 03 X<>Y 04 STO M 05 ST+ T 06 X<> Z 07 ST+ Z 08 ST+ T 09 ST- M 10 RDN 11 ST- Y 12 ENTER^ 13 X<> M 14 ST- Y 15 ST+ M 16 CLX 17 X<> M 18 * 19 * 20 * 21 SQRT 22 4 23 / 24 END |
( 46 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
Z | a | / |
Y | b | / |
X | c | Area |
Example: a = 2
b = 3 c = 4
2 ENTER^
3 ENTER^
4 XEQ "HERON" >>>>
Area = 2.904737510
Note:
-The formula may also be re-written to have a smaller program:4 Area2 = a2 c2 - ( a2 + c2 - b2 )2 / 4
01 LBL "ATR" 02 X^2 03 ENTER 04 R^ 05 X^2 06 ST* Z 07 + 08 R^ 09 X^2 10 - 11 2 12 / 13 X^2 14 - 15 SQRT 16 2 17 / 18 END |
( 27 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
Z | a | b |
Y | b | b |
X | c | Area |
Example: a = 2
b = 3 c = 4
2 ENTER^
3 ENTER^
4 XEQ "ATR" >>>>
Area = 2.904737510
b) M-Code Routines ( Heron &
Brahmagupta Formulae )
-"HERON" and "BRHM" use the Héron's & Brahmagupta's formulae.
-They are so similar that it is preferable to combine them.
-There is no check for alpha data and synthetic register Q is used.
-13-digit routines also give a better precision...
08E "N"
00F "O"
012 "R"
005 "E"
008 "H"
104 CLRF 8
033 JNC+06
08D "M"
008 "H"
012 "R"
002 "B"
108 SETF 8
2A0 SETDEC
0F8 C=X
128 L=C
2BE C=-C
10E A=C ALL
0B8 C=Y
01D C=
060 A+C
078 C=Z
025 C=
060 AB+C
04E C=0 ALL
10C ?FSET 8
01B JNC+03
270 RAMSLCT
038 READATA
0E8 X=C
025 C=
060 AB+C
089 AB
064 STO Q+
0B8 C=Y
2BE C=-C
10E A=C ALL
138 C=L
01D C=
060 A+C
078 C=Z
025 C=
060 AB+C
0F8 C=X
025 C=
060 AB+C
0D1 RCL
064 Q+
149 C=
060 AB*CM
089 AB
064 STO Q+
078 C=Z
2BE C=-C
10E A=C ALL
138 C=L
01D C=
060 A+C
0F8 C=X
025 C=
060 AB+C
0B8 C=Y
025 C=
060 AB+C
0D1 RCL
064 Q+
149 C=
060 AB*CM
089 AB
064 STO Q+
0F8 C=X
2BE C=-C
10E A=C ALL
138 C=L
01D C=
060 A+C
0B8 C=Y
025 C=
060 AB+C
078 C=Z
025 C=
060 AB+C
0D1 RCL
064 Q+
149 C=
060 AB*CM
04E C
35C
050 =
190
226 16
269 C=
060 AB/C
305 C=
060 sqrt(AB)
0E8 X=C
3E0 RTN
( 96 words )
STACK | INPUTS | OUTPUTS |
T | T | T |
Z | a | a |
Y | b | b |
X | c | Area |
L | / | c |
Example1: a = 2
b = 3 c = 4
2 ENTER^
3 ENTER^
4 XEQ "HERON" >>>>
Area = 2.904737510
Example2: a = 4 , b = 5 , c = 6 , d = 7
4 ENTER^
5 ENTER^
6 ENTER^
7 XEQ "BRHM" >>>>
Area = 28.98275349
c) Heronian Triangles
-The followig routine takes 3 integers in the stack and returns the integer
edges lengths a , b , c and area A of a Heronian
triangle ( cf reference [3] ).
Formula:
-With 3 integers m , n , k such that m.n > k2
a = n ( m2 + k2 )
b = ( m + n ) ( m.n - k2 )
Area = A = k m n ( m + n ) ( m.n - k2 )
c = m ( n2 + k2 )
Data Registers: R00 thru R03: temp
Flags: /
Subroutines: /
01 LBL "HETR" 02 STO 00 03 X^2 04 STO 03 05 X<>Y 06 STO 02 |
07 X^2 08 + 09 X<>Y 10 STO 01 11 ST* Y 12 RCL 02 |
13 ST+ Y 14 RCL 01 15 * 16 ST* 00 17 RCL 03 18 - |
19 * 20 ST* 00 21 RCL 01 22 X^2 23 RCL 03 24 + |
25 RCL 02 26 * 27 RCL 00 28 RDN 29 END |
( 42 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
T | / | Area |
Z | m | c |
Y | n | b |
X | k | a |
With m.n > k2
Example: m = 67 n = 41 k = 13
67 ENTER^
41 ENTER^
13 XEQ "HETR" >>>>
a = 190978
RDN b = 278424
RDN c = 123950
RDN A = 9942799464
Note:
-"HETR" does not check that m.n > k2 , so it may return
( meaningless ) negative results.
-Add for instance X<0? SF 99 after line
18.
2°) Volume of a Tetrahedron
a) Francesca's Formula
& Another one
-The volume of a tetrahedron may be calculated by the formula:
V = [ 4 a2 b2 c2 - a2 ( b2 + c2 - d2 )2 - b2 ( a2 + c2 - e2 )2 - c2 ( a2 + b2 - f2 )2 + ( b2 + c2 - d2 )( a2 + c2 - e2 )( a2 + b2 - f2 ) ]1/2 / 12
• • • provided the edges a , b , c intersect at the same vertex and the edges d , e , f are respectively opposite to the edges a , b , c
-So, a and d ( respectively b and e , c and f ) must be non-coplanar.
* * * * * * d * * c * * e * * * * * * b * * * * * f * * * * * * V * * * * * * * * * * * * * * * a |
Data Registers: R00: temp ( Registers R01 thru R06 are to be initialized before executing "THV" )
• R01 = a • R04 = d
• R02 = b • R05 = e
• R03 = c • R06 =
f
Flags: /
Subroutines: /
01 LBL "THV" 02 RCL 03 03 X^2 04 4 05 RCL 02 06 X^2 07 STO 00 08 ST* Y 09 RCL 04 |
10 X^2 11 - 12 R^ 13 ST* Z 14 + 15 STO Z 16 X^2 17 - 18 RCL 01 |
19 X^2 20 ST+ 00 21 ST* Y 22 R^ 23 + 24 RCL 05 25 X^2 26 - 27 ST* Z |
28 RCL 02 29 * 30 X^2 31 - 32 RCL 00 33 RCL 06 34 X^2 35 - 36 ST* Z |
37 RCL 03 38 * 39 X^2 40 - 41 + 42 SQRT 43 12 44 / 45 END |
( 61 bytes / SIZE 007 )
-Another program ( 60 bytes ) with the same formula:
Data Registers: R00 & R07 temp ( Registers R01 thru R06 are to be initialized before executing "THV" )
• R01 = a • R04 = d
• R02 = b • R05 = e
• R03 = c • R06 =
f
Flags: /
Subroutines: /
01 LBL "THV" 02 RCL 02 03 X^2 04 STO 00 05 RCL 03 06 X^2 07 STO 07 08 + 09 RCL 04 |
10 X^2 11 - 12 ENTER 13 X^2 14 RCL 00 15 RCL 07 16 * 17 4 18 * |
19 - 20 RCL 01 21 X^2 22 ST+ 00 23 ST* Y 24 RCL 07 25 + 26 RCL 05 27 X^2 |
28 - 29 ST* Z 30 RCL 02 31 * 32 X^2 33 + 34 RCL 00 35 RCL 06 36 X^2 37 - |
38 ST* Z 39 RCL 03 40 * 41 X^2 42 + 43 - 44 SQRT 45 12 46 / 47 END |
( 60 bytes / SIZE 008 )
STACK | INPUT | OUTPUT |
X | / | Volume |
Example1: a = 3 b
= 5 c = 7 d = 6 e = 8
f = 4
-Store these 6 numbers into R01 thru R06
XEQ "THV" >>>> V = 8.426149775 ---Execution time = 1.6s---
-The exact value is sqrt(71)
Example2: a = 120 b = 160 c = 153 d = 25 e = 39 f = 56
-Store these 6 numbers into R01 thru R06
XEQ "THV" >>>> V = 8063.997493
whereas the exact result is 8064
-But if we store 39 56 120 160 153 25 into R01 R02 R03 R04 R05 R06
XEQ "THV" >>>> V = 8063.999990 much better precision !
Notes:
-The second tetrahedron is a heronian tetrahedron: the edges lengths, the faces areas & the volume are all integers.
-In difficult cases like example2, this formula may produce large roundoff-errors
-The method described in reference [2] is employed hereunder
Data Registers: R00-R07-R11: temp ( Registers R01 thru R06 are to be initialized before executing "THV" )
• R01 = a • R04 = d
• R02 = b • R05 = e
• R03 = c • R06 =
f
Flags: /
Subroutines: /
01 LBL "THV" 02 RCL 02 03 RCL 03 04 + 05 STO 00 06 RCL 04 07 ST- 00 08 + 09 ST* 00 10 RCL 01 11 RCL 03 12 + 13 STO 07 14 RCL 05 15 ST- 07 16 + 17 ST* 07 18 RCL 01 19 RCL 02 20 + |
21 STO 08 22 RCL 06 23 ST- 08 24 + 25 ST* 08 26 RCL 04 27 STO 09 28 RCL 02 29 RCL 03 30 - 31 ST- 09 32 + 33 ST* 09 34 RCL 05 35 STO 10 36 RCL 01 37 RCL 03 38 - 39 ST- 10 40 + |
41 ST* 10 42 RCL 06 43 RCL 06 44 RCL 01 45 RCL 02 46 - 47 ST- Z 48 + 49 * 50 STO 11 51 RCL 10 52 RCL 09 53 * 54 * 55 SQRT 56 RCL 09 57 RCL 08 58 RCL 07 59 ST* 11 60 * |
61 * 62 SQRT 63 RCL 08 64 RCL 00 65 ST* 11 66 * 67 RCL 10 68 * 69 SQRT 70 STO 09 71 R^ 72 ST- 09 73 + 74 RCL X 75 RCL 11 76 SQRT 77 STO 11 78 R^ 79 ST+ 11 80 - |
81 ST- Z 82 + 83 * 84 RCL 11 85 RCL 11 86 RCL 09 87 ST- Z 88 + 89 * 90 * 91 SQRT 92 RCL 01 93 RCL 02 94 RCL 03 95 * 96 * 97 192 98 * 99 / 100 END |
( 128 bytes / SIZE 012 )
STACK | INPUT | OUTPUT |
X | / | Volume |
Example: a = 120
b = 160 c = 153 d = 25 e = 39
f = 56
-Store these 6 numbers into R01 thru R06
XEQ "THV" >>>> V = 8063.999986 ---Execution time = 3.4s---
Notes:
-It's not yet the exact result ( 8064 ), but the roundoff-errors are significantly smaller.-We can also compute V with V = (1/3) Area x height
Data Registers: R00-R07-R08-R09: temp ( Registers R01 thru R06 are to be initialized before executing "THV" )
• R01 = a • R04 = d
• R02 = b • R05 = e
• R03 = c • R06 =
f
Flags: /
Subroutines: /
01 LBL "THV" 02 RCL 05 03 X^2 04 RCL 04 05 X^2 06 - 07 STO Y 08 RCL 06 09 X^2 10 STO 08 11 ST+ Z 12 - |
13 STO 00 14 RCL 02 15 X^2 16 RCL 01 17 X^2 18 STO 09 19 - 20 ST- 08 21 ST+ X 22 + 23 * 24 RCL 09 |
25 RCL 03 26 X^2 27 - 28 RCL 06 29 ST+ X 30 STO 07 31 ST/ 08 32 X^2 33 * 34 + 35 RCL 04 36 RCL 07 |
37 * 38 X^2 39 RCL 00 40 X^2 41 - 42 STO Z 43 SQRT 44 ST/ Y 45 + 46 RCL 07 47 ST+ X 48 / |
49 X^2 50 CHS 51 RCL 09 52 + 53 RCL 08 54 X^2 55 - 56 * 57 SQRT 58 12 59 / 60 END |
( 78 bytes / SIZE 010 )
STACK | INPUT | OUTPUT |
X | / | Volume |
Example: a = 120
b = 160 c = 153 d = 25 e = 39
f = 56
-Store these 6 numbers into R01 thru R06
XEQ "THV" >>>> V = 8064 exact result !-Another program with the formula:
144 V2 = a2 b2 ( d2 + e2 - f2 ) + a2 c2 ( d2 - e2 + f2 ) + b2 c2 ( -d2 + e2 + f2 ) + a2 d2 ( -d2 + e2 + f2 - a2 ) + b2 e2 ( d2 - e2 + f2 - b2 ) + c2 f2 ( d2 + e2 - f2 - c2 ) - d2 e2 f2
Data Registers: R00-R07-R08-R09-R10-R11-R12-R13-R14: temp ( Registers R01 thru R06 are to be initialized before executing "THV" )
• R01 = a • R04 = d
• R02 = b • R05 = e
• R03 = c • R06 =
f
Flags: /
Subroutines: /
01 LBL "THV" 02 RCL 04 03 X^2 04 STO 09 05 STO 12 06 RCL 06 07 X^2 08 STO 11 09 - 10 RCL 05 11 X^2 12 STO 10 13 ST- 12 |
14 + 15 STO 14 16 RCL 02 17 X^2 18 STO 07 19 * 20 RCL 12 21 RCL 11 22 ST- 12 23 + 24 STO 13 25 RCL 03 26 X^2 |
27 STO 08 28 ST- 14 29 * 30 + 31 RCL 12 32 RCL 01 33 X^2 34 STO 00 35 + 36 RCL 09 37 * 38 - 39 RCL 00 |
40 * 41 RCL 13 42 RCL 07 43 ST* 12 44 ST- Y 45 * 46 RCL 09 47 RCL 11 48 ST* 14 49 * 50 - 51 RCL 10 |
52 * 53 + 54 RCL 14 55 RCL 12 56 - 57 RCL 08 58 * 59 + 60 SQRT 61 12 62 / 63 END |
( 78 bytes / SIZE 015 )
STACK | INPUT | OUTPUT |
X | / | Volume |
Example1: a = 3
b = 5 c = 7 d = 6 e = 8
f = 4
-Store these 6 numbers into R01 thru R06
XEQ "THV" >>>> V = 8.426149775
---Execution time = 2.1s---
Example2: a = 120 b = 160 c = 153 d = 25 e = 39 f = 56
-Store these 6 numbers into R01 thru R06
XEQ "THV" >>>> V = 8063.999990 b) 2 M-Code Routines
-This program employs Francesca's formula with 13-digit routines
-The alpha "register" and registers Z , Y , L are cleared.
-The existence of data register R06 is checked but there is no check for
alpha data.
-Register R00 is unused.
Data Registers: R00: unused ( Registers R01 thru R06 are to be initialized before executing "THV" )
• R01 = a • R04 = d
• R02 = b • R05 = e
• R03 = c • R06 =
f
Flags: /
Subroutines: /
096 "V"
008 "H"
014 "T"
378 C=c
03C RCR 3
226 C=C+1 S&X
106 A=C S&X
1BC RCR 11
0A6 A<>C S&X
226 C=C+1 S&X
226 C=C+1 S&X
226 C=C+1 S&X
106 A=C S&X
1BC RCR 11
0A6 A<>C S&X
226 C=C+1 S&X
226 C=C+1 S&X
070 N=C ALL
106 A=C S&X
130 LDI S&X
200 200h
200h is the correct value if you have an HP-41 CX, CV or C with
a Quad memory module or 4 memory modules.
306 ?A<C S&X
If you have an HP-41C without any memory module, replace 200h by 100h
381 ?NCGO
00A 02E0
if register R06 does not exist, the routine stops after displaying
"NONEXISTENT"
0B0 C=N ALL
17C RCR 6
270 RAMSLCT
038 READATA
10E A=C ALL
0B0 C=N ALL
17C RCR 6
226 C=C+1 S&X
270 RAMSLCT
038 READATA
2A0 SETDEC
135 C=
060 A*C
0B0 C=N ALL
03C RCR 3
260 SETHEX
266 C=C-1 S&X
270 RAMSLCT
038 READATA
2A0 SETDEC
13D C=
060 AB*C
04E C
35C =
090 2
13D C=
060 AB*C
0AE A<>C ALL
10E A=C ALL
158 M=C ALL
0CE C=B ALL
149 C=
060 AB*CM
081 0 ramslct
064 AB STO Q+
0B0 C=N ALL
17C RCR 6
260 SETHEX
226 C=C+1 S&X
270 RAMSLCT
038 READATA
10E A=C ALL
2A0 SETDEC
135 C=
060 A*C
046 C=0 S&X
270 RAMSLCT
0AE A<>C ALL
128 L=C
0CE C=B ALL
0E8 X=C
0B0 C=N ALL
03C RCR 3
260 SETHEX
266 C=C-1 S&X
270 RAMSLCT
038 READATA
10E A=C ALL
2A0 SETDEC
135 C=
060 A*C
046 C=0 S&X
270 RAMSLCT
138 C=L
158 M=C ALL
0F8 C=X
031 C=
060 AB+CM
0AE A<>C ALL
128 L=C
0CE C=B ALL
0E8 X=C
0B0 C=N ALL
03C RCR 3
270 RAMSLCT
038 READATA
10E A=C ALL
2BE C=-C
135 C=
061 A*C
046 C=0 S&X
270 RAMSLCT
138 C=L
158 M=C ALL
0F8 C=X
031 C=
060 AB+CM
0AE A<>C ALL
10E A=C ALL
1A8 N=C
0CE C=B ALL
168 M=C
0B0 C=N ALL
17C RCR 6
270 RAMSLCT
038 READATA
13D C=
060 AB*C
0AE A<>C ALL
10E A=C ALL
2BE C=-C
158 M=C ALL
0CE C=B ALL
149 C=
060 AB*CM
0C9 0 ramslct
064 RCL Q+
031 C=
060 AB+CM
089 AB
064 STO Q+
0B0 C=N ALL
17C RCR 6
270 RAMSLCT
038 READATA
10E A=C ALL
135 C=
060 A*C
046 C=0 S&X
270 RAMSLCT
0AE A<>C ALL
128 L=C
0CE C=B ALL
0E8 X=C
0B0 C=N ALL
03C RCR 3
260 SETHEX
266 C=C-1 S&X
270 RAMSLCT
038 READATA
10E A=C ALL
2A0 SETDEC
135 C=
060 A*C
046 C=0 S&X
270 RAMSLCT
138 C=L
158 M=C ALL
0F8 C=X
031 C=
060 AB+CM
0AE A<>C ALL
128 L=C
0CE C=B ALL
0E8 X=C
0B0 C=N ALL
260 SETHEX
266 C=C-1 S&X
270 RAMSLCT
038 READATA
10E A=C ALL
2A0 SETDEC
2BE C=-C
135 C=
061 A*C
046 C=0 S&X
270 RAMSLCT
138 C=L
158 M=C ALL
0F8 C=X
031 C=
060 AB+CM
0AE A<>C ALL
10E A=C ALL
228 P=C
0CE C=B ALL
1E8 O=C
0B0 C=N ALL
17C RCR 6
260 SETHEX
226 C=C+1 S&X
270 RAMSLCT
038 READATA
2A0 SETDEC
13D C=
060 AB*C
0AE A<>C ALL
10E A=C ALL
2BE C=-C
158 M=C ALL
0CE C=B ALL
149 C=
060 AB*CM
0C9 0 ramslct
064 RCL Q+
031 C=
060 AB+CM
089 AB
064 STO Q+
0B0 C=N ALL
17C RCR 6
270 RAMSLCT
038 READATA
10E A=C ALL
135 C=
060 A*C
046 C=0 S&X
270 RAMSLCT
0AE A<>C ALL
128 L=C
0CE C=B ALL
0E8 X=C
0B0 C=N ALL
17C RCR 6
260 SETHEX
226 C=C+1 S&X
270 RAMSLCT
038 READATA
10E A=C ALL
2A0 SETDEC
135 C=
060 A*C
046 C=0 S&X
270 RAMSLCT
138 C=L
158 M=C ALL
0F8 C=X
031 C=
060 AB+CM
0AE A<>C ALL
128 L=C
0CE C=B ALL
0E8 X=C
0B0 C=N ALL
270 RAMSLCT
038 READATA
10E A=C ALL
2BE C=-C
135 C=
061 A*C
046 C=0 S&X
270 RAMSLCT
138 C=L
158 M=C ALL
0F8 C=X
031 C=
060 AB+CM
0AE A<>C ALL
10E A=C ALL
068 Z=C
0CE C=B ALL
0A8 Y=C
0B0 C=N ALL
03C RCR 3
260 SETHEX
266 C=C-1 S&X
270 RAMSLCT
038 READATA
2A0 SETDEC
13D C=
060 AB*C
0AE A<>C ALL
10E A=C ALL
2BE C=-C
158 M=C ALL
0CE C=B ALL
149 C=
060 AB*CM
0C9 0 ramslct
064 RCL Q+
031 C=
060 AB+CM
089 AB
064 STO Q+
1B8 C=N
10E A=C ALL
178 C=M
0EE B<>C ALL
238 C=P
158 M=C ALL
1F8 C=O
149 C=
060 AB*CM
078 C=Z
158 M=C ALL
0B8 C=Y
149 C=
060 AB*CM
0D1 RCL
064 Q+
031 C=
060 AB+CM
04E C=0 ALL
128 L=C
0A8 Y=C
068 Z=C
35C C
050
110 =
110
226
226 144
269 C=
060 AB/C
305 C=
060 sqrt(AB)
0E8 X=C
345 ?NCGO
042 CLA
( 323 words )
STACK | INPUTS | OUTPUTS |
T | T | T |
Z | / | 0 |
Y | / | 0 |
X | / | Volume |
L | / | 0 |
With R01 = a , ................. , R06 = f
Example1: a = 3 b = 5 c = 7 d = 6 e = 8 f = 4
-Store these 6 numbers into R01 thru R06
XEQ "THV" >>>> V = 8.426149773
-The exact value is sqrt(71), so all the digits are correct.
Example2: a = 120 b = 160 c = 153 d = 25 e = 39 f = 56
-Store these 6 numbers into R01 thru R06
XEQ "THV" >>>> V = 8063.999998
Notes:
-Register T is saved.
-With the second ( difficult ) example, even 13-digit routines
don't give the exact result !
-Three steps are very similar in the calculations, so this routine may be simplified as follows ( 187 words instead of 323 ):
-Change the three ?NCXQ written in red according to the place of the
subroutine in your own ROM
096 "V"
@E143 in my ROM
008 "H"
014 "T"
378 C=c
03C RCR 3
226 C=C+1 S&X
106 A=C S&X
1BC RCR 11
0A6 A<>C S&X
226 C=C+1 S&X
106 A=C S&X
1BC RCR 11
0A6 A<>C S&X
226 C=C+1 S&X
106 A=C S&X
1BC RCR 11
0A6 A<>C S&X
226 C=C+1 S&X
070 N=C ALL
CPU register N now contains the addresses of R01.R02.R03.R04
106 A=C S&X
130 LDI S&X
1FE 1FEh
1FEh is the correct value if you have an HP-41 CX, CV or C with
a Quad memory module or 4 memory modules.
306 ?A<C S&X
381 ?NCGO
00A 02E0
if register R06 does not exist, the routine stops after displaying
"NONEXISTENT"
0B0 C=N ALL
27C RCR 9
270 RAMSLCT
038 READATA
10E A=C ALL
0B0 C=N ALL
17C RCR 6
270 RAMSLCT
038 READATA
2A0 SETDEC
135 C=
060 A*C
0B0 C=N ALL
03C RCR 3
270 RAMSLCT
038 READATA
13D C=
060 AB*C
04E C
35C =
090 2
13D C=
060 AB*C
0AE A<>C ALL
10E A=C ALL
158 M=C ALL
0CE C=B ALL
149 C=
060 AB*CM
081 0 ramslct
064 AB STO Q+
04E C=0 ALL
228 P=C
35C C=
050 1
1E8 O=C
2A5 ?NCXQ
?NCXQ
Change these 2 words according to the address of the subroutine
384 E1A9
subroutine
in your own ROM
260 SETHEX
0B0 C=N ALL
226 C=C+1 S&X
17C RCR 6
266 C=C-1 S&X
23A C=C+1 M
13C RCR 8
070 N=C ALL
2A5 ?NCXQ
?NCXQ
Change these 2 words according to the address of the subroutine
384 E1A9
subroutine
in your own ROM
260 SETHEX
0B0 C=N ALL
226 C=C+1 S&X
27A C=C-1 M
17C RCR 6
23A C=C+1 M
13C RCR 8
070 N=C ALL
2A5 ?NCXQ
?NCXQ
Change these 2 words according to the address of the subroutine
384 E1A9
subroutine
in your own ROM
0D1 RCL
064 Q+
031 C=
060 AB+CM
04E C=0 ALL
128 L=C
35C C
050
110 =
110
226
226 144
269 C=
060 AB/C
305 C=
060 sqrt(AB)
0E8 X=C
345 ?NCGO
042 CLA
2A0 SETDEC
subroutine @E1A9 in my ROM
0B0 C=N ALL
17C RCR 6
270 RAMSLCT
038 READATA
10E A=C ALL
135 C=
060 A*C
046 C=0 S&X
270 RAMSLCT
0AE A<>C ALL
1A8 N=C
0CE C=B ALL
168 M=C
0B0 C=N ALL
270 RAMSLCT
038 READATA
10E A=C ALL
2BE C=-C
135 C=
061 A*C
046 C=0 S&X
270 RAMSLCT
1B8 C=N
158 M=C ALL
178 C=M
031 C=
060 AB+CM
0AE A<>C ALL
1A8 N=C
0CE C=B ALL
168 M=C
0B0 C=N ALL
03C RCR 3
270 RAMSLCT
038 READATA
10E A=C ALL
135 C=
060 A*C
046 C=0 S&X
270 RAMSLCT
1B8 C=N
158 M=C ALL
178 C=M
031 C=
060 AB+CM
0AE A<>C ALL
10E A=C ALL
0E8 X=C
0CE C=B ALL
128 L=C
0B0 C=N ALL
27C RCR 9
270 RAMSLCT
038 READATA
13D C=
060 AB*C
0AE A<>C ALL
10E A=C ALL
2BE C=-C
158 M=C ALL
0CE C=B ALL
149 C=
060 AB*CM
0C9 0 ramslct
064 RCL Q+
031 C=
060 AB+CM
089 AB
064 STO Q+
238 C=P
10E A=C ALL
1F8 C=O
0EE B<>C ALL
0F8 C=X
158 M=C ALL
138 C=L
149 C=
060 AB*CM
0AE A<>C ALL
10E A=C ALL
228 P=C
0CE C=B ALL
1E8 O=C
3E0 RTN
@E1FD in my ROM
( 187 words )
STACK | INPUTS | OUTPUTS |
T | T | T |
Z | Z | Z |
Y | Y | Y |
X | / | Volume |
L | / | 0 |
With R01 = a , ................. , R06 = f
Notes:
-Same examples >>> same results.
-The alpha register is cleared but registers Y Z T are saved.
c) 6 Edges Lenths --->
30 Volumes ?
-Unlike the previous paragraphs, we assume that the sides d , e , f
intersect at the same vertex
but the sides d , e , f are still respectively
opposite to the sides a , b , c
-So, a and d ( respectively b and e , c and f ) must be non-coplanar.
* * * * * * d * * c * * b * * * * * * e * * * * * f * * * * * * * * * * * * * * * * * * * * * a |
-Given 6 values for the edges lengths, there are at most 30 different
volumes for 30 tetrahedrons.
-The 30 volumes are stored into registers R40 to R11 and the
corresponding configurations are:
R40 = a b c d e f ( initial
configuration )
R30 = a b d c f e
R20 = a c d b e f
R39 = a b c d f e
R29 = a b d c e f
R19 = a c d b f e
R38 = a b c e f d
R28 = a b f c e d
R18 = a c e b f d
R37 = a b c f e d
R27 = a b f e c d
R17 = a b e c f d
R36 = a b c f d e
R26 = a b f e c d
R16 = a b e f c d
R35 = a b c e d f
R25 = a b f d e c
R15 = a b e f d c
R34 = a b d e c f
R24 = a b f d c e
R14 = a b e d f c
R33 = a b d e f c
R23 = a b f c d e
R13 = a b e d c f
R32 = a b d f e c
R22 = a c f b d e
R12 = a b e c d f
R31 = a b d f c e
R21 = a c f b e d
R11 = a c e b d f
Data Registers: R00 & R07 to R10 : temp ( Registers R01 thru R06 are to be initialized before executing "30THV" )
• R01 = a • R04 = d
• R02 = b • R05 = e
R11 thru R40: the 30 volumes corresponding to the 30 configurations
above.
• R03 = c • R06 =
f
Flags: /
Subroutines: /
01 LBL "30THV" 02 4 03 STO 09 04 12 05 STO 10 06 41 07 STO 11 08 XEQ 01 09 RCL 05 10 X<> 06 11 STO 05 12 XEQ 01 13 RCL 04 14 X<> 06 15 STO 04 16 XEQ 01 17 RCL 04 18 X<> 05 19 STO 04 20 XEQ 01 21 RCL 05 22 X<> 06 23 STO 05 24 XEQ 01 25 RCL 04 26 X<> 06 27 STO 04 28 XEQ 01 29 RCL 03 30 X<> 05 |
31 STO 03 32 XEQ 01 33 RCL 05 34 X<> 06 35 STO 05 36 XEQ 01 37 RCL 04 38 X<> 05 39 STO 04 40 XEQ 01 41 RCL 05 42 X<> 06 43 STO 05 44 XEQ 01 45 RCL 04 46 X<> 05 47 STO 04 48 XEQ 01 49 RCL 05 50 X<> 06 51 STO 05 52 XEQ 01 53 RCL 03 54 X<> 06 55 STO 03 56 XEQ 01 57 RCL 04 58 X<> 05 59 STO 04 60 XEQ 01 |
61 RCL 05 62 X<> 06 63 STO 05 64 XEQ 01 65 RCL 04 66 X<> 05 67 STO 04 68 XEQ 01 69 RCL 05 70 X<> 06 71 STO 05 72 XEQ 01 73 RCL 04 74 X<> 05 75 STO 04 76 XEQ 01 77 RCL 02 78 X<> 04 79 STO 02 80 XEQ 01 81 RCL 05 82 X<> 06 83 STO 05 84 XEQ 01 85 RCL 03 86 X<> 06 87 STO 03 88 XEQ 01 89 RCL 05 90 X<> 06 |
91 STO 05 92 XEQ 01 93 RCL 03 94 X<> 06 95 STO 03 96 XEQ 01 97 RCL 02 98 X<> 04 99 STO 02 100 XEQ 01 101 RCL 04 102 X<> 05 103 STO 04 104 XEQ 01 105 RCL 05 106 X<> 06 107 STO 05 108 XEQ 01 109 RCL 04 110 X<> 05 111 STO 04 112 XEQ 01 113 RCL 05 114 X<> 06 115 STO 05 116 XEQ 01 117 RCL 04 118 X<> 05 119 STO 04 120 XEQ 01 |
121 RCL 02 122 X<> 04 123 STO 02 124 LBL 01 125 RCL 09 126 RCL 04 127 X^2 128 STO 07 129 ST* Y 130 RCL 03 131 X^2 132 - 133 RCL 05 134 X^2 135 STO 08 136 ST* Z 137 + 138 STO Z 139 X^2 140 - 141 RCL 06 142 X^2 143 STO 00 144 ST* Y 145 RCL 01 146 X^2 147 - 148 RCL 08 149 + 150 ST* Z |
151 X^2 152 RCL 07 153 * 154 - 155 RCL 07 156 RCL 02 157 X^2 158 - 159 RCL 00 160 + 161 ST* Z 162 X^2 163 RCL 08 164 * 165 - 166 + 167 SIGN 168 LASTX 169 ABS 170 SQRT 171 * 172 RCL 10 173 / 174 DSE 11 175 STO IND 11 176 END |
( 283 bytes / SIZE 041 )
STACK | INPUT | OUTPUT |
X | / | V30 = R11 |
Example: a = 41
b = 42 c = 43 d = 44 e = 45 f = 46
41 STO 01 44 STO
04
42 STO 02 45
STO 05
43 STO 03 46
STO 06
XEQ "30THV" >>>>> V30 = 9549.651942 = R11 ---Execution time = 65s---
-All the 30 volumes are
R11 = 9549.651942 R16 = 9612.079808
R21 = 9572.860100 R26 = 9613.515867
R31 = 9613.268483 R36 = 9630.443600
R12 = 9558.033600 R17 =
9599.960092 R22 = 9549.413017 R27
= 9592.100392 R32 = 9631.412675 R37
= 9634.972967
R13 = 9560.585658 R18 =
9580.897258 R23 = 9557.078300 R28
= 9585.059600 R33 = 9626.096033 R38
= 9629.895233
R14 = 9616.129400 R19 =
9581.612017 R24 = 9559.869292 R29
= 9587.918308 R34 = 9594.005417 R39
= 9621.832017
R15 = 9625.694633 R20 =
9573.813792 R25 = 9609.267400 R30
= 9601.863525 R35 = 9619.220067 R40
= 9615.686350
Notes:
-The volume in R40 corresponds to the initial tetrahedron 41 - 42
- 43 - 44 - 45 - 46 ( a b c d e f )
-The volume in R11 corresponds to the tetrahedron 41 -
43 - 45 - 42 - 44 - 46 ( a c e b d f )
-Of course, all the configurations don't always lead to a real tetrahedron
-To avoid a data error if V2 < 0 , "30THV" returns
in fact sign(V2) x sqrt ( abs ( V2 ) )
Lines 167 to 173.
-So, the negative values must be read sqrt(-1)
| V |
-For instance, with a = 6 b = 5 c = 2 d
= 7 e = 8 f = 4 , R40 = 6 > 0 is a feasible
tetrahedron
but R11 = -2 < 0 , R13 & R14 < 0 ... don't
give real volumes.
-With these edges lengths, only 4 configurations lead to real
volumes.
-The configurations "ACEBDF" .... could also be stored in registers to
get more complete informations but it would cost many bytes...
-Another variant:
Replace lines 174-175 by X>0? STOP and delete lines 06-07
-Thus, the program will stop each time V > 0 and you can recall R01 to R06 to get the corresponding config.
-If you prefer that the edges a , b , c intersect at the same
vertex, exchange R01<>R04 , R02<>R05 , R03<>R06
in the listing above.
3°) Hypervolume of a Simplex
-We have to calculate a determinant of order ( n + 2 ) to get the (hyper-)volume
of a n-simplex in a n-dimensional space.
-Let (n+1) points Pi ( i = 1 , 2 , .... , n+1
)
Let B the matrix defined by Bi,j
= PiPj = distance between the 2 points
and C the matrix obtained if we add
a top row [ 0 1 1 .............
1 ] and a left column [ 0 1 1
............. 1 ]T to matrix B
-The volume V of the simplex is then: V = [ (-1)n+1
2 -n det C ]1/2 / n!
Data Registers:
The coefficients of the matrix C
When the routine stops, R00 = det C and R01 = n
Flag: F29
Subroutine: "LS3" or
"LS2" or "LS" ( cf" Linear and non-linear systems
for the HP-41" )
or "DET" ( cf "Determinants for the HP-41" )
-The append character is denoted ~
-Line 91 may be replaced by XEQ "LCL"
( cf "Miscellaneous Short Routines for the HP-41" )
-Line 100, n is saved in R01
01 LBL "SIMV" 02 STO 00 03 STO 01 04 5 05 + 06 STO 02 07 ST+ X 08 4 09 - 10 STO 03 11 CLX 12 FIX 0 13 CF 29 14 LBL 01 15 RCL 00 16 STO 06 17 RCL 02 18 STO 04 19 RCL 03 20 STO 05 21 R^ 22 1 |
23 + 24 ENTER^ 25 ISG X 26 LBL 02 27 " D" 28 ARCL Y 29 "~-" 30 ARCL X 31 "~?" 32 PROMPT 33 X^2 34 STO IND 04 35 STO IND 05 36 CLX 37 RCL 01 38 2 39 + 40 ST+ 05 41 SIGN 42 ST+ 04 43 + 44 DSE 06 |
45 GTO 02 46 RCL 01 47 3 48 + 49 ST+ 02 50 ST+ 03 51 R^ 52 DSE 00 53 GTO 01 54 FIX 9 55 SF 29 56 RCL 01 57 2 58 + 59 STO 00 60 SIGN 61 LBL 03 62 STO IND L 63 DSE L 64 GTO 03 65 RCL 00 66 X^2 |
67 LASTX 68 - 69 1 70 + 71 RCL 00 72 E5 73 / 74 + 75 SIGN 76 LBL 04 77 STO IND L 78 DSE L 79 GTO 04 80 RCL 00 81 1 82 ST+ Y 83 % 84 RCL 00 85 X^2 86 + 87 E3 88 / |
89 1 90 + 91 CLRGX 92 RCL 00 93 ENTER^ 94 XEQ "LS3" 95 CHS 96 R^ 97 INT 98 2 99 - 100 STO 01 101 LASTX 102 CHS 103 X<>Y 104 Y^X 105 / 106 SQRT 107 RCL 01 108 FACT 109 / 110 END |
( 157 bytes / SIZE n2+4
n + 5 )
STACK | INPUT | OUTPUT |
X | n > 1 | Volume |
Example1: The tetrahedron of paragraph
2-a)
Dim E = 3 XEQ "SIMV" >>> "D1-2?"
3 R/S >>>
"D1-3?"
5 R/S >>>
"D1-4?"
7 R/S >>>
"D2-3?"
4 R/S >>>
"D2-4?"
8 R/S >>>
"D3-4?"
6 R/S >>>
Volume = 8.426149767
---Execution time = 44s---
-The program is of course much slower: we have to calculate a determinant
of order 5 instead of a relatively simple formula...
Example2: In a 4-dimensional space, the simplex defined by 5 points A , B , C , D , E such that:
AB = 4 AC = 6 AD = 7 AE = 5
BC = 8 BD = 9 BE = 6
CD = 7 CE = 9
DE =10
4 XEQ "SIMV" >>> "D1-2?"
AB = 4
R/S >>> "D1-3?"
AC = 6 R/S >>> "D1-4?"
AD = 7 R/S >>> "D1-5?"
AE = 5 R/S >>> "D2-3?"
BC = 8 R/S >>> "D2-4?"
BD = 9 R/S >>> "D2-5?"
BE = 6 R/S >>> "D3-4?"
CD = 7
R/S >>> "D3-5?"
CE = 9
R/S >>> "D4-5?"
DE =10
R/S >>> Volume = 27.22208051
---Execution time = 65s---
Note:
-If the distances are contradictory i-e if such a simplex cannot exist,
there will be a DATA ERROR message line106
References:
[1] http://mathworld.wolfram.com/Cayley-MengerDeterminant.html
[2] Prof. W. Kahan - "What has the Volume of a Tetrahedron
to do with Computer Programming Languages ?"
[3] http://mathworld.wolfram.com/HeronianTriangle.html