32 lines
677 B
ObjectPascal
32 lines
677 B
ObjectPascal
function solvePell(n: integer): (biginteger, biginteger);
|
|
begin
|
|
var x: biginteger := n.sqrt.floor;
|
|
var (y, z, r) := (x, 1bi, x shl 1);
|
|
var (e1, e2) := (1bi, 0bi);
|
|
var (f1, f2) := (0bi, 1bi);
|
|
|
|
repeat
|
|
y := r * z - y;
|
|
z := (n - y * y) div z;
|
|
r := (x + y) div z;
|
|
|
|
(e1, e2) := (e2, e1 + e2 * r);
|
|
(f1, f2) := (f2, f1 + f2 * r);
|
|
|
|
var (a, b) := (f2 * x + e2, f2);
|
|
if a * a - n * b * b = 1 then
|
|
begin
|
|
result := (a, b);
|
|
exit
|
|
end;
|
|
until false;
|
|
end;
|
|
|
|
begin
|
|
foreach var n in |61, 109, 181, 277| do
|
|
begin
|
|
var (x, y) := solvePell(n);
|
|
writeln('x² - ', n:3, ' * y² = 1 for (x, y) = (', x:21, ',',y:20, ')');
|
|
end;
|
|
end.
|