Documentation

Mathlib.NumberTheory.Pell

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 #

Tags #

Pell's equation

TODO #

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₁.instCoeZsqrtd = { coe := Subtype.val }

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

    Equations
    • a.x = (↑a).re
    Instances For

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

      Equations
      • a.y = (↑a).im
      Instances For
        theorem Pell.Solution₁.prop {d : } (a : Pell.Solution₁ d) :
        a.x ^ 2 - d * a.y ^ 2 = 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 : Pell.Solution₁ d) :
        a.x ^ 2 = 1 + d * a.y ^ 2

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

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

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

        theorem Pell.Solution₁.ext {d : } {a b : Pell.Solution₁ d} (hx : a.x = b.x) (hy : a.y = b.y) :
        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) :
          (Pell.Solution₁.mk x y prop).x = x
          @[simp]
          theorem Pell.Solution₁.y_mk {d : } (x y : ) (prop : x ^ 2 - d * y ^ 2 = 1) :
          (Pell.Solution₁.mk x y prop).y = y
          @[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_mul {d : } (a b : Pell.Solution₁ d) :
          (a * b).x = a.x * b.x + d * (a.y * b.y)
          @[simp]
          theorem Pell.Solution₁.y_mul {d : } (a b : Pell.Solution₁ d) :
          (a * b).y = a.x * b.y + a.y * b.x
          @[simp]
          theorem Pell.Solution₁.x_inv {d : } (a : Pell.Solution₁ d) :
          a⁻¹.x = a.x
          @[simp]
          theorem Pell.Solution₁.y_inv {d : } (a : Pell.Solution₁ d) :
          a⁻¹.y = -a.y
          @[simp]
          theorem Pell.Solution₁.x_neg {d : } (a : Pell.Solution₁ d) :
          (-a).x = -a.x
          @[simp]
          theorem Pell.Solution₁.y_neg {d : } (a : Pell.Solution₁ d) :
          (-a).y = -a.y
          theorem Pell.Solution₁.eq_zero_of_d_neg {d : } (h₀ : d < 0) (a : Pell.Solution₁ d) :
          a.x = 0 a.y = 0

          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 : Pell.Solution₁ d) :
          a.x 0

          A solution has x ≠ 0.

          theorem Pell.Solution₁.y_ne_zero_of_one_lt_x {d : } {a : Pell.Solution₁ d} (ha : 1 < a.x) :
          a.y 0

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

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

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

          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 : Pell.Solution₁ d} (ha : a.x = 1) :
          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 : Pell.Solution₁ d} (ha : 0 < a.x) (hb : 0 < b.x) :
          0 < (a * b).x

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

          theorem Pell.Solution₁.y_mul_pos {d : } {a b : Pell.Solution₁ d} (hax : 0 < a.x) (hay : 0 < a.y) (hbx : 0 < b.x) (hby : 0 < b.y) :
          0 < (a * b).y

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

          theorem Pell.Solution₁.x_pow_pos {d : } {a : Pell.Solution₁ d} (hax : 0 < a.x) (n : ) :
          0 < (a ^ n).x

          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 : Pell.Solution₁ d} (hax : 0 < a.x) (hay : 0 < a.y) (n : ) :
          0 < (a ^ n.succ).y

          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 : Pell.Solution₁ d} (hax : 0 < a.x) (hay : 0 < a.y) {n : } (hn : 0 < n) :
          0 < (a ^ n).y

          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 : Pell.Solution₁ d} (hax : 0 < a.x) (n : ) :
          0 < (a ^ n).x

          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 : Pell.Solution₁ d} (hax : 0 < a.x) (hay : 0 < a.y) (n : ) :
          (a ^ n).y.sign = n.sign

          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 : Pell.Solution₁ d) :
          ∃ (b : Pell.Solution₁ d), 0 < b.x 0 b.y 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 : ¬IsSquare d) :
          ∃ (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) ¬IsSquare d

          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 : ¬IsSquare d) :
          ∃ (a : Pell.Solution₁ d), 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 : ¬IsSquare d) :
          ∃ (a : Pell.Solution₁ d), 1 < a.x 0 < a.y

          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.

          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

            A fundamental solution has positive x.

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

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

            If there is a fundamental solution, it is unique.

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

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

            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 : Pell.Solution₁ d} (h : Pell.IsFundamental a) (m n : ) :
            (a ^ m).y < (a ^ n).y 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 : Pell.Solution₁ d} (h : Pell.IsFundamental a) (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 : Pell.Solution₁ d} (h : Pell.IsFundamental a) {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₁ : Pell.Solution₁ d} (h : Pell.IsFundamental a₁) {a : Pell.Solution₁ d} (hax : 1 < a.x) :
            a₁.x a.x

            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₁ : Pell.Solution₁ d} (h : Pell.IsFundamental a₁) {a : Pell.Solution₁ d} (hax : 1 < a.x) (hay : 0 < a.y) :
            a₁.y a.y

            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₁ : Pell.Solution₁ d} (h : Pell.IsFundamental a₁) {a : Pell.Solution₁ d} (hax : 1 < a.x) (hay : 0 < a.y) :
            a.x * a₁.y a.y * a₁.x
            theorem Pell.IsFundamental.mul_inv_y_nonneg {d : } {a₁ : Pell.Solution₁ d} (h : Pell.IsFundamental a₁) {a : Pell.Solution₁ d} (hax : 1 < a.x) (hay : 0 < a.y) :
            0 (a * a₁⁻¹).y

            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₁ : Pell.Solution₁ d} (h : Pell.IsFundamental a₁) {a : Pell.Solution₁ d} (hax : 1 < a.x) (hay : 0 < a.y) :
            0 < (a * a₁⁻¹).x

            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₁ : Pell.Solution₁ d} (h : Pell.IsFundamental a₁) {a : Pell.Solution₁ d} (hax : 1 < a.x) (hay : 0 < a.y) :
            (a * a₁⁻¹).x < a.x

            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₁ : Pell.Solution₁ d} (h : Pell.IsFundamental a₁) {a : Pell.Solution₁ d} (hax : 0 < a.x) (hay : 0 a.y) :
            ∃ (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₁ : Pell.Solution₁ d} (h : Pell.IsFundamental a₁) (a : Pell.Solution₁ d) :
            ∃ (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 : ¬IsSquare d) :
            ∃! a₁ : Pell.Solution₁ d, 1 < a₁.x 0 < a₁.y ∀ (a : Pell.Solution₁ d), ∃ (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 : Pell.Solution₁ d) :
            (1 < a.x 0 < a.y ∀ (b : Pell.Solution₁ d), ∃ (n : ), b = a ^ n b = -a ^ n) Pell.IsFundamental a

            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.