# Pell's Equation #

Pell's Equation is the equation $x^2 - d y^2 = 1$, where $d$ is a positive integer that is not a square, and one is interested in solutions in integers $x$ and $y$.

In this file, we aim at providing all of the essential theory of Pell's Equation for general $d$ (as opposed to the contents of NumberTheory.PellMatiyasevic, which is specific to the case $d = a^2 - 1$ for some $a > 1$).

We begin by defining a type Pell.Solution₁ d for solutions of the equation, show that it has a natural structure as an abelian group, and prove some basic properties.

We then prove the following

Theorem. Let $d$ be a positive integer that is not a square. Then the equation $x^2 - d y^2 = 1$ has a nontrivial (i.e., with $y \ne 0$) solution in integers.

See Pell.exists_of_not_isSquare and Pell.Solution₁.exists_nontrivial_of_not_isSquare.

We then define the fundamental solution to be the solution with smallest $x$ among all solutions satisfying $x > 1$ and $y > 0$. We show that every solution is a power (in the sense of the group structure mentioned above) of the fundamental solution up to a (common) sign, see Pell.IsFundamental.eq_zpow_or_neg_zpow, and that a (positive) solution has this property if and only if it is fundamental, see Pell.pos_generator_iff_fundamental.

## References #

• [K. Ireland, M. Rosen, A classical introduction to modern number theory (Section 17.5)][IrelandRosen1990]

Pell's equation

## TODO #

• Extend to x ^ 2 - d * y ^ 2 = -1 and further generalizations.
• Connect solutions to the continued fraction expansion of √d.

### Group structure of the solution set #

We define a structure of a commutative multiplicative group with distributive negation on the set of all solutions to the Pell equation x^2 - d*y^2 = 1.

The type of such solutions is Pell.Solution₁ d. It corresponds to a pair of integers x and y and a proof that (x, y) is indeed a solution.

The multiplication is given by (x, y) * (x', y') = (x*y' + d*y*y', x*y' + y*x'). This is obtained by mapping (x, y) to x + y*√d and multiplying the results. In fact, we define Pell.Solution₁ d to be ↥(unitary (ℤ√d)) and transport the "commutative group with distributive negation" structure from ↥(unitary (ℤ√d)).

We then set up an API for Pell.Solution₁ d.

theorem Pell.is_pell_solution_iff_mem_unitary {d : } {a : ℤ√d} :
a.re ^ 2 - d * a.im ^ 2 = 1 a unitary (ℤ√d)

An element of ℤ√d has norm one (i.e., a.re^2 - d*a.im^2 = 1) if and only if it is contained in the submonoid of unitary elements.

TODO: merge this result with Pell.isPell_iff_mem_unitary.

Pell.Solution₁ d is the type of solutions to the Pell equation x^2 - d*y^2 = 1. We define this in terms of elements of ℤ√d of norm one.

Equations
Instances For
Equations
Equations
Equations
Equations
• Pell.Solution₁.instCoeSolution₁Zsqrtd = { coe := Subtype.val }
def Pell.Solution₁.x {d : } (a : ) :

The x component of a solution to the Pell equation x^2 - d*y^2 = 1

Equations
• = (a).re
Instances For
def Pell.Solution₁.y {d : } (a : ) :

The y component of a solution to the Pell equation x^2 - d*y^2 = 1

Equations
• = (a).im
Instances For
theorem Pell.Solution₁.prop {d : } (a : ) :
- d * = 1

The proof that a is a solution to the Pell equation x^2 - d*y^2 = 1

theorem Pell.Solution₁.prop_x {d : } (a : ) :
= 1 + d *

An alternative form of the equation, suitable for rewriting x^2.

theorem Pell.Solution₁.prop_y {d : } (a : ) :
d * = - 1

An alternative form of the equation, suitable for rewriting d * y^2.

theorem Pell.Solution₁.ext {d : } {a : } {b : } (hx : ) (hy : ) :
a = b

Two solutions are equal if their x and y components are equal.

def Pell.Solution₁.mk {d : } (x : ) (y : ) (prop : x ^ 2 - d * y ^ 2 = 1) :

Construct a solution from x, y and a proof that the equation is satisfied.

