mathlib documentation


Euclidean domains #

THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.

This file introduces Euclidean domains and provides the extended Euclidean algorithm. To be precise, a slightly more general version is provided which is sometimes called a transfinite Euclidean domain and differs in the fact that the degree function need not take values in but can take values in any well-ordered set. Transfinite Euclidean domains were introduced by Motzkin and examples which don't satisfy the classical notion were provided independently by Hiblot and Nagata.

Main definitions #

Main statements #

See algebra.euclidean_domain.basic for most of the theorems about Eucliean domains, including Bézout's lemma.

See algebra.euclidean_domain.instances for that facts that is a Euclidean domain, as is any field.

Notation #

denotes the well founded relation on the Euclidean domain, e.g. in the example of the polynomial ring over a field, p ≺ q for polynomials p and q if and only if the degree of p is less than the degree of q.

Implementation details #

Instead of working with a valuation, euclidean_domain is implemented with the existence of a well founded relation r on the integral domain R, which in the example of would correspond to setting i ≺ j for integers i and j if the absolute value of i is smaller than the absolute value of j.

References #

Tags #

Euclidean domain, transfinite Euclidean domain, Bézout's lemma

structure euclidean_domain (R : Type u) :

A euclidean_domain is an non-trivial commutative ring with a division and a remainder, satisfying b * (a / b) + a % b = a. The definition of a euclidean domain usually includes a valuation function R → ℕ. This definition is slightly generalised to include a well founded relation r with the property that r (a % b) b, instead of a valuation.

Instances of this typeclass
Instances of other typeclasses for euclidean_domain
  • euclidean_domain.has_sizeof_inst
@[protected, instance]
@[protected, instance]
theorem euclidean_domain.div_add_mod {R : Type u} [euclidean_domain R] (a b : R) :
b * (a / b) + a % b = a
theorem euclidean_domain.mod_add_div {R : Type u} [euclidean_domain R] (a b : R) :
a % b + b * (a / b) = a
theorem euclidean_domain.mod_add_div' {R : Type u} [euclidean_domain R] (m k : R) :
m % k + m / k * k = m
theorem euclidean_domain.div_add_mod' {R : Type u} [euclidean_domain R] (m k : R) :
m / k * k + m % k = m
theorem euclidean_domain.mod_eq_sub_mul_div {R : Type u_1} [euclidean_domain R] (a b : R) :
a % b = a - b * (a / b)
theorem euclidean_domain.mod_lt {R : Type u} [euclidean_domain R] (a : R) {b : R} :
theorem euclidean_domain.mul_right_not_lt {R : Type u} [euclidean_domain R] {a : R} (b : R) (h : a 0) :
theorem euclidean_domain.mod_zero {R : Type u} [euclidean_domain R] (a : R) :
a % 0 = a
theorem euclidean_domain.div_zero {R : Type u} [euclidean_domain R] (a : R) :
a / 0 = 0
theorem euclidean_domain.gcd.induction {R : Type u} [euclidean_domain R] {P : R R Prop} (a b : R) :
( (x : R), P 0 x) ( (a b : R), a 0 P (b % a) a P a b) P a b

gcd a b is a (non-unique) element such that gcd a b ∣ a gcd a b ∣ b, and for any element c such that c ∣ a and c ∣ b, then c ∣ gcd a b

def euclidean_domain.xgcd_aux {R : Type u} [euclidean_domain R] [decidable_eq R] :
R R R R R R R × R × R

An implementation of the extended GCD algorithm. At each step we are computing a triple (r, s, t), where r is the next value of the GCD algorithm, to compute the greatest common divisor of the input (say x and y), and s and t are the coefficients in front of x and y to obtain r (i.e. r = s * x + t * y). The function xgcd_aux takes in two triples, and from these recursively computes the next triple:

xgcd_aux (r, s, t) (r', s', t') = xgcd_aux (r' % r, s' - (r' / r) * s, t' - (r' / r) * t) (r, s, t)
theorem euclidean_domain.xgcd_zero_left {R : Type u} [euclidean_domain R] [decidable_eq R] {s t r' s' t' : R} :
euclidean_domain.xgcd_aux 0 s t r' s' t' = (r', s', t')
theorem euclidean_domain.xgcd_aux_rec {R : Type u} [euclidean_domain R] [decidable_eq R] {r s t r' s' t' : R} (h : r 0) :
euclidean_domain.xgcd_aux r s t r' s' t' = euclidean_domain.xgcd_aux (r' % r) (s' - r' / r * s) (t' - r' / r * t) r s t
def euclidean_domain.xgcd {R : Type u} [euclidean_domain R] [decidable_eq R] (x y : R) :
R × R

Use the extended GCD algorithm to generate the a and b values satisfying gcd x y = x * a + y * b.

def euclidean_domain.gcd_a {R : Type u} [euclidean_domain R] [decidable_eq R] (x y : R) :

The extended GCD a value in the equation gcd x y = x * a + y * b.

def euclidean_domain.gcd_b {R : Type u} [euclidean_domain R] [decidable_eq R] (x y : R) :

The extended GCD b value in the equation gcd x y = x * a + y * b.

def euclidean_domain.lcm {R : Type u} [euclidean_domain R] [decidable_eq R] (x y : R) :

lcm a b is a (non-unique) element such that a ∣ lcm a b b ∣ lcm a b, and for any element c such that a ∣ c and b ∣ c, then lcm a b ∣ c