Divisible Group and rootable group #
In this file, we define a divisible add monoid and a rootable monoid with some basic properties.
Main definition #
DivisibleBy A α
: An additive monoidA
is said to be divisible byα
iff for alln ≠ 0 ∈ α
andy ∈ A
, there is anx ∈ A
such thatn • x = y
. In this file, we adopt a constructive approach, i.e. we ask for an explicitdiv : A → α → A
function such thatdiv a 0 = 0
andn • div a n = a
for alln ≠ 0 ∈ α
.RootableBy A α
: A monoidA
is said to be rootable byα
iff for alln ≠ 0 ∈ α
andy ∈ A
, there is anx ∈ A
such thatx^n = y
. In this file, we adopt a constructive approach, i.e. we ask for an explicitroot : A → α → A
function such thatroot a 0 = 1
and(root a n)ⁿ = a
for alln ≠ 0 ∈ α
.
Main results #
For additive monoids and groups:
divisibleByOfSMulRightSurj
: the constructive definition of divisiblity is implied by the condition thatn • x = a
has solutions for alln ≠ 0
anda ∈ A
.smul_right_surj_of_divisibleBy
: the constructive definition of divisiblity implies the condition thatn • x = a
has solutions for alln ≠ 0
anda ∈ A
.Prod.divisibleBy
:A × B
is divisible for any two divisible additive monoids.Pi.divisibleBy
: any product of divisible additive monoids is divisible.AddGroup.divisibleByIntOfDivisibleByNat
: for additive groups, int divisiblity is implied by nat divisiblity.AddGroup.divisibleByNatOfDivisibleByInt
: for additive groups, nat divisiblity is implied by int divisiblity.AddCommGroup.divisibleByIntOfSMulTopEqTop
: the constructive definition of divisiblity is implied by the condition thatn • A = A
for alln ≠ 0
.AddCommGroup.smul_top_eq_top_of_divisibleBy_int
: the constructive definition of divisiblity implies the condition thatn • A = A
for alln ≠ 0
.divisibleByIntOfCharZero
: any field of characteristic zero is divisible.QuotientAddGroup.divisibleBy
: quotient group of divisible group is divisible.Function.Surjective.divisibleBy
: ifA
is divisible andA →+ B
is surjective, thenB
is divisible.
and their multiplicative counterparts:
rootableByOfPowLeftSurj
: the constructive definition of rootablity is implied by the condition thatxⁿ = y
has solutions for alln ≠ 0
anda ∈ A
.pow_left_surj_of_rootableBy
: the constructive definition of rootablity implies the condition thatxⁿ = y
has solutions for alln ≠ 0
anda ∈ A
.Prod.rootableBy
: any product of two rootable monoids is rootable.Pi.rootableBy
: any product of rootable monoids is rootable.Group.rootableByIntOfRootableByNat
: in groups, int rootablity is implied by nat rootablity.Group.rootableByNatOfRootableByInt
: in groups, nat rootablity is implied by int rootablity.QuotientGroup.rootableBy
: quotient group of rootable group is rootable.Function.Surjective.rootableBy
: ifA
is rootable andA →* B
is surjective, thenB
is rootable.
TODO: Show that divisibility implies injectivity in the category of AddCommGroup
.
An AddMonoid A
is α
-divisible iff n • x = a
has a solution for all n ≠ 0 ∈ α
and a ∈ A
.
Here we adopt a constructive approach where we ask an explicit div : A → α → A
function such that
- div : A → α → A
- div_zero : ∀ (a : A), DivisibleBy.div a 0 = 0
- div_cancel : ∀ {n : α} (a : A), n ≠ 0 → n • DivisibleBy.div a n = a
Instances
A Monoid A
is α
-rootable iff xⁿ = a
has a solution for all n ≠ 0 ∈ α
and a ∈ A
.
Here we adopt a constructive approach where we ask an explicit root : A → α → A
function such that
root a 0 = 1
for alla ∈ A
(root a n)ⁿ = a
for alln ≠ 0 ∈ α
anda ∈ A
.
- root : A → α → A
- root_zero : ∀ (a : A), RootableBy.root a 0 = 1
- root_cancel : ∀ {n : α} (a : A), n ≠ 0 → RootableBy.root a n ^ n = a
Instances
An AddMonoid A
is α
-divisible iff n • _
is a surjective function, i.e. the constructive
version implies the textbook approach.
Equations
- divisibleByOfSMulRightSurj A α H = { div := fun (a : A) (n : α) => if x : n = 0 then 0 else Exists.choose ⋯, div_zero := ⋯, div_cancel := ⋯ }
Instances For
A Monoid A
is α
-rootable iff the pow _ n
function is surjective, i.e. the constructive version
implies the textbook approach.
Equations
- rootableByOfPowLeftSurj A α H = { root := fun (a : A) (n : α) => if x : n = 0 then 1 else Exists.choose ⋯, root_zero := ⋯, root_cancel := ⋯ }
Instances For
Equations
- Pi.divisibleBy B = { div := fun (x : (i : ι) → B i) (n : β) (i : ι) => DivisibleBy.div (x i) n, div_zero := ⋯, div_cancel := ⋯ }
Equations
- Pi.rootableBy B = { root := fun (x : (i : ι) → B i) (n : β) (i : ι) => RootableBy.root (x i) n, root_zero := ⋯, root_cancel := ⋯ }
Equations
- Prod.divisibleBy = { div := fun (p : B × B') (n : β) => (DivisibleBy.div p.1 n, DivisibleBy.div p.2 n), div_zero := ⋯, div_cancel := ⋯ }
Equations
- Prod.rootableBy = { root := fun (p : B × B') (n : β) => (RootableBy.root p.1 n, RootableBy.root p.2 n), root_zero := ⋯, root_cancel := ⋯ }
Equations
- ULift.instDivisibleBy A α = { div := fun (x : ULift.{u_3, u_1} A) (a : α) => { down := DivisibleBy.div x.down a }, div_zero := ⋯, div_cancel := ⋯ }
Equations
- ULift.instRootableBy A α = { root := fun (x : ULift.{u_3, u_1} A) (a : α) => { down := RootableBy.root x.down a }, root_zero := ⋯, root_cancel := ⋯ }
If for all n ≠ 0 ∈ ℤ
, n • A = A
, then A
is divisible.
Equations
- AddCommGroup.divisibleByIntOfSMulTopEqTop A H = { div := fun (a : A) (n : ℤ) => if hn : n = 0 then 0 else Exists.choose ⋯, div_zero := ⋯, div_cancel := ⋯ }
Instances For
Equations
- AddGroup.divisibleByIntOfDivisibleByNat.match_1 motive z h_1 h_2 = Int.casesOn z (fun (a : ℕ) => h_1 a) fun (a : ℕ) => h_2 a
Instances For
An additive group is ℤ
-divisible if it is ℕ
-divisible.
Equations
- One or more equations did not get rendered due to their size.
Instances For
A group is ℤ
-rootable if it is ℕ
-rootable.
Equations
- One or more equations did not get rendered due to their size.
Instances For
An additive group is ℕ
-divisible if it ℤ
-divisible.
Equations
- AddGroup.divisibleByNatOfDivisibleByInt A = { div := fun (a : A) (n : ℕ) => DivisibleBy.div a ↑n, div_zero := ⋯, div_cancel := ⋯ }
Instances For
A group is ℕ
-rootable if it is ℤ
-rootable
Equations
- Group.rootableByNatOfRootableByInt A = { root := fun (a : A) (n : ℕ) => RootableBy.root a ↑n, root_zero := ⋯, root_cancel := ⋯ }
Instances For
If f : A → B
is a surjective homomorphism and A
is α
-divisible, then B
is also
α
-divisible.
Equations
- Function.Surjective.divisibleBy f hf hpow = divisibleByOfSMulRightSurj B α ⋯
Instances For
If f : A → B
is a surjective homomorphism and A
is α
-rootable, then B
is also α
-rootable.
Equations
- Function.Surjective.rootableBy f hf hpow = rootableByOfPowLeftSurj B α ⋯
Instances For
Any quotient group of a divisible group is divisible
Equations
- QuotientAddGroup.divisibleBy B = Function.Surjective.divisibleBy QuotientAddGroup.mk ⋯ ⋯
Any quotient group of a rootable group is rootable.
Equations
- QuotientGroup.rootableBy B = Function.Surjective.rootableBy QuotientGroup.mk ⋯ ⋯