Monoids with normalization functions, gcd, and lcm #
This file defines extra structures on cancel_comm_monoid_with_zeros, including is_domains.
Main Definitions #
normalization_monoidgcd_monoidnormalized_gcd_monoidgcd_monoid_of_gcd,gcd_monoid_of_exists_gcd,normalized_gcd_monoid_of_gcd,normalized_gcd_monoid_of_exists_gcdgcd_monoid_of_lcm,gcd_monoid_of_exists_lcm,normalized_gcd_monoid_of_lcm,normalized_gcd_monoid_of_exists_lcm
For the normalized_gcd_monoid instances on ℕ and ℤ, see ring_theory.int.basic.
Implementation Notes #
-
normalization_monoidis defined by assigning to each element anorm_unitsuch that multiplying by that unit normalizes the monoid, andnormalizeis an idempotent monoid homomorphism. This definition as currently implemented does casework on0. -
gcd_monoidcontains the definitions ofgcdandlcmwith the usual properties. They are both determined up to a unit. -
normalized_gcd_monoidextendsnormalization_monoid, so thegcdandlcmare always normalized. This makesgcds of polynomials easier to work with, but excludes Euclidean domains, and monoids without zero. -
gcd_monoid_of_gcdandnormalized_gcd_monoid_of_gcdnoncomputably construct agcd_monoid(resp.normalized_gcd_monoid) structure just from thegcdand its properties. -
gcd_monoid_of_exists_gcdandnormalized_gcd_monoid_of_exists_gcdnoncomputably construct agcd_monoid(resp.normalized_gcd_monoid) structure just from a proof that any two elements have a (not necessarily normalized)gcd. -
gcd_monoid_of_lcmandnormalized_gcd_monoid_of_lcmnoncomputably construct agcd_monoid(resp.normalized_gcd_monoid) structure just from thelcmand its properties. -
gcd_monoid_of_exists_lcmandnormalized_gcd_monoid_of_exists_lcmnoncomputably construct agcd_monoid(resp.normalized_gcd_monoid) structure just from a proof that any two elements have a (not necessarily normalized)lcm.
TODO #
- Port GCD facts about nats, definition of coprime
- Generalize normalization monoids to commutative (cancellative) monoids with or without zero
Tags #
divisibility, gcd, lcm, normalize
- norm_unit : α → αˣ
- norm_unit_zero : norm_unit 0 = 1
- norm_unit_mul : ∀ {a b : α}, a ≠ 0 → b ≠ 0 → norm_unit (a * b) = (norm_unit a) * norm_unit b
- norm_unit_coe_units : ∀ (u : αˣ), norm_unit ↑u = u⁻¹
Normalization monoid: multiplying with norm_unit gives a normal form for associated
elements.
Maps an element of associates back to the normalized element of its associate class
Equations
- associates.out = quotient.lift ⇑normalize associates.out._proof_1
- gcd : α → α → α
- lcm : α → α → α
- gcd_dvd_left : ∀ (a b : α), gcd a b ∣ a
- gcd_dvd_right : ∀ (a b : α), gcd a b ∣ b
- dvd_gcd : ∀ {a b c : α}, a ∣ c → a ∣ b → a ∣ gcd c b
- gcd_mul_lcm : ∀ (a b : α), associated ((gcd a b) * lcm a b) (a * b)
- lcm_zero_left : ∀ (a : α), lcm 0 a = 0
- lcm_zero_right : ∀ (a : α), lcm a 0 = 0
GCD monoid: a cancel_comm_monoid_with_zero with gcd (greatest common divisor) and
lcm (least common multiple) operations, determined up to a unit. The type class focuses on gcd
and we derive the corresponding lcm facts from gcd.
- to_normalization_monoid : normalization_monoid α
- to_gcd_monoid : gcd_monoid α
- normalize_gcd : ∀ (a b : α), ⇑normalize (gcd a b) = gcd a b
- normalize_lcm : ∀ (a b : α), ⇑normalize (lcm a b) = lcm a b
Normalized GCD monoid: a cancel_comm_monoid_with_zero with normalization and gcd
(greatest common divisor) and lcm (least common multiple) operations. In this setting gcd and
lcm form a bounded lattice on the associated elements where gcd is the infimum, lcm is the
supremum, 1 is bottom, and 0 is top. The type class focuses on gcd and we derive the
corresponding lcm facts from gcd.
Represent a divisor of m * n as a product of a divisor of m and a divisor of n.
Note: In general, this representation is highly non-unique.
Equations
- normalization_monoid_of_unique_units = {norm_unit := λ (x : α), 1, norm_unit_zero := _, norm_unit_mul := _, norm_unit_coe_units := _}
If a monoid's only unit is 1, then it is isomorphic to its associates.
Equations
Define normalization_monoid on a structure from a monoid_hom inverse to associates.mk.
Equations
- normalization_monoid_of_monoid_hom_right_inverse f hinv = {norm_unit := λ (a : α), ite (a = 0) 1 (classical.some _), norm_unit_zero := _, norm_unit_mul := _, norm_unit_coe_units := _}
Define gcd_monoid on a structure just from the gcd and its properties.
Equations
- gcd_monoid_of_gcd gcd gcd_dvd_left gcd_dvd_right dvd_gcd = {gcd := gcd, lcm := λ (a b : α), ite (a = 0) 0 (classical.some _), gcd_dvd_left := gcd_dvd_left, gcd_dvd_right := gcd_dvd_right, dvd_gcd := _, gcd_mul_lcm := _, lcm_zero_left := _, lcm_zero_right := _}
Define normalized_gcd_monoid on a structure just from the gcd and its properties.
Equations
- normalized_gcd_monoid_of_gcd gcd gcd_dvd_left gcd_dvd_right dvd_gcd normalize_gcd = {to_normalization_monoid := {norm_unit := norm_unit infer_instance, norm_unit_zero := _, norm_unit_mul := _, norm_unit_coe_units := _}, to_gcd_monoid := {gcd := gcd, lcm := λ (a b : α), ite (a = 0) 0 (classical.some _), gcd_dvd_left := gcd_dvd_left, gcd_dvd_right := gcd_dvd_right, dvd_gcd := _, gcd_mul_lcm := _, lcm_zero_left := _, lcm_zero_right := _}, normalize_gcd := normalize_gcd, normalize_lcm := _}
Define gcd_monoid on a structure just from the lcm and its properties.
Equations
- gcd_monoid_of_lcm lcm dvd_lcm_left dvd_lcm_right lcm_dvd = let exists_gcd : ∀ (a b : α), lcm a b ∣ a * b := _ in {gcd := λ (a b : α), ite (a = 0) b (ite (b = 0) a (classical.some _)), lcm := lcm, gcd_dvd_left := _, gcd_dvd_right := _, dvd_gcd := _, gcd_mul_lcm := _, lcm_zero_left := _, lcm_zero_right := _}
Define normalized_gcd_monoid on a structure just from the lcm and its properties.
Equations
- normalized_gcd_monoid_of_lcm lcm dvd_lcm_left dvd_lcm_right lcm_dvd normalize_lcm = let exists_gcd : ∀ (a b : α), lcm a b ∣ ⇑normalize (a * b) := _ in {to_normalization_monoid := {norm_unit := norm_unit infer_instance, norm_unit_zero := _, norm_unit_mul := _, norm_unit_coe_units := _}, to_gcd_monoid := {gcd := λ (a b : α), ite (a = 0) (⇑normalize b) (ite (b = 0) (⇑normalize a) (classical.some _)), lcm := lcm, gcd_dvd_left := _, gcd_dvd_right := _, dvd_gcd := _, gcd_mul_lcm := _, lcm_zero_left := _, lcm_zero_right := _}, normalize_gcd := _, normalize_lcm := normalize_lcm}
Define a gcd_monoid structure on a monoid just from the existence of a gcd.
Equations
- gcd_monoid_of_exists_gcd h = gcd_monoid_of_gcd (λ (a b : α), classical.some _) _ _ _
Define a normalized_gcd_monoid structure on a monoid just from the existence of a gcd.
Equations
- normalized_gcd_monoid_of_exists_gcd h = normalized_gcd_monoid_of_gcd (λ (a b : α), ⇑normalize (classical.some _)) _ _ _ _
Define a gcd_monoid structure on a monoid just from the existence of an lcm.
Equations
- gcd_monoid_of_exists_lcm h = gcd_monoid_of_lcm (λ (a b : α), classical.some _) _ _ _
Define a normalized_gcd_monoid structure on a monoid just from the existence of an lcm.
Equations
- normalized_gcd_monoid_of_exists_lcm h = normalized_gcd_monoid_of_lcm (λ (a b : α), ⇑normalize (classical.some _)) _ _ _ _
Equations
- comm_group_with_zero.normalized_gcd_monoid G₀ = {to_normalization_monoid := {norm_unit := λ (x : G₀), dite (x = 0) (λ (h : x = 0), 1) (λ (h : ¬x = 0), (units.mk0 x h)⁻¹), norm_unit_zero := _, norm_unit_mul := _, norm_unit_coe_units := _}, to_gcd_monoid := {gcd := λ (a b : G₀), ite (a = 0 ∧ b = 0) 0 1, lcm := λ (a b : G₀), ite (a = 0 ∨ b = 0) 0 1, gcd_dvd_left := _, gcd_dvd_right := _, dvd_gcd := _, gcd_mul_lcm := _, lcm_zero_left := _, lcm_zero_right := _}, normalize_gcd := _, normalize_lcm := _}