Equations
Instances For
@[simp]
theorem Pell.Solution₁.x_mk {d : } (x : ) (y : ) (prop : x ^ 2 - d * y ^ 2 = 1) :
@[simp]
theorem Pell.Solution₁.y_mk {d : } (x : ) (y : ) (prop : x ^ 2 - d * y ^ 2 = 1) :
@[simp]
theorem Pell.Solution₁.coe_mk {d : } (x : ) (y : ) (prop : x ^ 2 - d * y ^ 2 = 1) :
(Pell.Solution₁.mk x y prop) = { re := x, im := y }
@[simp]
theorem Pell.Solution₁.x_one {d : } :
@[simp]
theorem Pell.Solution₁.y_one {d : } :
@[simp]
theorem Pell.Solution₁.x_mul {d : } (a : ) (b : ) :
@[simp]
theorem Pell.Solution₁.y_mul {d : } (a : ) (b : ) :
@[simp]
theorem Pell.Solution₁.x_inv {d : } (a : ) :
@[simp]
theorem Pell.Solution₁.y_inv {d : } (a : ) :
@[simp]
theorem Pell.Solution₁.x_neg {d : } (a : ) :
@[simp]
theorem Pell.Solution₁.y_neg {d : } (a : ) :
theorem Pell.Solution₁.eq_zero_of_d_neg {d : } (h₀ : d < 0) (a : ) :

When d is negative, then x or y must be zero in a solution.

theorem Pell.Solution₁.x_ne_zero {d : } (h₀ : 0 d) (a : ) :

A solution has x ≠ 0.

theorem Pell.Solution₁.y_ne_zero_of_one_lt_x {d : } {a : } (ha : ) :

A solution with x > 1 must have y ≠ 0.

theorem Pell.Solution₁.d_pos_of_one_lt_x {d : } {a : } (ha : ) :
0 < d

If a solution has x > 1, then d is positive.

theorem Pell.Solution₁.d_nonsquare_of_one_lt_x {d : } {a : } (ha : ) :

If a solution has x > 1, then d is not a square.

theorem Pell.Solution₁.eq_one_of_x_eq_one {d : } (h₀ : d 0) {a : } (ha : ) :
a = 1

A solution with x = 1 is trivial.

A solution is 1 or -1 if and only if y = 0.

theorem Pell.Solution₁.x_mul_pos {d : } {a : } {b : } (ha : ) (hb : ) :

The set of solutions with x > 0 is closed under multiplication.

theorem Pell.Solution₁.y_mul_pos {d : } {a : } {b : } (hax : ) (hay : ) (hbx : ) (hby : ) :

The set of solutions with x and y positive is closed under multiplication.

theorem Pell.Solution₁.x_pow_pos {d : } {a : } (hax : ) (n : ) :

If (x, y) is a solution with x positive, then all its powers with natural exponents have positive x.

theorem Pell.Solution₁.y_pow_succ_pos {d : } {a : } (hax : ) (hay : ) (n : ) :

If (x, y) is a solution with x and y positive, then all its powers with positive natural exponents have positive y.

theorem Pell.Solution₁.y_zpow_pos {d : } {a : } (hax : ) (hay : ) {n : } (hn : 0 < n) :

If (x, y) is a solution with x and y positive, then all its powers with positive exponents have positive y.

theorem Pell.Solution₁.x_zpow_pos {d : } {a : } (hax : ) (n : ) :

If (x, y) is a solution with x positive, then all its powers have positive x.

theorem Pell.Solution₁.sign_y_zpow_eq_sign_of_x_pos_of_y_pos {d : } {a : } (hax : ) (hay : ) (n : ) :

If (x, y) is a solution with x and y positive, then the y component of any power has the same sign as the exponent.

theorem Pell.Solution₁.exists_pos_variant {d : } (h₀ : 0 < d) (a : ) :
∃ (b : ), a {b, b⁻¹, -b, -b⁻¹}

If a is any solution, then one of a, a⁻¹, -a, -a⁻¹ has positive x and nonnegative y.

### Existence of nontrivial solutions #

theorem Pell.exists_of_not_isSquare {d : } (h₀ : 0 < d) (hd : ) :
∃ (x : ) (y : ), x ^ 2 - d * y ^ 2 = 1 y 0

If d is a positive integer that is not a square, then there is a nontrivial solution to the Pell equation x^2 - d*y^2 = 1.

theorem Pell.exists_iff_not_isSquare {d : } (h₀ : 0 < d) :
(∃ (x : ) (y : ), x ^ 2 - d * y ^ 2 = 1 y 0)

If d is a positive integer, then there is a nontrivial solution to the Pell equation x^2 - d*y^2 = 1 if and only if d is not a square.

theorem Pell.Solution₁.exists_nontrivial_of_not_isSquare {d : } (h₀ : 0 < d) (hd : ) :
∃ (a : ), a 1 a -1

If d is a positive integer that is not a square, then there exists a nontrivial solution to the Pell equation x^2 - d*y^2 = 1.

theorem Pell.Solution₁.exists_pos_of_not_isSquare {d : } (h₀ : 0 < d) (hd : ) :
∃ (a : ),

If d is a positive integer that is not a square, then there exists a solution to the Pell equation x^2 - d*y^2 = 1 with x > 1 and y > 0.

