Square-Roots and Integer Powers for the HP-41
Overview
1°) ( a + b sqrt(n) ) k
2°) ( a + b sqrt(m) + c sqrt(n) )
k
1°) ( a + b sqrt(n) ) k
-Sometimes, we have to find the integers x and y so that
x + y Ö n = ( a + b Ö
n
) k where a , b , n , k are integers
and k > 1 ( Ö =
square-root )
-The routine "POW" solves this problem.
Data Registers: R00 = k , k-1 , .... , 0
R01 = a R03
= n
R02 = b R04
, R05: temp
Flags: /
Subroutines: /
01 LBL "POW"
02 STO 00 03 RDN 04 STO 03 05 RDN 06 STO 02 |
07 X<>Y
08 STO 01 09 DSE 00 10 LBL 01 11 STO 04 12 RCL 02 |
13 *
14 X<>Y 15 STO 05 16 RCL 01 17 * 18 + |
19 RCL 01
20 RCL 04 21 * 22 RCL 02 23 RCL 05 24 * |
25 RCL 03
26 * 27 + 28 DSE 00 29 GTO 01 30 END |
( 41 bytes / SIZE 006 )
STACK | INPUTS | OUTPUTS |
T | a | / |
Z | b | / |
Y | n | y |
X | k | x |
with a , b , n , k integers & k > 1 ( a + b Ö n ) k = x + y Ö n ( Ö = square-root )
Examples:
3 ENTER^
-4 ENTER^
5 ENTER^
6 XEQ "POW" >>>> x = 1473929
( in 3 seconds )
RDN y = -639432 thus, (
3 - 4 Ö 5 ) 6 =
1473929 - 639432 Ö 5
( Ö = square-root )
-This routine also works if n < 0 , so it can be applied to complex numbers, for instance:
2 ENTER^
3 ENTER^
-1 ENTER^
7 R/S
>>>> 6554
RDN 4449 whence ( 2 + 3
i ) 7 = 6554 + 4449 i
-There will be no roudoff error, provided all the arguments involved
in the calculations are smaller than 1 + 1010 in magnitude.
2°) ( a + b sqrt(m) + c sqrt(n) ) k
-The previous exercise may be generalized to find x , y , z ,
t so that x + y Ö m +
z Ö n + t Ö (m.n)
= ( a + b Ö m + c Ö
n
) k
Data Registers: • R00 = k ( R00 = 0 at the end ) ( Registers R00 thru R05 are to be initialized before executing "POW2" )
• R01 = a • R04 = m
• R02 = b • R05 = n
R06 thru R10: temp
• R03 = c
Flags: /
Subroutines: /
01 LBL "POW2"
02 RCL 01 03 STO 06 04 RCL 02 05 STO 07 06 RCL 03 07 STO 08 08 CLX 09 STO 09 10 DSE 00 11 LBL 01 12 RCL 01 13 RCL 06 14 * 15 RCL 02 |
16 RCL 07
17 * 18 RCL 04 19 * 20 + 21 RCL 03 22 RCL 08 23 * 24 RCL 05 25 * 26 + 27 STO 10 28 RCL 01 29 RCL 07 30 * |
31 RCL 02
32 RCL 06 33 * 34 + 35 RCL 03 36 RCL 09 37 * 38 RCL 05 39 * 40 + 41 X<> 07 42 RCL 03 43 * 44 RCL 01 45 RCL 09 |
46 *
47 + 48 RCL 02 49 RCL 08 50 * 51 + 52 ENTER^ 53 X<> 09 54 RCL 02 55 * 56 RCL 04 57 * 58 RCL 01 59 RCL 08 60 * |
61 +
62 RCL 03 63 RCL 06 64 * 65 + 66 STO 08 67 RCL 07 68 RCL 10 69 STO 06 70 DSE 00 71 GTO 01 72 END |
( 86 bytes / SIZE 011 )
STACK | INPUTS | OUTPUTS |
T | / | t |
Z | / | z |
Y | / | y |
X | / | x |
with k > 1 and ( a + b Ö m + c Ö n ) k = x + y Ö m + z Ö n + t Ö (m.n) ( Ö = square-root )
Example:
8 STO 00
2 STO 01
5 STO 04
3 STO 02
7 STO 05
-4 STO 03
XEQ "POW2" >>>> 5542917857 = R06
( execution time = 13 seconds )
RDN 1810176816 = R07
RDN -1530146752 = R08
RDN -936804192 = R09
whence ( 2 + 3 Ö 5 - 4 Ö 7 ) 8 = 5542917857 + 1810176816 Ö 5 - 1530146752 Ö 7 - 936804192 Ö 35
Notes:
-Registers R01 thru R05 are unchanged, but when the program stops,
R00 = 0
-So, if you want to calculate another power of the same argument, store
the exponent into R00 and R/S. For example:
3 STO 00 R/S gives ( 2 + 3 Ö 5 - 4 Ö 7 ) 3 = 950 + 1179 Ö 5 - 1036 Ö 7 - 144 Ö 35 ( in 4 seconds )
-Like "POW", "POW2" produces no roudoff error, provided all the
integers involved in the calculations are smaller than 1 + 1010
in magnitude.