Real Numbers -> Integer Roots for the HP-41
Overview
1°) Real -> Square-Roots ?
2°) Real -> Cube Roots ?
3°) Real -> Solution of a Cubic Equation
?
a) X^3+p.X+q = 0
b) X^3+p.X^2+q.X+r = 0
-The following routines try to express a real number with square roots
or cube roots of integrers.
1°) Real -> Square-Roots ?
"SR?" tries to find integers a , b , c such that a real number
x = [ a +/- sqrt(b) ] / c or sqrt [ a +/- sqrt(b) ] / c
Data Registers: R00 = x , R01 = a , R02 = c R03-R04: temp
Flag: F02 CF 02 <->
x = ( a +/- sqrt(b) ) / c
SF 02 <-> x = sqrt [ a +/- sqrt(b) ] / c
Subroutines: /
01 LBL "SR?"
02 STO 00 03 CF 02 04 1 05 STO 04 06 LBL 01 07 RCL 04 08 STO 01 09 ENTER 10 SIGN 11 STO 02 12 + 13 STO 04 14 LBL 02 15 RCL 00 16 RCL 02 17 * 18 ENTER |
19 X^2
20 STO 03 21 LASTX 22 RCL 01 23 ST+ 03 24 ST+ T 25 ST- Z 26 - 27 X^2 28 RND 29 FRC 30 X=0? 31 GTO 11 32 RDN 33 X^2 34 RND 35 FRC 36 X=0? |
37 GTO 12
38 X<>Y 39 X^2 40 RND 41 FRC 42 X=0? 43 GTO 13 44 RCL 03 45 X^2 46 RND 47 FRC 48 X=0? 49 GTO 14 50 RCL 01 51 ENTER 52 SIGN 53 ST+ 02 54 - |
55 STO 01
56 X>0? 57 GTO 02 58 GTO 01 59 LBL 13 60 RCL 01 61 CHS 62 STO 01 63 LBL 11 64 LASTX 65 RCL 00 66 RCL 02 67 * 68 GTO 00 69 LBL 14 70 RCL 01 71 CHS |
72 STO 01
73 LBL 12 74 SF 02 75 LASTX 76 RCL 00 77 RCL 02 78 * 79 X^2 80 LBL 00 81 RCL 01 82 - 83 SIGN 84 * 85 RCL 02 86 X<>Y 87 RCL 01 88 END |
( 109 bytes / SIZE 005 )
STACK | INPUTS | OUTPUTS |
Z | / | c |
Y | / | +/- b |
X | x | a |
If CF 02 x = ( a +/- sqrt(b) ) / c
If SF 02 x = sqrt [ a +/- sqrt(b) ]
/ c
Examples: Let's imagine that we remember that
Sin 72° may be expressed with square-roots of integrers but we
don't remember the exact formula:
DEG 72 SIN FIX 7
XEQ "SR?" >>>> 10
---Execution time = 93s---
RDN 20
RDN 4 with
SF 02
-Thus the HP41 suggests that Sin 72° = sqrt ( 10 + sqrt (20) ) / 4
-Likewise, 72 COS FIX 7 R/S
>>>> -1
RDN 5
RDN 4
with CF 02
-So Cos 72° = ( -1 + sqrt(5) ) / 4
Notes:
-All the results given by this program don't prove anything !
-Since there is only a finite number of decimals, it's only a suggestion.
-I've used FIX 7 in the above example, but another choice may be better
according to the magnitude of x.
2°) Real -> Cube-Roots ?
"SR3?" tries to find integers a , b , c such that a real number
x = ( a + cbrt(b) ) / c or cbrt [ a + cbrt(b) ] / c
Data Registers: R00 = x , R01 = a , R02 = c R03-R04: temp
Flag: F03 CF 03 <->
x = ( a + cbrt(b) ) / c
SF 03 <-> x = sqrt [ a + cbrt(b) ] / c
Subroutines: /
01 LBL "SR3?"
02 STO 00 03 CF 03 04 1 05 STO 04 06 LBL 01 07 RCL 04 08 STO 01 09 ENTER 10 SIGN 11 STO 02 12 + 13 STO 04 14 LBL 02 15 RCL 00 16 RCL 02 17 * |
18 ENTER
19 X^2 20 LASTX 21 * 22 STO 03 23 LASTX 24 RCL 01 25 ST+ 03 26 ST+ T 27 ST- Z 28 - 29 ENTER 30 X^2 31 * 32 RND 33 FRC 34 X=0? |
35 GTO 11
36 RDN 37 ENTER 38 X^2 39 * 40 RND 41 FRC 42 X=0? 43 GTO 12 44 X<>Y 45 ENTER 46 X^2 47 * 48 RND 49 FRC 50 X=0? 51 GTO 13 |
52 RCL 03
53 ENTER 54 X^2 55 * 56 RND 57 FRC 58 X=0? 59 GTO 14 60 RCL 01 61 ENTER 62 SIGN 63 ST+ 02 64 - 65 STO 01 66 X>0? 67 GTO 02 68 GTO 01 |
69 LBL 13
70 RCL 01 71 CHS 72 STO 01 73 GTO 11 74 LBL 14 75 RCL 01 76 CHS 77 STO 01 78 LBL 12 79 SF 03 80 LBL 11 81 RCL 02 82 LASTX 83 RCL 01 84 END |
( 106 bytes / SIZE 005 )
STACK | INPUTS | OUTPUTS |
Z | / | c |
Y | / | b |
X | x | a |
If CF 02 x = ( a + sqrt(b) ) / c
If SF 02 x = sqrt [ a + sqrt(b) ] /
c
Examples:
• 0.9174802104 FIX 7 XEQ "SR3?"
>>>> 3
---Execution time = 38s---
RDN 4
RDN 5 with CF 03
-Thus 0.9174802104 ~ ( 3 + cbrt(4) ) / 5
• -0.2565030277 FIX 7 R/S
>>>> 1
RDN -9
RDN 4 with SF 03
-So, -0.2565030277 ~ ( cbrt ( 1 - cbrt(9)
) ) / 4
3°) Real -> Solution of a Cubic Equation ?
a) X^3+p.X+q = 0
-Given a real number x , "P3?" searches integers p
, q such that x is a solution of x3 + p x
+ q = 0
Data Registers: R00 = x , R01 = p
Flags: /
Subroutines: /
01 LBL "P3?"
02 STO 00 03 1 04 STO 01 05 LBL 01 06 RCL 00 07 X^2 08 STO Y 09 RCL 01 |
10 ST+ Z
11 - 12 RCL 00 13 ST* Z 14 * 15 RND 16 FRC 17 X=0? 18 GTO 11 |
19 X<>Y
20 RND 21 FRC 22 X=0? 23 GTO 12 24 ISG 01 25 CLX 26 GTO 01 27 LBL 11 |
28 RCL 01
29 CHS 30 GTO 00 31 LBL 12 32 RCL 01 33 LBL 00 34 LASTX 35 2 36 / |
37 ENTER
38 X^2 39 RCL Z 40 3 41 ST/ Y 42 Y^X 43 + 44 X<>Y 45 END |
( 63 bytes / SIZE 002 )
STACK | INPUTS | OUTPUTS |
Y | / | B |
X | x | A |
Whence x ~ ( A + sqrt(B) )1/3 + ( A - sqrt(B) )1/3 ( perhaps... )
Example:
-0.3221853551 FIX 7 XEQ "P3?"
>>>> -0.5
---Execution time = 2s---
X<>Y 1.25
-So x ~ cbrt[ -1/2 + sqrt(5/4) ] + cbrt[ -1/2 - sqrt(5/4)
]
Notes:
-Tartaglia's formula gives a possible answer if B > 0: in this case,
the polynomial has a unique real root.
-Otherwise, it involves complex numbers and the cubic equation has
2 or 3 real roots:
-You will have to check which of these roots corresponds to x
-The real number B may always be written N / 108 because
B = (q^2)/4 + p^3 / 27 and A = -q/2
b) X^3+p.X^2+q.X+r = 0
-This variant is a slightly more general program:
Data Registers: R00 = x , R01 = p ,
R02 = q , R03 = r
Flags: /
Subroutines: /
01 LBL "P3?"
02 STO 00 03 CLX 04 STO 03 05 LBL 01 06 RCL 03 07 STO 01 08 ENTER 09 SIGN 10 + 11 STO 03 12 CLX 13 STO 02 14 LBL 02 15 RCL 00 16 RCL 00 17 RCL 00 18 RCL 01 19 + 20 * 21 RCL 02 22 + 23 * 24 RND |
25 FRC
26 X=0? 27 GTO 11 28 CLX 29 RCL 01 30 + 31 * 32 RCL 02 33 - 34 * 35 RND 36 FRC 37 X=0? 38 GTO 12 39 CLX 40 RCL 01 41 - 42 * 43 RCL 02 44 + 45 * 46 RND 47 FRC 48 X=0? |
49 GTO 13
50 CLX 51 RCL 01 52 - 53 * 54 RCL 02 55 - 56 * 57 RND 58 FRC 59 X=0? 60 GTO 14 61 RCL 01 62 ENTER 63 SIGN 64 ST+ 02 65 - 66 STO 01 67 CHS 68 X<=0? 69 GTO 02 70 GTO 01 71 LBL 14 72 RCL 02 |
73 CHS
74 STO 02 75 LBL 13 76 RCL 01 77 CHS 78 STO 01 79 GTO 11 80 LBL 12 81 RCL 02 82 CHS 83 STO 02 84 LBL 11 85 LASTX 86 CHS 87 STO 03 88 RCL 01 89 RCL 02 90 * 91 3 92 / 93 - 94 RCL 01 95 3 96 ST/ Y |
97 Y^X
98 ST+ X 99 + 100 2 101 / 102 CHS 103 ENTER 104 X^2 105 RCL 01 106 X^2 107 3 108 / 109 RCL 02 110 X<>Y 111 - 112 3 113 ST/ Y 114 Y^X 115 + 116 X<>Y 117 RCL 01 118 3 119 / 120 CHS 121 END |
( 140 bytes / SIZE 004 )
STACK | INPUTS | OUTPUTS |
Z | / | C |
Y | / | B |
X | x | A |
Whence x ~ A + ( B + sqrt(C) )1/3 + ( B - sqrt(C) )1/3 ( perhaps... )
Example:
-6.279877039 FIX 7 XEQ "P3" >>>>
-2.3333333
---Execution time = 130s---
RDN -8.3703704
RDN 16.1481481
-In fact, if there were no roundoff-errors: A = -7/3 B = -226/27 C = 436/27
-Thus, x ~ -7/3 + cbrt [ -226/227 + sqrt (436/27 ) ] +
cbrt [ -226/227 - sqrt (436/27 ) ]
Notes:
-Tartaglia's formula gives a possible answer if C > 0: in this case,
the polynomial has a unique real root.
-Otherwise, it involves complex numbers and the cubic equation has
2 or 3 real roots:
-You will have to check which of these roots corresponds to x
-The real number C may always be written N / 108 because
C = (Q^2)/4 + P^3 / 27 and B = -Q/2
with X^3 + P.X + Q = 0 after the change of variable
x - p/3 to remove the term in x^2