### Fundamental solutions #

We define the notion of a fundamental solution of Pell's equation and show that it exists and is unique (when d is positive and non-square) and generates the group of solutions up to sign.

def Pell.IsFundamental {d : } (a : ) :

We define a solution to be fundamental if it has x > 1 and y > 0 and its x is the smallest possible among solutions with x > 1.

Equations
Instances For
theorem Pell.IsFundamental.x_pos {d : } {a : } (h : ) :

A fundamental solution has positive x.

theorem Pell.IsFundamental.d_pos {d : } {a : } (h : ) :
0 < d

If a fundamental solution exists, then d must be positive.

theorem Pell.IsFundamental.d_nonsquare {d : } {a : } (h : ) :

If a fundamental solution exists, then d must be a non-square.

theorem Pell.IsFundamental.subsingleton {d : } {a : } {b : } (ha : ) (hb : ) :
a = b

If there is a fundamental solution, it is unique.

theorem Pell.IsFundamental.exists_of_not_isSquare {d : } (h₀ : 0 < d) (hd : ) :
∃ (a : ),

If d is positive and not a square, then a fundamental solution exists.

theorem Pell.IsFundamental.y_strictMono {d : } {a : } (h : ) :
StrictMono fun (n : ) => Pell.Solution₁.y (a ^ n)

The map sending an integer n to the y-coordinate of a^n for a fundamental solution a is stritcly increasing.

theorem Pell.IsFundamental.zpow_y_lt_iff_lt {d : } {a : } (h : ) (m : ) (n : ) :

If a is a fundamental solution, then (a^m).y < (a^n).y if and only if m < n.

theorem Pell.IsFundamental.zpow_eq_one_iff {d : } {a : } (h : ) (n : ) :
a ^ n = 1 n = 0

The nth power of a fundamental solution is trivial if and only if n = 0.

theorem Pell.IsFundamental.zpow_ne_neg_zpow {d : } {a : } (h : ) {n : } {n' : } :
a ^ n -a ^ n'

A power of a fundamental solution is never equal to the negative of a power of this fundamental solution.

theorem Pell.IsFundamental.x_le_x {d : } {a₁ : } (h : ) {a : } (hax : ) :

The x-coordinate of a fundamental solution is a lower bound for the x-coordinate of any positive solution.

theorem Pell.IsFundamental.y_le_y {d : } {a₁ : } (h : ) {a : } (hax : ) (hay : ) :

The y-coordinate of a fundamental solution is a lower bound for the y-coordinate of any positive solution.

theorem Pell.IsFundamental.x_mul_y_le_y_mul_x {d : } {a₁ : } (h : ) {a : } (hax : ) (hay : ) :
theorem Pell.IsFundamental.mul_inv_y_nonneg {d : } {a₁ : } (h : ) {a : } (hax : ) (hay : ) :

If we multiply a positive solution with the inverse of a fundamental solution, the y-coordinate remains nonnegative.

theorem Pell.IsFundamental.mul_inv_x_pos {d : } {a₁ : } (h : ) {a : } (hax : ) (hay : ) :

If we multiply a positive solution with the inverse of a fundamental solution, the x-coordinate stays positive.

theorem Pell.IsFundamental.mul_inv_x_lt_x {d : } {a₁ : } (h : ) {a : } (hax : ) (hay : ) :

If we multiply a positive solution with the inverse of a fundamental solution, the x-coordinate decreases.

theorem Pell.IsFundamental.eq_pow_of_nonneg {d : } {a₁ : } (h : ) {a : } (hax : ) (hay : ) :
∃ (n : ), a = a₁ ^ n

Any nonnegative solution is a power with nonnegative exponent of a fundamental solution.

theorem Pell.IsFundamental.eq_zpow_or_neg_zpow {d : } {a₁ : } (h : ) (a : ) :
∃ (n : ), a = a₁ ^ n a = -a₁ ^ n

Every solution is, up to a sign, a power of a given fundamental solution.

theorem Pell.existsUnique_pos_generator {d : } (h₀ : 0 < d) (hd : ) :
∃! (a₁ : ), ∀ (a : ), ∃ (n : ), a = a₁ ^ n a = -a₁ ^ n

When d is positive and not a square, then the group of solutions to the Pell equation x^2 - d*y^2 = 1 has a unique positive generator (up to sign).

theorem Pell.pos_generator_iff_fundamental {d : } (a : ) :
( ∀ (b : ), ∃ (n : ), b = a ^ n b = -a ^ n)

A positive solution is a generator (up to sign) of the group of all solutions to the Pell equation x^2 - d*y^2 = 1 if and only if it is a fundamental solution.