mathlib documentation

algebra.​euclidean_domain

algebra.​euclidean_domain

@[instance]

@[class]
structure euclidean_domain  :
Type u → Type u

A euclidean_domain is an integral_domain 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
@[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_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} :
b ≠ 0 → euclidean_domain.r (a % b) b

theorem euclidean_domain.​mul_right_not_lt {R : Type u} [euclidean_domain R] {a : R} (b : R) :
a ≠ 0 → ¬euclidean_domain.r (a * b) b

theorem euclidean_domain.​mul_div_cancel_left {R : Type u} [euclidean_domain R] {a : R} (b : R) :
a ≠ 0 → a * b / a = b

theorem euclidean_domain.​mul_div_cancel {R : Type u} [euclidean_domain R] (a : R) {b : R} :
b ≠ 0 → a * b / b = a

@[simp]
theorem euclidean_domain.​mod_zero {R : Type u} [euclidean_domain R] (a : R) :
a % 0 = a

@[simp]
theorem euclidean_domain.​mod_eq_zero {R : Type u} [euclidean_domain R] {a b : R} :
a % b = 0 ↔ b ∣ a

@[simp]
theorem euclidean_domain.​mod_self {R : Type u} [euclidean_domain R] (a : R) :
a % a = 0

theorem euclidean_domain.​dvd_mod_iff {R : Type u} [euclidean_domain R] {a b c : R} :
c ∣ b → (c ∣ a % b ↔ c ∣ a)

theorem euclidean_domain.​lt_one {R : Type u} [euclidean_domain R] (a : R) :
euclidean_domain.r a 1 → a = 0

theorem euclidean_domain.​val_dvd_le {R : Type u} [euclidean_domain R] (a b : R) :
b ∣ a → a ≠ 0 → ¬euclidean_domain.r a b

@[simp]
theorem euclidean_domain.​mod_one {R : Type u} [euclidean_domain R] (a : R) :
a % 1 = 0

@[simp]
theorem euclidean_domain.​zero_mod {R : Type u} [euclidean_domain R] (b : R) :
0 % b = 0

@[simp]
theorem euclidean_domain.​div_zero {R : Type u} [euclidean_domain R] (a : R) :
a / 0 = 0

@[simp]
theorem euclidean_domain.​zero_div {R : Type u} [euclidean_domain R] {a : R} :
0 / a = 0

@[simp]
theorem euclidean_domain.​div_self {R : Type u} [euclidean_domain R] {a : R} :
a ≠ 0 → a / a = 1

theorem euclidean_domain.​eq_div_of_mul_eq_left {R : Type u} [euclidean_domain R] {a b c : R} :
b ≠ 0 → a * b = c → a = c / b

theorem euclidean_domain.​eq_div_of_mul_eq_right {R : Type u} [euclidean_domain R] {a b c : R} :
a ≠ 0 → a * b = c → b = c / a

theorem euclidean_domain.​mul_div_assoc {R : Type u} [euclidean_domain R] (x : R) {y z : R} :
z ∣ y → x * y / z = x * (y / z)

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

def euclidean_domain.​gcd {R : Type u} [euclidean_domain R] [decidable_eq R] :
R → R → R

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

Equations
@[simp]

@[simp]

theorem euclidean_domain.​gcd_eq_zero_iff {R : Type u} [euclidean_domain R] [decidable_eq R] {a b : R} :

theorem euclidean_domain.​dvd_gcd {R : Type u} [euclidean_domain R] [decidable_eq R] {a b c : R} :
c ∣ a → c ∣ b → c ∣ euclidean_domain.gcd a b

@[simp]

@[simp]
theorem euclidean_domain.​gcd_self {R : Type u} [euclidean_domain R] [decidable_eq R] (a : R) :

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)
Equations
@[simp]
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} :
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] :
R → R → R × R

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

Equations
def euclidean_domain.​gcd_a {R : Type u} [euclidean_domain R] [decidable_eq R] :
R → R → R

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

Equations
def euclidean_domain.​gcd_b {R : Type u} [euclidean_domain R] [decidable_eq R] :
R → R → R

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

Equations
@[simp]
theorem euclidean_domain.​xgcd_aux_fst {R : Type u} [euclidean_domain R] [decidable_eq R] (x y s t s' t' : R) :

theorem euclidean_domain.​xgcd_aux_P {R : Type u} [euclidean_domain R] [decidable_eq R] (a b : R) {r r' s t s' t' : R} :
P a b (r, s, t) → P a b (r', s', t') → P a b (euclidean_domain.xgcd_aux r s t r' s' t')

def euclidean_domain.​lcm {R : Type u} [euclidean_domain R] [decidable_eq R] :
R → R → 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

Equations
theorem euclidean_domain.​lcm_dvd {R : Type u} [euclidean_domain R] [decidable_eq R] {x y z : R} :
x ∣ z → y ∣ z → euclidean_domain.lcm x y ∣ z

@[simp]
theorem euclidean_domain.​lcm_dvd_iff {R : Type u} [euclidean_domain R] [decidable_eq R] {x y z : R} :

@[simp]

@[simp]

@[simp]
theorem euclidean_domain.​lcm_eq_zero_iff {R : Type u} [euclidean_domain R] [decidable_eq R] {x y : R} :

@[simp]

@[instance]

Equations