RosettaCodeData/Task/Pells-equation/PascalABC.NET/pells-equation.pas

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.