Pell's Equation for the HP-41
Overview
1°) x2 - d y2
= m
2°) x2 - d y2
= 1
-Here, x , y , d , m are integers: Pell's equation is a Diophantine
equation.
-In paragraph 1, the positive integers y are tested until x is an integer.
-In paragraph 2, continued fractions are used and a solution is return
much faster.
1°) x2
- d y2 = m
Data Registers: /
Flag: F29
Subroutines: /
-The append character is denoted ~
01 LBL "PELL"
02 STO T 03 CLX 04 STO Z 05 LBL 01 06 SIGN 07 ST+ Z |
08 CLX
09 RCL Z 10 X^2 11 X<>Y 12 ST* Y 13 X<>Y 14 R^ |
15 ST+ Y
16 RDN 17 SQRT 18 FRC 19 X#0? 20 GTO 01 21 FIX 0 |
22 CF 29
23 CLA 24 ARCL L 25 "~^2-" 26 ARCL Y 27 "~*" 28 ARCL Z |
29 "~^2="
30 ARCL T 31 FIX 4 32 SF 29 33 PROMPT 34 GTO 01 35 END |
( 70 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
T | / | m |
Z | / | y |
Y | d | d |
X | m | 0 |
L | / | x |
Example: x2 - 7 y2 = 2
7 ENTER^
2 XEQ "PELL" >>>> "3^2-7*1^2=2"
R/S "45^2-7*17^2=2"
R/S "717^2-7*271^2=2"
R/S ..............................
Note:
-Do not disturb the stack before pressing R/S again.
-Execution time is often prohibitive and the following approach is
better.
2°) x2
- d y2 = 1
-Here, d must not be a perfect square.
-The following routine uses the continued fraction of sqrt(d).
-"PELL1" takes d in X-register and returns the smallest solution x ,
y in registers X , Y.
Data Registers: R00 = d
R01 thru R10: temp
Flags: /
Subroutines: /
01 LBL "PELL1"
02 STO 00 03 ENTER^ 04 SQRT 05 INT 06 STO 01 07 STO 04 08 STO 10 09 X^2 10 - 11 STO 02 12 STO 05 13 CLX 14 STO 06 15 STO 08 |
16 SIGN
17 STO 07 18 STO 09 19 LBL 01 20 RCL 00 21 SQRT 22 RCL 01 23 + 24 RCL 02 25 / 26 INT 27 STO 03 28 RCL 02 29 * 30 RCL 01 |
31 -
32 STO 01 33 X^2 34 CHS 35 RCL 00 36 + 37 RCL 02 38 / 39 STO 02 40 RCL 06 41 RCL 07 42 STO 06 43 RCL 03 44 * 45 + |
46 STO 07
47 RCL 09 48 RCL 10 49 STO 09 50 RCL 03 51 * 52 + 53 STO 10 54 SIGN 55 ST+ 08 56 RCL 02 57 RCL 05 58 X#Y? 59 GTO 01 60 RCL 01 |
61 RCL 04
62 X#Y? 63 GTO 01 64 RCL 08 65 2 66 MOD 67 X#0? 68 GTO 01 69 RCL 06 70 RCL 09 71 END |
( 85 bytes / SIZE 011 )
STACK | INPUTS | OUTPUTS |
Y | / | y |
X | d | x |
Examples:
41 XEQ "PELL1" >>>> x = 2049
---Execution time = 8s---
X<>Y y = 320
61 R/S
>>>> x = 1766319049
---Execution time = 26s---
X<>Y y = 226153980
-Obviously, the first program could not have found this solution!
Reference: