Built with
doc-gen4 , running Lean4.
Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents.
Use
Ctrl+↑ Ctrl+↓ to navigate,
Ctrl+🖱️ to focus.
On Mac, use
Cmd instead of
Ctrl .
/-
Copyright (c) 2014 Jeremy Avigad. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jeremy Avigad, Leonardo de Moura, Floris van Doorn, Amelia Livingston, Yury Kudryashov,
Neil Strickland, Aaron Anderson
Ported by: Matej Penciak
! This file was ported from Lean 3 source module algebra.divisibility.basic
! leanprover-community/mathlib commit e8638a0fcaf73e4500469f368ef9494e495099b3
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.Hom.Group
/-!
# Divisibility
This file defines the basics of the divisibility relation in the context of `(Comm)` `Monoid`s.
## Main definitions
* `semigroupDvd`
## Implementation notes
The divisibility relation is defined for all monoids, and as such, depends on the order of
multiplication if the monoid is not commutative. There are two possible conventions for
divisibility in the noncommutative context, and this relation follows the convention for ordinals,
so `a | b` is defined as `∃ c, b = a * c`.
## Tags
divisibility, divides
-/
variable { α : Type _ }
section Semigroup
variable [ Semigroup α ] { a b c : α }
/-- There are two possible conventions for divisibility, which coincide in a `CommMonoid`.
This matches the convention for ordinals. -/
instance ( priority := 100) semigroupDvd : Dvd α :=
Dvd.mk fun a b => ∃ c , b = a * c
#align semigroup_has_dvd semigroupDvd
-- TODO: this used to not have `c` explicit, but that seems to be important
-- for use with tactics, similar to `Exists.intro`
theorem Dvd.intro : ∀ {α : Type u_1} [inst : Semigroup α ] {a b : α } (c : α ), a * c = b → a ∣ b Dvd.intro ( c : α ) ( h : a * c = b ) : a ∣ b :=
Exists.intro : ∀ {α : Sort ?u.788} {p : α → Prop } (w : α ), p w → Exists p Exists.intro c h . symm : ∀ {α : Sort ?u.796} {a b : α }, a = b → b = a symm
#align dvd.intro Dvd.intro : ∀ {α : Type u_1} [inst : Semigroup α ] {a b : α } (c : α ), a * c = b → a ∣ b Dvd.intro
alias Dvd.intro : ∀ {α : Type u_1} [inst : Semigroup α ] {a b : α } (c : α ), a * c = b → a ∣ b Dvd.intro ← dvd_of_mul_right_eq : ∀ {α : Type u_1} [inst : Semigroup α ] {a b : α } (c : α ), a * c = b → a ∣ b dvd_of_mul_right_eq
#align dvd_of_mul_right_eq dvd_of_mul_right_eq : ∀ {α : Type u_1} [inst : Semigroup α ] {a b : α } (c : α ), a * c = b → a ∣ b dvd_of_mul_right_eq
theorem exists_eq_mul_right_of_dvd : ∀ {α : Type u_1} [inst : Semigroup α ] {a b : α }, a ∣ b → ∃ c , b = a * c exists_eq_mul_right_of_dvd ( h : a ∣ b ) : ∃ c , b = a * c :=
h
#align exists_eq_mul_right_of_dvd exists_eq_mul_right_of_dvd : ∀ {α : Type u_1} [inst : Semigroup α ] {a b : α }, a ∣ b → ∃ c , b = a * c exists_eq_mul_right_of_dvd
theorem Dvd.elim : ∀ {P : Prop } {a b : α }, a ∣ b → (∀ (c : α ), b = a * c → P ) → P Dvd.elim { P : Prop } { a b : α } ( H₁ : a ∣ b ) ( H₂ : ∀ (c : α ), b = a * c → P H₂ : ∀ c , b = a * c → P ) : P :=
Exists.elim : ∀ {α : Sort ?u.1566} {p : α → Prop } {b : Prop }, (∃ x , p x ) → (∀ (a : α ), p a → b ) → b Exists.elim H₁ H₂ : ∀ (c : α ), b = a * c → P H₂
#align dvd.elim Dvd.elim : ∀ {α : Type u_1} [inst : Semigroup α ] {P : Prop } {a b : α }, a ∣ b → (∀ (c : α ), b = a * c → P ) → P Dvd.elim
attribute [ local simp ] mul_assoc mul_comm mul_left_comm
@[trans]
theorem dvd_trans : a ∣ b → b ∣ c → a ∣ c dvd_trans : a ∣ b → b ∣ c → a ∣ c
| ⟨ d , h₁ ⟩, ⟨ e , h₂ ⟩ => ⟨ d * e , h₁ ▸ h₂ . trans : ∀ {α : Sort ?u.2211} {a b c : α }, a = b → b = c → a = c trans <| mul_assoc a d e ⟩
#align dvd_trans dvd_trans : ∀ {α : Type u_1} [inst : Semigroup α ] {a b c : α }, a ∣ b → b ∣ c → a ∣ c dvd_trans
alias dvd_trans : ∀ {α : Type u_1} [inst : Semigroup α ] {a b c : α }, a ∣ b → b ∣ c → a ∣ c dvd_trans ← Dvd.dvd.trans : ∀ {α : Type u_1} [inst : Semigroup α ] {a b c : α }, a ∣ b → b ∣ c → a ∣ c Dvd.dvd.trans
/-- Transitivity of `|` for use in `calc` blocks. -/
instance : IsTrans α Dvd.dvd : {α : Type ?u.2286} → [self : Dvd α ] → α → α → Prop Dvd.dvd :=
⟨ fun _ _ _ => dvd_trans : ∀ {α : Type ?u.2334} [inst : Semigroup α ] {a b c : α }, a ∣ b → b ∣ c → a ∣ c dvd_trans⟩
@[ simp ]
theorem dvd_mul_right : ∀ (a b : α ), a ∣ a * b dvd_mul_right ( a b : α ) : a ∣ a * b :=
Dvd.intro : ∀ {α : Type ?u.2759} [inst : Semigroup α ] {a b : α } (c : α ), a * c = b → a ∣ b Dvd.intro b rfl : ∀ {α : Sort ?u.2778} {a : α }, a = a rfl
#align dvd_mul_right dvd_mul_right
theorem dvd_mul_of_dvd_left : a ∣ b → ∀ (c : α ), a ∣ b * c dvd_mul_of_dvd_left ( h : a ∣ b ) ( c : α ) : a ∣ b * c :=
h . trans : ∀ {α : Type ?u.3188} [inst : Semigroup α ] {a b c : α }, a ∣ b → b ∣ c → a ∣ c trans ( dvd_mul_right : ∀ {α : Type ?u.3215} [inst : Semigroup α ] (a b : α ), a ∣ a * b dvd_mul_right b c )
#align dvd_mul_of_dvd_left dvd_mul_of_dvd_left : ∀ {α : Type u_1} [inst : Semigroup α ] {a b : α }, a ∣ b → ∀ (c : α ), a ∣ b * c dvd_mul_of_dvd_left
alias dvd_mul_of_dvd_left : ∀ {α : Type u_1} [inst : Semigroup α ] {a b : α }, a ∣ b → ∀ (c : α ), a ∣ b * c dvd_mul_of_dvd_left ← Dvd.dvd.mul_right : ∀ {α : Type u_1} [inst : Semigroup α ] {a b : α }, a ∣ b → ∀ (c : α ), a ∣ b * c Dvd.dvd.mul_right
theorem dvd_of_mul_right_dvd : a * b ∣ c → a ∣ c dvd_of_mul_right_dvd ( h : a * b ∣ c ) : a ∣ c :=
( dvd_mul_right : ∀ {α : Type ?u.3590} [inst : Semigroup α ] (a b : α ), a ∣ a * b dvd_mul_right a b ). trans : ∀ {α : Type ?u.3601} [inst : Semigroup α ] {a b c : α }, a ∣ b → b ∣ c → a ∣ c trans h
#align dvd_of_mul_right_dvd dvd_of_mul_right_dvd : ∀ {α : Type u_1} [inst : Semigroup α ] {a b c : α }, a * b ∣ c → a ∣ c dvd_of_mul_right_dvd
section map_dvd
variable { M N : Type _ } [ Monoid M ] [ Monoid N ]
theorem map_dvd : ∀ {F : Type u_1} [inst : MulHomClass F M N ] (f : F ) {a b : M }, a ∣ b → ↑f a ∣ ↑f b map_dvd { F : Type _ } [ MulHomClass F M N ] ( f : F ) { a b } : a ∣ b → f a ∣ f b
| ⟨ c , h ⟩ => ⟨ f c , h . symm : ∀ {α : Sort ?u.4309} {a b : α }, a = b → b = a symm ▸ map_mul : ∀ {M : Type ?u.4321} {N : Type ?u.4322} {F : Type ?u.4320} [inst : Mul M ] [inst_1 : Mul N ] [inst_2 : MulHomClass F M N ]
(f : F ) (x y : M ), ↑f (x * y ) = ↑f x * ↑f y map_mul f a c ⟩
#align map_dvd map_dvd
theorem MulHom.map_dvd : ∀ {M : Type u_1} {N : Type u_2} [inst : Monoid M ] [inst_1 : Monoid N ] (f : M →ₙ* N ) {a b : M }, a ∣ b → ↑f a ∣ ↑f b MulHom.map_dvd ( f : M →ₙ* N ) { a b } : a ∣ b → f a ∣ f b :=
_root_.map_dvd f
#align mul_hom.map_dvd MulHom.map_dvd : ∀ {M : Type u_1} {N : Type u_2} [inst : Monoid M ] [inst_1 : Monoid N ] (f : M →ₙ* N ) {a b : M }, a ∣ b → ↑f a ∣ ↑f b MulHom.map_dvd
theorem MonoidHom.map_dvd : ∀ (f : M →* N ) {a b : M }, a ∣ b → ↑f a ∣ ↑f b MonoidHom.map_dvd ( f : M →* N ) { a b } : a ∣ b → f a ∣ f b :=
_root_.map_dvd f
#align monoid_hom.map_dvd MonoidHom.map_dvd : ∀ {M : Type u_1} {N : Type u_2} [inst : Monoid M ] [inst_1 : Monoid N ] (f : M →* N ) {a b : M }, a ∣ b → ↑f a ∣ ↑f b MonoidHom.map_dvd
end map_dvd
end Semigroup
section Monoid
variable [ Monoid α ] { a b : α }
@[refl, simp ]
theorem dvd_refl : ∀ {α : Type u_1} [inst : Monoid α ] (a : α ), a ∣ a dvd_refl ( a : α ) : a ∣ a :=
Dvd.intro : ∀ {α : Type ?u.6562} [inst : Semigroup α ] {a b : α } (c : α ), a * c = b → a ∣ b Dvd.intro 1 ( mul_one a )
#align dvd_refl dvd_refl : ∀ {α : Type u_1} [inst : Monoid α ] (a : α ), a ∣ a dvd_refl
theorem dvd_rfl : ∀ {a : α }, a ∣ a dvd_rfl : ∀ { a : α }, a ∣ a := fun { a } => dvd_refl : ∀ {α : Type ?u.6931} [inst : Monoid α ] (a : α ), a ∣ a dvd_refl a
#align dvd_rfl dvd_rfl : ∀ {α : Type u_1} [inst : Monoid α ] {a : α }, a ∣ a dvd_rfl
instance : IsRefl α (· ∣ ·) :=
⟨ dvd_refl : ∀ {α : Type ?u.7046} [inst : Monoid α ] (a : α ), a ∣ a dvd_refl⟩
theorem one_dvd : ∀ (a : α ), 1 ∣ a one_dvd ( a : α ) : 1 ∣ a :=
Dvd.intro : ∀ {α : Type ?u.7277} [inst : Semigroup α ] {a b : α } (c : α ), a * c = b → a ∣ b Dvd.intro a ( one_mul a )
#align one_dvd one_dvd : ∀ {α : Type u_1} [inst : Monoid α ] (a : α ), 1 ∣ a one_dvd
theorem dvd_of_eq ( h : a = b ) : a ∣ b := by rw [ h ]
#align dvd_of_eq dvd_of_eq : ∀ {α : Type u_1} [inst : Monoid α ] {a b : α }, a = b → a ∣ b dvd_of_eq
alias dvd_of_eq : ∀ {α : Type u_1} [inst : Monoid α ] {a b : α }, a = b → a ∣ b dvd_of_eq ← Eq.dvd : ∀ {α : Type u_1} [inst : Monoid α ] {a b : α }, a = b → a ∣ b Eq.dvd
#align eq.dvd Eq.dvd : ∀ {α : Type u_1} [inst : Monoid α ] {a b : α }, a = b → a ∣ b Eq.dvd
end Monoid
section CommSemigroup
variable [ CommSemigroup : Type ?u.11087 → Type ?u.11087 CommSemigroup α ] { a b c : α }
theorem Dvd.intro_left : ∀ (c : α ), c * a = b → a ∣ b Dvd.intro_left ( c : α ) ( h : c * a = b ) : a ∣ b :=
Dvd.intro : ∀ {α : Type ?u.8096} [inst : Semigroup α ] {a b : α } (c : α ), a * c = b → a ∣ b Dvd.intro _ ( by rw [ mul_comm ] at h ; apply h )
#align dvd.intro_left Dvd.intro_left
alias Dvd.intro_left ← dvd_of_mul_left_eq
#align dvd_of_mul_left_eq dvd_of_mul_left_eq
theorem exists_eq_mul_left_of_dvd : a ∣ b → ∃ c , b = c * a exists_eq_mul_left_of_dvd ( h : a ∣ b ) : ∃ c , b = c * a :=
Dvd.elim : ∀ {α : Type ?u.8919} [inst : Semigroup α ] {P : Prop } {a b : α }, a ∣ b → (∀ (c : α ), b = a * c → P ) → P Dvd.elim h fun c => fun H1 : b = a * c => Exists.intro : ∀ {α : Sort ?u.9361} {p : α → Prop } (w : α ), p w → Exists p Exists.intro c ( Eq.trans : ∀ {α : Sort ?u.9369} {a b c : α }, a = b → b = c → a = c Eq.trans H1 ( mul_comm a c ))
#align exists_eq_mul_left_of_dvd exists_eq_mul_left_of_dvd : ∀ {α : Type u_1} [inst : CommSemigroup α ] {a b : α }, a ∣ b → ∃ c , b = c * a exists_eq_mul_left_of_dvd
theorem dvd_iff_exists_eq_mul_left : a ∣ b ↔ ∃ c , b = c * a :=
⟨ exists_eq_mul_left_of_dvd : ∀ {α : Type ?u.10035} [inst : CommSemigroup α ] {a b : α }, a ∣ b → ∃ c , b = c * a exists_eq_mul_left_of_dvd, by
rintro ⟨ c , rfl ⟩
exact ⟨ c , mul_comm _ _ ⟩ ⟩
#align dvd_iff_exists_eq_mul_left dvd_iff_exists_eq_mul_left
theorem Dvd.elim_left : ∀ {P : Prop }, a ∣ b → (∀ (c : α ), b = c * a → P ) → P Dvd.elim_left { P : Prop } ( h₁ : a ∣ b ) ( h₂ : ∀ (c : α ), b = c * a → P h₂ : ∀ c , b = c * a → P ) : P :=
Exists.elim : ∀ {α : Sort ?u.10661} {p : α → Prop } {b : Prop }, (∃ x , p x ) → (∀ (a : α ), p a → b ) → b Exists.elim ( exists_eq_mul_left_of_dvd : ∀ {α : Type ?u.10665} [inst : CommSemigroup α ] {a b : α }, a ∣ b → ∃ c , b = c * a exists_eq_mul_left_of_dvd h₁ ) fun c => fun h₃ : b = c * a => h₂ : ∀ (c : α ), b = c * a → P h₂ c h₃
#align dvd.elim_left Dvd.elim_left
@[ simp ]
theorem dvd_mul_left ( a b : α ) : a ∣ b * a :=
Dvd.intro : ∀ {α : Type ?u.11600} [inst : Semigroup α ] {a b : α } (c : α ), a * c = b → a ∣ b Dvd.intro b ( mul_comm a b )
#align dvd_mul_left dvd_mul_left
theorem dvd_mul_of_dvd_right : ∀ {α : Type u_1} [inst : CommSemigroup α ] {a b : α }, a ∣ b → ∀ (c : α ), a ∣ c * b dvd_mul_of_dvd_right ( h : a ∣ b ) ( c : α ) : a ∣ c * b := by
rw [ mul_comm ] ; exact h . mul_right : ∀ {α : Type ?u.12433} [inst : Semigroup α ] {a b : α }, a ∣ b → ∀ (c : α ), a ∣ b * c mul_right _
#align dvd_mul_of_dvd_right dvd_mul_of_dvd_right : ∀ {α : Type u_1} [inst : CommSemigroup α ] {a b : α }, a ∣ b → ∀ (c : α ), a ∣ c * b dvd_mul_of_dvd_right
alias dvd_mul_of_dvd_right : ∀ {α : Type u_1} [inst : CommSemigroup α ] {a b : α }, a ∣ b → ∀ (c : α ), a ∣ c * b dvd_mul_of_dvd_right ← Dvd.dvd.mul_left
attribute [ local simp ] mul_assoc mul_comm mul_left_comm
theorem mul_dvd_mul : ∀ {a b c d : α }, a ∣ b → c ∣ d → a * c ∣ b * d mul_dvd_mul : ∀ { a b c d : α }, a ∣ b → c ∣ d → a * c ∣ b * d
| a , _, c , _, ⟨ e , rfl : ∀ {α : Sort ?u.13391} {a : α }, a = a rfl⟩, ⟨ f , rfl : ∀ {α : Sort ?u.13395} {a : α }, a = a rfl⟩ => ⟨ e * f , by simp ⟩
#align mul_dvd_mul mul_dvd_mul
theorem dvd_of_mul_left_dvd : a * b ∣ c → b ∣ c dvd_of_mul_left_dvd ( h : a * b ∣ c ) : b ∣ c :=
Dvd.elim : ∀ {α : Type ?u.15309} [inst : Semigroup α ] {P : Prop } {a b : α }, a ∣ b → (∀ (c : α ), b = a * c → P ) → P Dvd.elim h fun d ceq => Dvd.intro : ∀ {α : Type ?u.15383} [inst : Semigroup α ] {a b : α } (c : α ), a * c = b → a ∣ b Dvd.intro ( a * d ) ( by simp [ ceq ] )
#align dvd_of_mul_left_dvd dvd_of_mul_left_dvd
end CommSemigroup
section CommMonoid
variable [ CommMonoid : Type ?u.16958 → Type ?u.16958 CommMonoid α ] { a b : α }
theorem mul_dvd_mul_left : ∀ {α : Type u_1} [inst : CommMonoid α ] (a : α ) {b c : α }, b ∣ c → a * b ∣ a * c mul_dvd_mul_left ( a : α ) { b c : α } ( h : b ∣ c ) : a * b ∣ a * c :=
mul_dvd_mul ( dvd_refl : ∀ {α : Type ?u.16813} [inst : Monoid α ] (a : α ), a ∣ a dvd_refl a ) h
#align mul_dvd_mul_left mul_dvd_mul_left : ∀ {α : Type u_1} [inst : CommMonoid α ] (a : α ) {b c : α }, b ∣ c → a * b ∣ a * c mul_dvd_mul_left
theorem mul_dvd_mul_right : a ∣ b → ∀ (c : α ), a * c ∣ b * c mul_dvd_mul_right ( h : a ∣ b ) ( c : α ) : a * c ∣ b * c :=
mul_dvd_mul h ( dvd_refl : ∀ {α : Type ?u.17570} [inst : Monoid α ] (a : α ), a ∣ a dvd_refl c )
#align mul_dvd_mul_right mul_dvd_mul_right : ∀ {α : Type u_1} [inst : CommMonoid α ] {a b : α }, a ∣ b → ∀ (c : α ), a * c ∣ b * c mul_dvd_mul_right
theorem pow_dvd_pow_of_dvd : ∀ {a b : α }, a ∣ b → ∀ (n : ℕ ), a ^ n ∣ b ^ n pow_dvd_pow_of_dvd { a b : α } ( h : a ∣ b ) : ∀ n : ℕ , a ^ n ∣ b ^ n
| 0 => by rw [ pow_zero : ∀ {M : Type ?u.23257} [inst : Monoid M ] (a : M ), a ^ 0 = 1 pow_zero, pow_zero : ∀ {M : Type ?u.23413} [inst : Monoid M ] (a : M ), a ^ 0 = 1 pow_zero]
| n + 1 => by
a ^ (n + 1 ) ∣ b ^ (n + 1 )rw [ a ^ (n + 1 ) ∣ b ^ (n + 1 )pow_succ : ∀ {M : Type ?u.23459} [inst : Monoid M ] (a : M ) (n : ℕ ), a ^ (n + 1 ) = a * a ^ n pow_succ, a ^ (n + 1 ) ∣ b ^ (n + 1 )pow_succ : ∀ {M : Type ?u.23490} [inst : Monoid M ] (a : M ) (n : ℕ ), a ^ (n + 1 ) = a * a ^ n pow_succ]
a ^ (n + 1 ) ∣ b ^ (n + 1 )exact mul_dvd_mul h ( pow_dvd_pow_of_dvd : ∀ {a b : α }, a ∣ b → ∀ (n : ℕ ), a ^ n ∣ b ^ n pow_dvd_pow_of_dvd h n )
#align pow_dvd_pow_of_dvd pow_dvd_pow_of_dvd : ∀ {α : Type u_1} [inst : CommMonoid α ] {a b : α }, a ∣ b → ∀ (n : ℕ ), a ^ n ∣ b ^ n pow_dvd_pow_of_dvd
end CommMonoid