Module docstring
{"# Complete lattice structure of subalgebras
In this file we define Algebra.adjoin and the complete lattice structure on subalgebras.
More lemmas about adjoin can be found in Mathlib.RingTheory.Adjoin.Basic.
"}
{"# Complete lattice structure of subalgebras
In this file we define Algebra.adjoin and the complete lattice structure on subalgebras.
More lemmas about adjoin can be found in Mathlib.RingTheory.Adjoin.Basic.
"}
Algebra.adjoin
definition
(s : Set A) : Subalgebra R A
/-- The minimal subalgebra that includes `s`. -/
@[simps toSubsemiring]
def adjoin (s : Set A) : Subalgebra R A :=
{ Subsemiring.closure (Set.rangeSet.range (algebraMap R A) ∪ s) with
algebraMap_mem' := fun r => Subsemiring.subset_closure <| Or.inl ⟨r, rfl⟩ }
Algebra.gc
theorem
: GaloisConnection (adjoin R : Set A → Subalgebra R A) (↑)
protected theorem gc : GaloisConnection (adjoin R : Set A → Subalgebra R A) (↑) := fun s S =>
⟨fun H => le_trans (le_trans Set.subset_union_right Subsemiring.subset_closure) H,
fun H => show Subsemiring.closure (Set.range (algebraMap R A) ∪ s) ≤ S.toSubsemiring from
Subsemiring.closure_le.2 <| Set.union_subset S.range_subset H⟩
Algebra.gi
definition
: GaloisInsertion (adjoin R : Set A → Subalgebra R A) (↑)
/-- Galois insertion between `adjoin` and `coe`. -/
protected def gi : GaloisInsertion (adjoin R : Set A → Subalgebra R A) (↑) where
choice s hs := (adjoin R s).copy s <| le_antisymm (Algebra.gc.le_u_l s) hs
gc := Algebra.gc
le_l_u S := (Algebra.gc (S : Set A) (adjoin R S)).1 <| le_rfl
choice_eq _ _ := Subalgebra.copy_eq _ _ _
Algebra.instCompleteLatticeSubalgebra
instance
: CompleteLattice (Subalgebra R A)
instance : CompleteLattice (Subalgebra R A) where
__ := GaloisInsertion.liftCompleteLattice Algebra.gi
bot := (Algebra.ofId R A).range
bot_le _S := fun _a ⟨_r, hr⟩ => hr ▸ algebraMap_mem _ _
Algebra.sup_def
theorem
(S T : Subalgebra R A) : S ⊔ T = adjoin R (S ∪ T : Set A)
Algebra.sSup_def
theorem
(S : Set (Subalgebra R A)) : sSup S = adjoin R (⋃₀ (SetLike.coe '' S))
theorem sSup_def (S : Set (Subalgebra R A)) : sSup S = adjoin R (⋃₀ (SetLike.coe '' S)) := rfl
Algebra.coe_top
theorem
: (↑(⊤ : Subalgebra R A) : Set A) = Set.univ
Algebra.mem_top
theorem
{x : A} : x ∈ (⊤ : Subalgebra R A)
@[simp]
theorem mem_top {x : A} : x ∈ (⊤ : Subalgebra R A) := Set.mem_univ x
Algebra.top_toSubmodule
theorem
: Subalgebra.toSubmodule (⊤ : Subalgebra R A) = ⊤
@[simp]
theorem top_toSubmodule : Subalgebra.toSubmodule (⊤ : Subalgebra R A) = ⊤ := rfl
Algebra.top_toSubsemiring
theorem
: (⊤ : Subalgebra R A).toSubsemiring = ⊤
@[simp]
theorem top_toSubsemiring : (⊤ : Subalgebra R A).toSubsemiring = ⊤ := rfl
Algebra.top_toSubring
theorem
{R A : Type*} [CommRing R] [Ring A] [Algebra R A] : (⊤ : Subalgebra R A).toSubring = ⊤
@[simp]
theorem top_toSubring {R A : Type*} [CommRing R] [Ring A] [Algebra R A] :
(⊤ : Subalgebra R A).toSubring = ⊤ := rfl
Algebra.toSubmodule_eq_top
theorem
{S : Subalgebra R A} : Subalgebra.toSubmodule S = ⊤ ↔ S = ⊤
@[simp]
theorem toSubmodule_eq_top {S : Subalgebra R A} : Subalgebra.toSubmoduleSubalgebra.toSubmodule S = ⊤ ↔ S = ⊤ :=
Subalgebra.toSubmodule.injective.eq_iff' top_toSubmodule
Algebra.toSubsemiring_eq_top
theorem
{S : Subalgebra R A} : S.toSubsemiring = ⊤ ↔ S = ⊤
@[simp]
theorem toSubsemiring_eq_top {S : Subalgebra R A} : S.toSubsemiring = ⊤ ↔ S = ⊤ :=
Subalgebra.toSubsemiring_injective.eq_iff' top_toSubsemiring
Algebra.toSubring_eq_top
theorem
{R A : Type*} [CommRing R] [Ring A] [Algebra R A] {S : Subalgebra R A} : S.toSubring = ⊤ ↔ S = ⊤
@[simp]
theorem toSubring_eq_top {R A : Type*} [CommRing R] [Ring A] [Algebra R A] {S : Subalgebra R A} :
S.toSubring = ⊤ ↔ S = ⊤ :=
Subalgebra.toSubring_injective.eq_iff' top_toSubring
Algebra.mem_sup_left
theorem
{S T : Subalgebra R A} : ∀ {x : A}, x ∈ S → x ∈ S ⊔ T
theorem mem_sup_left {S T : Subalgebra R A} : ∀ {x : A}, x ∈ S → x ∈ S ⊔ T :=
have : S ≤ S ⊔ T := le_sup_left; (this ·)
Algebra.mem_sup_right
theorem
{S T : Subalgebra R A} : ∀ {x : A}, x ∈ T → x ∈ S ⊔ T
theorem mem_sup_right {S T : Subalgebra R A} : ∀ {x : A}, x ∈ T → x ∈ S ⊔ T :=
have : T ≤ S ⊔ T := le_sup_right; (this ·)
Algebra.mul_mem_sup
theorem
{S T : Subalgebra R A} {x y : A} (hx : x ∈ S) (hy : y ∈ T) : x * y ∈ S ⊔ T
theorem mul_mem_sup {S T : Subalgebra R A} {x y : A} (hx : x ∈ S) (hy : y ∈ T) : x * y ∈ S ⊔ T :=
(S ⊔ T).mul_mem (mem_sup_left hx) (mem_sup_right hy)
Algebra.map_sup
theorem
(f : A →ₐ[R] B) (S T : Subalgebra R A) : (S ⊔ T).map f = S.map f ⊔ T.map f
theorem map_sup (f : A →ₐ[R] B) (S T : Subalgebra R A) : (S ⊔ T).map f = S.map f ⊔ T.map f :=
(Subalgebra.gc_map_comap f).l_sup
Algebra.map_inf
theorem
(f : A →ₐ[R] B) (hf : Function.Injective f) (S T : Subalgebra R A) : (S ⊓ T).map f = S.map f ⊓ T.map f
theorem map_inf (f : A →ₐ[R] B) (hf : Function.Injective f) (S T : Subalgebra R A) :
(S ⊓ T).map f = S.map f ⊓ T.map f := SetLike.coe_injective (Set.image_inter hf)
Algebra.coe_inf
theorem
(S T : Subalgebra R A) : (↑(S ⊓ T) : Set A) = (S ∩ T : Set A)
Algebra.mem_inf
theorem
{S T : Subalgebra R A} {x : A} : x ∈ S ⊓ T ↔ x ∈ S ∧ x ∈ T
@[simp]
theorem mem_inf {S T : Subalgebra R A} {x : A} : x ∈ S ⊓ Tx ∈ S ⊓ T ↔ x ∈ S ∧ x ∈ T := Iff.rfl
Algebra.inf_toSubmodule
theorem
(S T : Subalgebra R A) : toSubmodule (S ⊓ T) = toSubmodule S ⊓ toSubmodule T
@[simp]
theorem inf_toSubmodule (S T : Subalgebra R A) :
toSubmodule (S ⊓ T) = toSubmoduletoSubmodule S ⊓ toSubmodule T := rfl
Algebra.inf_toSubsemiring
theorem
(S T : Subalgebra R A) : (S ⊓ T).toSubsemiring = S.toSubsemiring ⊓ T.toSubsemiring
@[simp]
theorem inf_toSubsemiring (S T : Subalgebra R A) :
(S ⊓ T).toSubsemiring = S.toSubsemiring ⊓ T.toSubsemiring :=
rfl
Algebra.sup_toSubsemiring
theorem
(S T : Subalgebra R A) : (S ⊔ T).toSubsemiring = S.toSubsemiring ⊔ T.toSubsemiring
@[simp]
theorem sup_toSubsemiring (S T : Subalgebra R A) :
(S ⊔ T).toSubsemiring = S.toSubsemiring ⊔ T.toSubsemiring := by
rw [← S.toSubsemiring.closure_eq, ← T.toSubsemiring.closure_eq, ← Subsemiring.closure_union]
simp_rw [sup_def, adjoin_toSubsemiring, Subalgebra.coe_toSubsemiring]
congr 1
rw [Set.union_eq_right]
rintro _ ⟨x, rfl⟩
exact Set.mem_union_left _ (algebraMap_mem S x)
Algebra.coe_sInf
theorem
(S : Set (Subalgebra R A)) : (↑(sInf S) : Set A) = ⋂ s ∈ S, ↑s
@[simp, norm_cast]
theorem coe_sInf (S : Set (Subalgebra R A)) : (↑(sInf S) : Set A) = ⋂ s ∈ S, ↑s :=
sInf_image
Algebra.mem_sInf
theorem
{S : Set (Subalgebra R A)} {x : A} : x ∈ sInf S ↔ ∀ p ∈ S, x ∈ p
theorem mem_sInf {S : Set (Subalgebra R A)} {x : A} : x ∈ sInf Sx ∈ sInf S ↔ ∀ p ∈ S, x ∈ p := by
simp only [← SetLike.mem_coe, coe_sInf, Set.mem_iInter₂]
Algebra.sInf_toSubmodule
theorem
(S : Set (Subalgebra R A)) : Subalgebra.toSubmodule (sInf S) = sInf (Subalgebra.toSubmodule '' S)
@[simp]
theorem sInf_toSubmodule (S : Set (Subalgebra R A)) :
Subalgebra.toSubmodule (sInf S) = sInf (Subalgebra.toSubmoduleSubalgebra.toSubmodule '' S) :=
SetLike.coe_injective <| by simp
Algebra.sInf_toSubsemiring
theorem
(S : Set (Subalgebra R A)) : (sInf S).toSubsemiring = sInf (Subalgebra.toSubsemiring '' S)
@[simp]
theorem sInf_toSubsemiring (S : Set (Subalgebra R A)) :
(sInf S).toSubsemiring = sInf (Subalgebra.toSubsemiringSubalgebra.toSubsemiring '' S) :=
SetLike.coe_injective <| by simp
Algebra.sSup_toSubsemiring
theorem
(S : Set (Subalgebra R A)) (hS : S.Nonempty) : (sSup S).toSubsemiring = sSup (toSubsemiring '' S)
@[simp]
theorem sSup_toSubsemiring (S : Set (Subalgebra R A)) (hS : S.Nonempty) :
(sSup S).toSubsemiring = sSup (toSubsemiringtoSubsemiring '' S) := by
have h : toSubsemiringtoSubsemiring '' S = Subsemiring.closureSubsemiring.closure '' (SetLike.coe '' S) := by
rw [Set.image_image]
congr! with x
exact x.toSubsemiring.closure_eq.symm
rw [h, sSup_image, ← Subsemiring.closure_sUnion, sSup_def, adjoin_toSubsemiring]
congr 1
rw [Set.union_eq_right]
rintro _ ⟨x, rfl⟩
obtain ⟨y, hy⟩ := hS
simp only [Set.mem_sUnion, Set.mem_image, exists_exists_and_eq_and, SetLike.mem_coe]
exact ⟨y, hy, algebraMap_mem y x⟩
Algebra.coe_iInf
theorem
{ι : Sort*} {S : ι → Subalgebra R A} : (↑(⨅ i, S i) : Set A) = ⋂ i, S i
Algebra.mem_iInf
theorem
{ι : Sort*} {S : ι → Subalgebra R A} {x : A} : (x ∈ ⨅ i, S i) ↔ ∀ i, x ∈ S i
theorem mem_iInf {ι : Sort*} {S : ι → Subalgebra R A} {x : A} : (x ∈ ⨅ i, S i) ↔ ∀ i, x ∈ S i := by
simp only [iInf, mem_sInf, Set.forall_mem_range]
Algebra.map_iInf
theorem
{ι : Sort*} [Nonempty ι] (f : A →ₐ[R] B) (hf : Function.Injective f) (s : ι → Subalgebra R A) :
(iInf s).map f = ⨅ (i : ι), (s i).map f
theorem map_iInf {ι : Sort*} [Nonempty ι] (f : A →ₐ[R] B) (hf : Function.Injective f)
(s : ι → Subalgebra R A) : (iInf s).map f = ⨅ (i : ι), (s i).map f := by
apply SetLike.coe_injective
simpa using (Set.injOn_of_injective hf).image_iInter_eq (s := SetLike.coeSetLike.coe ∘ s)
Algebra.iInf_toSubmodule
theorem
{ι : Sort*} (S : ι → Subalgebra R A) : toSubmodule (⨅ i, S i) = ⨅ i, toSubmodule (S i)
@[simp]
theorem iInf_toSubmodule {ι : Sort*} (S : ι → Subalgebra R A) :
toSubmodule (⨅ i, S i) = ⨅ i, toSubmodule (S i) :=
SetLike.coe_injective <| by simp
Algebra.iInf_toSubsemiring
theorem
{ι : Sort*} (S : ι → Subalgebra R A) : (iInf S).toSubsemiring = ⨅ i, (S i).toSubsemiring
@[simp]
theorem iInf_toSubsemiring {ι : Sort*} (S : ι → Subalgebra R A) :
(iInf S).toSubsemiring = ⨅ i, (S i).toSubsemiring := by
simp only [iInf, sInf_toSubsemiring, ← Set.range_comp, Function.comp_def]
Algebra.iSup_toSubsemiring
theorem
{ι : Sort*} [Nonempty ι] (S : ι → Subalgebra R A) : (iSup S).toSubsemiring = ⨆ i, (S i).toSubsemiring
@[simp]
theorem iSup_toSubsemiring {ι : Sort*} [Nonempty ι] (S : ι → Subalgebra R A) :
(iSup S).toSubsemiring = ⨆ i, (S i).toSubsemiring := by
simp only [iSup, Set.range_nonempty, sSup_toSubsemiring, ← Set.range_comp, Function.comp_def]
Algebra.mem_iSup_of_mem
theorem
{ι : Sort*} {S : ι → Subalgebra R A} (i : ι) {x : A} (hx : x ∈ S i) : x ∈ iSup S
lemma mem_iSup_of_mem {ι : Sort*} {S : ι → Subalgebra R A} (i : ι) {x : A} (hx : x ∈ S i) :
x ∈ iSup S :=
le_iSup S i hx
Algebra.iSup_induction
theorem
{ι : Sort*} (S : ι → Subalgebra R A) {motive : A → Prop} {x : A} (mem : x ∈ ⨆ i, S i)
(basic : ∀ i, ∀ a ∈ S i, motive a) (zero : motive 0) (one : motive 1)
(add : ∀ a b, motive a → motive b → motive (a + b)) (mul : ∀ a b, motive a → motive b → motive (a * b))
(algebraMap : ∀ r, motive (algebraMap R A r)) : motive x
@[elab_as_elim]
lemma iSup_induction {ι : Sort*} (S : ι → Subalgebra R A) {motive : A → Prop}
{x : A} (mem : x ∈ ⨆ i, S i)
(basic : ∀ i, ∀ a ∈ S i, motive a)
(zero : motive 0) (one : motive 1)
(add : ∀ a b, motive a → motive b → motive (a + b))
(mul : ∀ a b, motive a → motive b → motive (a * b))
(algebraMap : ∀ r, motive (algebraMap R A r)) : motive x := by
let T : Subalgebra R A :=
{ carrier := {x | motive x}
mul_mem' {a b} := mul a b
one_mem' := one
add_mem' {a b} := add a b
zero_mem' := zero
algebraMap_mem' := algebraMap }
suffices iSup S ≤ T from this mem
rwa [iSup_le_iff]
Algebra.iSup_induction'
theorem
{ι : Sort*} (S : ι → Subalgebra R A) {motive : ∀ x, (x ∈ ⨆ i, S i) → Prop} {x : A} (mem : x ∈ ⨆ i, S i)
(basic : ∀ (i) (x) (hx : x ∈ S i), motive x (mem_iSup_of_mem i hx)) (zero : motive 0 (zero_mem _))
(one : motive 1 (one_mem _)) (add : ∀ x y hx hy, motive x hx → motive y hy → motive (x + y) (add_mem ‹_› ‹_›))
(mul : ∀ x y hx hy, motive x hx → motive y hy → motive (x * y) (mul_mem ‹_› ‹_›))
(algebraMap : ∀ r, motive (algebraMap R A r) (Subalgebra.algebraMap_mem _ ‹_›)) : motive x mem
/-- A dependent version of `Subalgebra.iSup_induction`. -/
@[elab_as_elim]
theorem iSup_induction' {ι : Sort*} (S : ι → Subalgebra R A) {motive : ∀ x, (x ∈ ⨆ i, S i) → Prop}
{x : A} (mem : x ∈ ⨆ i, S i)
(basic : ∀ (i) (x) (hx : x ∈ S i), motive x (mem_iSup_of_mem i hx))
(zero : motive 0 (zero_mem _)) (one : motive 1 (one_mem _))
(add : ∀ x y hx hy, motive x hx → motive y hy → motive (x + y) (add_mem ‹_› ‹_›))
(mul : ∀ x y hx hy, motive x hx → motive y hy → motive (x * y) (mul_mem ‹_› ‹_›))
(algebraMap : ∀ r, motive (algebraMap R A r) (Subalgebra.algebraMap_mem _ ‹_›)) :
motive x mem := by
refine Exists.elim ?_ fun (hx : x ∈ ⨆ i, S i) (hc : motive x hx) ↦ hc
exact iSup_induction S (motive := fun x' ↦ ∃ h, motive x' h) mem
(fun _ _ h ↦ ⟨_, basic _ _ h⟩) ⟨_, zero⟩ ⟨_, one⟩ (fun _ _ h h' ↦ ⟨_, add _ _ _ _ h.2 h'.2⟩)
(fun _ _ h h' ↦ ⟨_, mul _ _ _ _ h.2 h'.2⟩) fun _ ↦ ⟨_, algebraMap _⟩
Algebra.instInhabitedSubalgebra
instance
: Inhabited (Subalgebra R A)
instance : Inhabited (Subalgebra R A) := ⟨⊥⟩
Algebra.mem_bot
theorem
{x : A} : x ∈ (⊥ : Subalgebra R A) ↔ x ∈ Set.range (algebraMap R A)
theorem mem_bot {x : A} : x ∈ (⊥ : Subalgebra R A)x ∈ (⊥ : Subalgebra R A) ↔ x ∈ Set.range (algebraMap R A) := Iff.rfl
Algebra.toSubmodule_bot
theorem
: Subalgebra.toSubmodule (⊥ : Subalgebra R A) = 1
/-- TODO: change proof to `rfl` when fixing https://github.com/leanprover-community/mathlib4/issues/18110. -/
theorem toSubmodule_bot : Subalgebra.toSubmodule (⊥ : Subalgebra R A) = 1 :=
Submodule.one_eq_range.symm
Algebra.coe_bot
theorem
: ((⊥ : Subalgebra R A) : Set A) = Set.range (algebraMap R A)
@[simp]
theorem coe_bot : ((⊥ : Subalgebra R A) : Set A) = Set.range (algebraMap R A) := rfl
AlgHom.range_eq_top
theorem
(f : A →ₐ[R] B) : f.range = (⊤ : Subalgebra R B) ↔ Function.Surjective f
theorem _root_.AlgHom.range_eq_top (f : A →ₐ[R] B) :
f.range = (⊤ : Subalgebra R B) ↔ Function.Surjective f :=
Algebra.eq_top_iff
Algebra.range_ofId
theorem
: (Algebra.ofId R A).range = ⊥
@[simp]
theorem range_ofId : (Algebra.ofId R A).range = ⊥ := rfl
Algebra.range_id
theorem
: (AlgHom.id R A).range = ⊤
@[simp]
theorem range_id : (AlgHom.id R A).range = ⊤ :=
SetLike.coe_injective Set.range_id
Algebra.map_top
theorem
(f : A →ₐ[R] B) : (⊤ : Subalgebra R A).map f = f.range
@[simp]
theorem map_top (f : A →ₐ[R] B) : (⊤ : Subalgebra R A).map f = f.range :=
SetLike.coe_injective Set.image_univ
Algebra.map_bot
theorem
(f : A →ₐ[R] B) : (⊥ : Subalgebra R A).map f = ⊥
@[simp]
theorem map_bot (f : A →ₐ[R] B) : (⊥ : Subalgebra R A).map f = ⊥ :=
Subalgebra.toSubmodule_injective <| by
simpa only [Subalgebra.map_toSubmodule, toSubmodule_bot] using Submodule.map_one _
Algebra.comap_top
theorem
(f : A →ₐ[R] B) : (⊤ : Subalgebra R B).comap f = ⊤
Algebra.toTop
definition
: A →ₐ[R] (⊤ : Subalgebra R A)
/-- `AlgHom` to `⊤ : Subalgebra R A`. -/
def toTop : A →ₐ[R] (⊤ : Subalgebra R A) :=
(AlgHom.id R A).codRestrict ⊤ fun _ => mem_top
Algebra.surjective_algebraMap_iff
theorem
: Function.Surjective (algebraMap R A) ↔ (⊤ : Subalgebra R A) = ⊥
Algebra.bijective_algebraMap_iff
theorem
{R A : Type*} [Field R] [Semiring A] [Nontrivial A] [Algebra R A] :
Function.Bijective (algebraMap R A) ↔ (⊤ : Subalgebra R A) = ⊥
theorem bijective_algebraMap_iff {R A : Type*} [Field R] [Semiring A] [Nontrivial A]
[Algebra R A] : Function.BijectiveFunction.Bijective (algebraMap R A) ↔ (⊤ : Subalgebra R A) = ⊥ :=
⟨fun h => surjective_algebraMap_iff.1 h.2, fun h =>
⟨(algebraMap R A).injective, surjective_algebraMap_iff.2 h⟩⟩
Algebra.botEquivOfInjective
definition
(h : Function.Injective (algebraMap R A)) : (⊥ : Subalgebra R A) ≃ₐ[R] R
/-- The bottom subalgebra is isomorphic to the base ring. -/
noncomputable def botEquivOfInjective (h : Function.Injective (algebraMap R A)) :
(⊥ : Subalgebra R A) ≃ₐ[R] R :=
AlgEquiv.symm <|
AlgEquiv.ofBijective (Algebra.ofId R _)
⟨fun _x _y hxy => h (congr_arg Subtype.val hxy :), fun ⟨_y, x, hx⟩ => ⟨x, Subtype.eq hx⟩⟩
Algebra.botEquiv
definition
(F R : Type*) [Field F] [Semiring R] [Nontrivial R] [Algebra F R] : (⊥ : Subalgebra F R) ≃ₐ[F] F
/-- The bottom subalgebra is isomorphic to the field. -/
@[simps! symm_apply]
noncomputable def botEquiv (F R : Type*) [Field F] [Semiring R] [Nontrivial R] [Algebra F R] :
(⊥ : Subalgebra F R) ≃ₐ[F] F :=
botEquivOfInjective (RingHom.injective _)
Subalgebra.topEquiv
definition
: (⊤ : Subalgebra R A) ≃ₐ[R] A
/-- The top subalgebra is isomorphic to the algebra.
This is the algebra version of `Submodule.topEquiv`. -/
@[simps!]
def topEquiv : (⊤ : Subalgebra R A) ≃ₐ[R] A :=
AlgEquiv.ofAlgHom (Subalgebra.val ⊤) toTop rfl rfl
AlgHom.subsingleton
instance
[Subsingleton (Subalgebra R A)] : Subsingleton (A →ₐ[R] B)
instance _root_.AlgHom.subsingleton [Subsingleton (Subalgebra R A)] : Subsingleton (A →ₐ[R] B) :=
⟨fun f g =>
AlgHom.ext fun a =>
have : a ∈ (⊥ : Subalgebra R A) := Subsingleton.elim (⊤ : Subalgebra R A) ⊥ ▸ mem_top
let ⟨_x, hx⟩ := Set.mem_range.mp (mem_bot.mp this)
hx ▸ (f.commutes _).trans (g.commutes _).symm⟩
AlgEquiv.subsingleton_left
instance
[Subsingleton (Subalgebra R A)] : Subsingleton (A ≃ₐ[R] B)
AlgEquiv.subsingleton_right
instance
[Subsingleton (Subalgebra R B)] : Subsingleton (A ≃ₐ[R] B)
instance _root_.AlgEquiv.subsingleton_right [Subsingleton (Subalgebra R B)] :
Subsingleton (A ≃ₐ[R] B) :=
⟨fun f g => by rw [← f.symm_symm, Subsingleton.elim f.symm g.symm, g.symm_symm]⟩
Subalgebra.instUnique
instance
: Unique (Subalgebra R R)
instance : Unique (Subalgebra R R) :=
{ inferInstanceAs (Inhabited (Subalgebra R R)) with
uniq := by
intro S
refine le_antisymm ?_ bot_le
intro _ _
simp only [Set.mem_range, mem_bot, id.map_eq_self, exists_apply_eq_apply, default] }
Subalgebra.center_eq_top
theorem
(A : Type*) [CommSemiring A] [Algebra R A] : center R A = ⊤
@[simp]
theorem center_eq_top (A : Type*) [CommSemiring A] [Algebra R A] : center R A = ⊤ :=
SetLike.coe_injective (Set.center_eq_univ A)
Subalgebra.centralizer_eq_top_iff_subset
theorem
{s : Set A} : centralizer R s = ⊤ ↔ s ⊆ center R A
@[simp]
theorem centralizer_eq_top_iff_subset {s : Set A} : centralizercentralizer R s = ⊤ ↔ s ⊆ center R A :=
SetLike.ext'_iff.trans Set.centralizer_eq_top_iff_subset
AlgHom.equalizer_eq_top
theorem
{φ ψ : F} : equalizer φ ψ = ⊤ ↔ φ = ψ
@[simp]
theorem equalizer_eq_top {φ ψ : F} : equalizerequalizer φ ψ = ⊤ ↔ φ = ψ := by
simp [SetLike.ext_iff, DFunLike.ext_iff]
AlgHom.equalizer_same
theorem
(φ : F) : equalizer φ φ = ⊤
@[simp]
theorem equalizer_same (φ : F) : equalizer φ φ = ⊤ := equalizer_eq_top.2 rfl
AlgHom.eqOn_sup
theorem
{φ ψ : F} {S T : Subalgebra R A} (hS : Set.EqOn φ ψ S) (hT : Set.EqOn φ ψ T) : Set.EqOn φ ψ ↑(S ⊔ T)
theorem eqOn_sup {φ ψ : F} {S T : Subalgebra R A} (hS : Set.EqOn φ ψ S) (hT : Set.EqOn φ ψ T) :
Set.EqOn φ ψ ↑(S ⊔ T) := by
rw [← le_equalizer] at hS hT ⊢
exact sup_le hS hT
AlgHom.ext_on_codisjoint
theorem
{φ ψ : F} {S T : Subalgebra R A} (hST : Codisjoint S T) (hS : Set.EqOn φ ψ S) (hT : Set.EqOn φ ψ T) : φ = ψ
theorem ext_on_codisjoint {φ ψ : F} {S T : Subalgebra R A} (hST : Codisjoint S T)
(hS : Set.EqOn φ ψ S) (hT : Set.EqOn φ ψ T) : φ = ψ :=
DFunLike.ext _ _ fun _ ↦ eqOn_sup hS hT <| hST.eq_top.symm ▸ trivial
Subalgebra.map_comap_eq
theorem
(f : A →ₐ[R] B) (S : Subalgebra R B) : (S.comap f).map f = S ⊓ f.range
theorem map_comap_eq (f : A →ₐ[R] B) (S : Subalgebra R B) : (S.comap f).map f = S ⊓ f.range :=
SetLike.coe_injective Set.image_preimage_eq_inter_range
Subalgebra.map_comap_eq_self
theorem
{f : A →ₐ[R] B} {S : Subalgebra R B} (h : S ≤ f.range) : (S.comap f).map f = S
theorem map_comap_eq_self
{f : A →ₐ[R] B} {S : Subalgebra R B} (h : S ≤ f.range) : (S.comap f).map f = S := by
simpa only [inf_of_le_left h] using map_comap_eq f S
Subalgebra.map_comap_eq_self_of_surjective
theorem
{f : A →ₐ[R] B} (hf : Function.Surjective f) (S : Subalgebra R B) : (S.comap f).map f = S
theorem map_comap_eq_self_of_surjective
{f : A →ₐ[R] B} (hf : Function.Surjective f) (S : Subalgebra R B) : (S.comap f).map f = S :=
map_comap_eq_self <| by simp [(AlgHom.range_eq_top f).2 hf]
Algebra.subset_adjoin
theorem
: s ⊆ adjoin R s
@[aesop safe 20 apply (rule_sets := [SetLike])]
theorem subset_adjoin : s ⊆ adjoin R s :=
Algebra.gc.le_u_l s
Algebra.adjoin_le
theorem
{S : Subalgebra R A} (H : s ⊆ S) : adjoin R s ≤ S
theorem adjoin_le {S : Subalgebra R A} (H : s ⊆ S) : adjoin R s ≤ S :=
Algebra.gc.l_le H
Algebra.adjoin_singleton_le
theorem
{S : Subalgebra R A} {a : A} (H : a ∈ S) : adjoin R { a } ≤ S
theorem adjoin_singleton_le {S : Subalgebra R A} {a : A} (H : a ∈ S) : adjoin R {a} ≤ S :=
adjoin_le (Set.singleton_subset_iff.mpr H)
Algebra.adjoin_eq_sInf
theorem
: adjoin R s = sInf {p : Subalgebra R A | s ⊆ p}
theorem adjoin_eq_sInf : adjoin R s = sInf { p : Subalgebra R A | s ⊆ p } :=
le_antisymm (le_sInf fun _ h => adjoin_le h) (sInf_le subset_adjoin)
Algebra.adjoin_le_iff
theorem
{S : Subalgebra R A} : adjoin R s ≤ S ↔ s ⊆ S
theorem adjoin_le_iff {S : Subalgebra R A} : adjoinadjoin R s ≤ S ↔ s ⊆ S :=
Algebra.gc _ _
Algebra.adjoin_mono
theorem
(H : s ⊆ t) : adjoin R s ≤ adjoin R t
theorem adjoin_mono (H : s ⊆ t) : adjoin R s ≤ adjoin R t :=
Algebra.gc.monotone_l H
Algebra.adjoin_eq_of_le
theorem
(S : Subalgebra R A) (h₁ : s ⊆ S) (h₂ : S ≤ adjoin R s) : adjoin R s = S
theorem adjoin_eq_of_le (S : Subalgebra R A) (h₁ : s ⊆ S) (h₂ : S ≤ adjoin R s) : adjoin R s = S :=
le_antisymm (adjoin_le h₁) h₂
Algebra.adjoin_eq
theorem
(S : Subalgebra R A) : adjoin R ↑S = S
theorem adjoin_eq (S : Subalgebra R A) : adjoin R ↑S = S :=
adjoin_eq_of_le _ (Set.Subset.refl _) subset_adjoin
Algebra.adjoin_iUnion
theorem
{α : Type*} (s : α → Set A) : adjoin R (Set.iUnion s) = ⨆ i : α, adjoin R (s i)
theorem adjoin_iUnion {α : Type*} (s : α → Set A) :
adjoin R (Set.iUnion s) = ⨆ i : α, adjoin R (s i) :=
(@Algebra.gc R A _ _ _).l_iSup
Algebra.adjoin_attach_biUnion
theorem
[DecidableEq A] {α : Type*} {s : Finset α} (f : s → Finset A) :
adjoin R (s.attach.biUnion f : Set A) = ⨆ x, adjoin R (f x)
theorem adjoin_attach_biUnion [DecidableEq A] {α : Type*} {s : Finset α} (f : s → Finset A) :
adjoin R (s.attach.biUnion f : Set A) = ⨆ x, adjoin R (f x) := by simp [adjoin_iUnion]
Algebra.adjoin_induction
theorem
{p : (x : A) → x ∈ adjoin R s → Prop} (mem : ∀ (x) (hx : x ∈ s), p x (subset_adjoin hx))
(algebraMap : ∀ r, p (algebraMap R A r) (algebraMap_mem _ r))
(add : ∀ x y hx hy, p x hx → p y hy → p (x + y) (add_mem hx hy))
(mul : ∀ x y hx hy, p x hx → p y hy → p (x * y) (mul_mem hx hy)) {x : A} (hx : x ∈ adjoin R s) : p x hx
@[elab_as_elim]
theorem adjoin_induction {p : (x : A) → x ∈ adjoin R s → Prop}
(mem : ∀ (x) (hx : x ∈ s), p x (subset_adjoin hx))
(algebraMap : ∀ r, p (algebraMap R A r) (algebraMap_mem _ r))
(add : ∀ x y hx hy, p x hx → p y hy → p (x + y) (add_mem hx hy))
(mul : ∀ x y hx hy, p x hx → p y hy → p (x * y) (mul_mem hx hy))
{x : A} (hx : x ∈ adjoin R s) : p x hx :=
let S : Subalgebra R A :=
{ carrier := { x | ∃ hx, p x hx }
mul_mem' := by rintro _ _ ⟨_, hpx⟩ ⟨_, hpy⟩; exact ⟨_, mul _ _ _ _ hpx hpy⟩
add_mem' := by rintro _ _ ⟨_, hpx⟩ ⟨_, hpy⟩; exact ⟨_, add _ _ _ _ hpx hpy⟩
algebraMap_mem' := fun r ↦ ⟨_, algebraMap r⟩ }
adjoin_le (S := S) (fun y hy ↦ ⟨subset_adjoin hy, mem y hy⟩) hx |>.elim fun _ ↦ _root_.id
Algebra.adjoin_induction₂
theorem
{s : Set A} {p : (x y : A) → x ∈ adjoin R s → y ∈ adjoin R s → Prop}
(mem_mem : ∀ (x) (y) (hx : x ∈ s) (hy : y ∈ s), p x y (subset_adjoin hx) (subset_adjoin hy))
(algebraMap_both : ∀ r₁ r₂, p (algebraMap R A r₁) (algebraMap R A r₂) (algebraMap_mem _ r₁) (algebraMap_mem _ r₂))
(algebraMap_left : ∀ (r) (x) (hx : x ∈ s), p (algebraMap R A r) x (algebraMap_mem _ r) (subset_adjoin hx))
(algebraMap_right : ∀ (r) (x) (hx : x ∈ s), p x (algebraMap R A r) (subset_adjoin hx) (algebraMap_mem _ r))
(add_left : ∀ x y z hx hy hz, p x z hx hz → p y z hy hz → p (x + y) z (add_mem hx hy) hz)
(add_right : ∀ x y z hx hy hz, p x y hx hy → p x z hx hz → p x (y + z) hx (add_mem hy hz))
(mul_left : ∀ x y z hx hy hz, p x z hx hz → p y z hy hz → p (x * y) z (mul_mem hx hy) hz)
(mul_right : ∀ x y z hx hy hz, p x y hx hy → p x z hx hz → p x (y * z) hx (mul_mem hy hz)) {x y : A}
(hx : x ∈ adjoin R s) (hy : y ∈ adjoin R s) : p x y hx hy
/-- Induction principle for the algebra generated by a set `s`: show that `p x y` holds for any
`x y ∈ adjoin R s` given that it holds for `x y ∈ s` and that it satisfies a number of
natural properties. -/
@[elab_as_elim]
theorem adjoin_induction₂ {s : Set A} {p : (x y : A) → x ∈ adjoin R s → y ∈ adjoin R s → Prop}
(mem_mem : ∀ (x) (y) (hx : x ∈ s) (hy : y ∈ s), p x y (subset_adjoin hx) (subset_adjoin hy))
(algebraMap_both : ∀ r₁ r₂, p (algebraMap R A r₁) (algebraMap R A r₂) (algebraMap_mem _ r₁)
(algebraMap_mem _ r₂))
(algebraMap_left : ∀ (r) (x) (hx : x ∈ s), p (algebraMap R A r) x (algebraMap_mem _ r)
(subset_adjoin hx))
(algebraMap_right : ∀ (r) (x) (hx : x ∈ s), p x (algebraMap R A r) (subset_adjoin hx)
(algebraMap_mem _ r))
(add_left : ∀ x y z hx hy hz, p x z hx hz → p y z hy hz → p (x + y) z (add_mem hx hy) hz)
(add_right : ∀ x y z hx hy hz, p x y hx hy → p x z hx hz → p x (y + z) hx (add_mem hy hz))
(mul_left : ∀ x y z hx hy hz, p x z hx hz → p y z hy hz → p (x * y) z (mul_mem hx hy) hz)
(mul_right : ∀ x y z hx hy hz, p x y hx hy → p x z hx hz → p x (y * z) hx (mul_mem hy hz))
{x y : A} (hx : x ∈ adjoin R s) (hy : y ∈ adjoin R s) :
p x y hx hy := by
induction hy using adjoin_induction with
| mem z hz => induction hx using adjoin_induction with
| mem _ h => exact mem_mem _ _ h hz
| algebraMap _ => exact algebraMap_left _ _ hz
| mul _ _ _ _ h₁ h₂ => exact mul_left _ _ _ _ _ _ h₁ h₂
| add _ _ _ _ h₁ h₂ => exact add_left _ _ _ _ _ _ h₁ h₂
| algebraMap r =>
induction hx using adjoin_induction with
| mem _ h => exact algebraMap_right _ _ h
| algebraMap _ => exact algebraMap_both _ _
| mul _ _ _ _ h₁ h₂ => exact mul_left _ _ _ _ _ _ h₁ h₂
| add _ _ _ _ h₁ h₂ => exact add_left _ _ _ _ _ _ h₁ h₂
| mul _ _ _ _ h₁ h₂ => exact mul_right _ _ _ _ _ _ h₁ h₂
| add _ _ _ _ h₁ h₂ => exact add_right _ _ _ _ _ _ h₁ h₂
Algebra.adjoin_adjoin_coe_preimage
theorem
{s : Set A} : adjoin R (((↑) : adjoin R s → A) ⁻¹' s) = ⊤
@[simp]
theorem adjoin_adjoin_coe_preimage {s : Set A} : adjoin R (((↑) : adjoin R s → A) ⁻¹' s) = ⊤ := by
refine eq_top_iff.2 fun ⟨x, hx⟩ ↦
adjoin_induction (fun a ha ↦ ?_) (fun r ↦ ?_) (fun _ _ _ _ ↦ ?_) (fun _ _ _ _ ↦ ?_) hx
· exact subset_adjoin ha
· exact Subalgebra.algebraMap_mem _ r
· exact Subalgebra.add_mem _
· exact Subalgebra.mul_mem _
Algebra.adjoin_union
theorem
(s t : Set A) : adjoin R (s ∪ t) = adjoin R s ⊔ adjoin R t
theorem adjoin_union (s t : Set A) : adjoin R (s ∪ t) = adjoinadjoin R s ⊔ adjoin R t :=
(Algebra.gc : GaloisConnection _ ((↑) : Subalgebra R A → Set A)).l_sup
Algebra.adjoin_empty
theorem
: adjoin R (∅ : Set A) = ⊥
@[simp]
theorem adjoin_empty : adjoin R (∅ : Set A) = ⊥ := Algebra.gc.l_bot
Algebra.adjoin_univ
theorem
: adjoin R (Set.univ : Set A) = ⊤
@[simp]
theorem adjoin_univ : adjoin R (Set.univ : Set A) = ⊤ := Algebra.gi.l_top
Algebra.adjoin_singleton_algebraMap
theorem
(x : R) : adjoin R {algebraMap R A x} = ⊥
@[simp]
theorem adjoin_singleton_algebraMap (x : R) : adjoin R {algebraMap R A x} = ⊥ :=
bot_unique <| adjoin_singleton_le <| Subalgebra.algebraMap_mem _ _
Algebra.adjoin_singleton_natCast
theorem
(n : ℕ) : adjoin R {(n : A)} = ⊥
@[simp]
theorem adjoin_singleton_natCast (n : ℕ) : adjoin R {(n : A)} = ⊥ := by
simpa using adjoin_singleton_algebraMap A (n : R)
Algebra.adjoin_singleton_zero
theorem
: adjoin R ({0} : Set A) = ⊥
@[simp]
theorem adjoin_singleton_zero : adjoin R ({0} : Set A) = ⊥ :=
mod_cast adjoin_singleton_natCast R A 0
Algebra.adjoin_singleton_one
theorem
: adjoin R ({ 1 } : Set A) = ⊥
@[simp]
theorem adjoin_singleton_one : adjoin R ({1} : Set A) = ⊥ :=
mod_cast adjoin_singleton_natCast R A 1
Algebra.adjoin_insert_algebraMap
theorem
(x : R) (s : Set A) : adjoin R (insert (algebraMap R A x) s) = adjoin R s
@[simp]
theorem adjoin_insert_algebraMap (x : R) (s : Set A) :
adjoin R (insert (algebraMap R A x) s) = adjoin R s := by
rw [Set.insert_eq, adjoin_union]
simp
Algebra.adjoin_insert_natCast
theorem
(n : ℕ) (s : Set A) : adjoin R (insert (n : A) s) = adjoin R s
@[simp]
theorem adjoin_insert_natCast (n : ℕ) (s : Set A) : adjoin R (insert (n : A) s) = adjoin R s :=
mod_cast adjoin_insert_algebraMap (n : R) s
Algebra.adjoin_insert_zero
theorem
(s : Set A) : adjoin R (insert 0 s) = adjoin R s
@[simp]
theorem adjoin_insert_zero (s : Set A) : adjoin R (insert 0 s) = adjoin R s :=
mod_cast adjoin_insert_natCast R 0 s
Algebra.adjoin_insert_one
theorem
(s : Set A) : adjoin R (insert 1 s) = adjoin R s
@[simp]
theorem adjoin_insert_one (s : Set A) : adjoin R (insert 1 s) = adjoin R s :=
mod_cast adjoin_insert_natCast R 1 s
Algebra.adjoin_eq_span
theorem
: Subalgebra.toSubmodule (adjoin R s) = span R (Submonoid.closure s)
theorem adjoin_eq_span : Subalgebra.toSubmodule (adjoin R s) = span R (Submonoid.closure s) := by
apply le_antisymm
· intro r hr
rcases Subsemiring.mem_closure_iff_exists_list.1 hr with ⟨L, HL, rfl⟩
clear hr
induction' L with hd tl ih
· exact zero_mem _
rw [List.forall_mem_cons] at HL
rw [List.map_cons, List.sum_cons]
refine Submodule.add_mem _ ?_ (ih HL.2)
replace HL := HL.1
clear ih tl
suffices ∃ (z r : _) (_hr : r ∈ Submonoid.closure s), z • r = List.prod hd by
rcases this with ⟨z, r, hr, hzr⟩
rw [← hzr]
exact smul_mem _ _ (subset_span hr)
induction' hd with hd tl ih
· exact ⟨1, 1, (Submonoid.closure s).one_mem', one_smul _ _⟩
rw [List.forall_mem_cons] at HL
rcases ih HL.2 with ⟨z, r, hr, hzr⟩
rw [List.prod_cons, ← hzr]
rcases HL.1 with (⟨hd, rfl⟩ | hs)
· refine ⟨hd * z, r, hr, ?_⟩
rw [Algebra.smul_def, Algebra.smul_def, (algebraMap _ _).map_mul, _root_.mul_assoc]
· exact
⟨z, hd * r, Submonoid.mul_mem _ (Submonoid.subset_closure hs) hr,
(mul_smul_comm _ _ _).symm⟩
refine span_le.2 ?_
change Submonoid.closure s ≤ (adjoin R s).toSubsemiring.toSubmonoid
exact Submonoid.closure_le.2 subset_adjoin
Algebra.span_le_adjoin
theorem
(s : Set A) : span R s ≤ Subalgebra.toSubmodule (adjoin R s)
theorem span_le_adjoin (s : Set A) : span R s ≤ Subalgebra.toSubmodule (adjoin R s) :=
span_le.mpr subset_adjoin
Algebra.adjoin_eq_span_of_subset
theorem
{s : Set A} (hs : ↑(Submonoid.closure s) ⊆ (span R s : Set A)) : Subalgebra.toSubmodule (adjoin R s) = span R s
theorem adjoin_eq_span_of_subset {s : Set A} (hs : ↑(Submonoid.closure s) ⊆ (span R s : Set A)) :
Subalgebra.toSubmodule (adjoin R s) = span R s :=
le_antisymm ((adjoin_toSubmodule_le R).mpr hs) (span_le_adjoin R s)
Algebra.adjoin_span
theorem
{s : Set A} : adjoin R (Submodule.span R s : Set A) = adjoin R s
@[simp]
theorem adjoin_span {s : Set A} : adjoin R (Submodule.span R s : Set A) = adjoin R s :=
le_antisymm (adjoin_le (span_le_adjoin _ _)) (adjoin_mono Submodule.subset_span)
Algebra.adjoin_image
theorem
(f : A →ₐ[R] B) (s : Set A) : adjoin R (f '' s) = (adjoin R s).map f
theorem adjoin_image (f : A →ₐ[R] B) (s : Set A) : adjoin R (f '' s) = (adjoin R s).map f :=
le_antisymm (adjoin_le <| Set.image_subset _ subset_adjoin) <|
Subalgebra.map_le.2 <| adjoin_le <| Set.image_subset_iff.1 <| by
-- Porting note: I don't understand how this worked in Lean 3 with just `subset_adjoin`
simp only [Set.image_id', coe_carrier_toSubmonoid, Subalgebra.coe_toSubsemiring,
Subalgebra.coe_comap]
exact fun x hx => subset_adjoin ⟨x, hx, rfl⟩
Algebra.adjoin_insert_adjoin
theorem
(x : A) : adjoin R (insert x ↑(adjoin R s)) = adjoin R (insert x s)
@[simp]
theorem adjoin_insert_adjoin (x : A) : adjoin R (insert x ↑(adjoin R s)) = adjoin R (insert x s) :=
le_antisymm
(adjoin_le
(Set.insert_subset_iff.mpr
⟨subset_adjoin (Set.mem_insert _ _), adjoin_mono (Set.subset_insert _ _)⟩))
(Algebra.adjoin_mono (Set.insert_subset_insert Algebra.subset_adjoin))
Algebra.mem_adjoin_of_map_mul
theorem
{s} {x : A} {f : A →ₗ[R] B} (hf : ∀ a₁ a₂, f (a₁ * a₂) = f a₁ * f a₂) (h : x ∈ adjoin R s) :
f x ∈ adjoin R (f '' (s ∪ { 1 }))
theorem mem_adjoin_of_map_mul {s} {x : A} {f : A →ₗ[R] B} (hf : ∀ a₁ a₂, f (a₁ * a₂) = f a₁ * f a₂)
(h : x ∈ adjoin R s) : f x ∈ adjoin R (f '' (s ∪ {1})) := by
induction h using adjoin_induction with
| mem a ha => exact subset_adjoin ⟨a, ⟨Set.subset_union_left ha, rfl⟩⟩
| algebraMap r =>
have : f 1 ∈ adjoin R (f '' (s ∪ {1})) :=
subset_adjoin ⟨1, ⟨Set.subset_union_right <| Set.mem_singleton 1, rfl⟩⟩
convert Subalgebra.smul_mem (adjoin R (f '' (s ∪ {1}))) this r
rw [algebraMap_eq_smul_one]
exact f.map_smul _ _
| add y z _ _ hy hz => simpa [hy, hz] using Subalgebra.add_mem _ hy hz
| mul y z _ _ hy hz => simpa [hf, hy, hz] using Subalgebra.mul_mem _ hy hz
Algebra.adjoin_le_centralizer_centralizer
theorem
(s : Set A) : adjoin R s ≤ Subalgebra.centralizer R (Subalgebra.centralizer R s)
lemma adjoin_le_centralizer_centralizer (s : Set A) :
adjoin R s ≤ Subalgebra.centralizer R (Subalgebra.centralizer R s) :=
adjoin_le Set.subset_centralizer_centralizer
Algebra.adjoinCommSemiringOfComm
abbrev
{s : Set A} (hcomm : ∀ a ∈ s, ∀ b ∈ s, a * b = b * a) : CommSemiring (adjoin R s)
/-- If all elements of `s : Set A` commute pairwise, then `adjoin s` is a commutative semiring. -/
abbrev adjoinCommSemiringOfComm {s : Set A} (hcomm : ∀ a ∈ s, ∀ b ∈ s, a * b = b * a) :
CommSemiring (adjoin R s) :=
{ (adjoin R s).toSemiring with
mul_comm := fun ⟨_, h₁⟩ ⟨_, h₂⟩ ↦
have := adjoin_le_centralizer_centralizer R s
Subtype.ext <| Set.centralizer_centralizer_comm_of_comm hcomm _ (this h₁) _ (this h₂) }
Algebra.commute_of_mem_adjoin_of_forall_mem_commute
theorem
{a b : A} {s : Set A} (hb : b ∈ adjoin R s) (h : ∀ b ∈ s, Commute a b) : Commute a b
lemma commute_of_mem_adjoin_of_forall_mem_commute {a b : A} {s : Set A}
(hb : b ∈ adjoin R s) (h : ∀ b ∈ s, Commute a b) :
Commute a b := by
induction hb using adjoin_induction with
| mem x hx => exact h x hx
| algebraMap r => exact commutes r a |>.symm
| add y z _ _ hy hz => exact hy.add_right hz
| mul y z _ _ hy hz => exact hy.mul_right hz
Algebra.commute_of_mem_adjoin_singleton_of_commute
theorem
{a b c : A} (hc : c ∈ adjoin R { b }) (h : Commute a b) : Commute a c
lemma commute_of_mem_adjoin_singleton_of_commute {a b c : A}
(hc : c ∈ adjoin R {b}) (h : Commute a b) :
Commute a c :=
commute_of_mem_adjoin_of_forall_mem_commute hc <| by simpa
Algebra.commute_of_mem_adjoin_self
theorem
{a b : A} (hb : b ∈ adjoin R { a }) : Commute a b
lemma commute_of_mem_adjoin_self {a b : A} (hb : b ∈ adjoin R {a}) :
Commute a b :=
commute_of_mem_adjoin_singleton_of_commute hb rfl
Algebra.self_mem_adjoin_singleton
theorem
(x : A) : x ∈ adjoin R ({ x } : Set A)
theorem self_mem_adjoin_singleton (x : A) : x ∈ adjoin R ({x} : Set A) :=
Algebra.subset_adjoin (Set.mem_singleton_iff.mpr rfl)
Algebra.adjoin_union_coe_submodule
theorem
: Subalgebra.toSubmodule (adjoin R (s ∪ t)) = Subalgebra.toSubmodule (adjoin R s) * Subalgebra.toSubmodule (adjoin R t)
theorem adjoin_union_coe_submodule :
Subalgebra.toSubmodule (adjoin R (s ∪ t)) =
Subalgebra.toSubmodule (adjoin R s) * Subalgebra.toSubmodule (adjoin R t) := by
rw [adjoin_eq_span, adjoin_eq_span, adjoin_eq_span, span_mul_span]
congr 1 with z; simp [Submonoid.closure_union, Submonoid.mem_sup, Set.mem_mul]
Algebra.adjoin_singleton_intCast
theorem
(n : ℤ) : adjoin R {(n : A)} = ⊥
@[simp]
theorem adjoin_singleton_intCast (n : ℤ) : adjoin R {(n : A)} = ⊥ := by
simpa using adjoin_singleton_algebraMap A (n : R)
Algebra.adjoin_insert_intCast
theorem
(n : ℤ) (s : Set A) : adjoin R (insert (n : A) s) = adjoin R s
@[simp]
theorem adjoin_insert_intCast (n : ℤ) (s : Set A) : adjoin R (insert (n : A) s) = adjoin R s := by
simpa using adjoin_insert_algebraMap (n : R) s
Algebra.mem_adjoin_iff
theorem
{s : Set A} {x : A} : x ∈ adjoin R s ↔ x ∈ Subring.closure (Set.range (algebraMap R A) ∪ s)
theorem mem_adjoin_iff {s : Set A} {x : A} :
x ∈ adjoin R sx ∈ adjoin R s ↔ x ∈ Subring.closure (Set.range (algebraMap R A) ∪ s) :=
⟨fun hx =>
Subsemiring.closure_induction Subring.subset_closure (Subring.zero_mem _) (Subring.one_mem _)
(fun _ _ _ _ => Subring.add_mem _) (fun _ _ _ _ => Subring.mul_mem _) hx,
suffices Subring.closure (Set.range (algebraMap R A) ∪ s) ≤ (adjoin R s).toSubring
from (show (_ : Set A) ⊆ _ from this) (a := x)
-- Porting note: Lean doesn't seem to recognize the defeq between the order on subobjects and
-- subsets of their coercions to sets as easily as in Lean 3
Subring.closure_le.2 Subsemiring.subset_closure⟩
Algebra.adjoin_eq_ring_closure
theorem
(s : Set A) : (adjoin R s).toSubring = Subring.closure (Set.range (algebraMap R A) ∪ s)
theorem adjoin_eq_ring_closure (s : Set A) :
(adjoin R s).toSubring = Subring.closure (Set.rangeSet.range (algebraMap R A) ∪ s) :=
Subring.ext fun _x => mem_adjoin_iff
Algebra.adjoinCommRingOfComm
abbrev
{s : Set A} (hcomm : ∀ a ∈ s, ∀ b ∈ s, a * b = b * a) : CommRing (adjoin R s)
/-- If all elements of `s : Set A` commute pairwise, then `adjoin R s` is a commutative
ring. -/
abbrev adjoinCommRingOfComm {s : Set A} (hcomm : ∀ a ∈ s, ∀ b ∈ s, a * b = b * a) :
CommRing (adjoin R s) :=
{ (adjoin R s).toRing, adjoinCommSemiringOfComm R hcomm with }
AlgHom.map_adjoin
theorem
(φ : A →ₐ[R] B) (s : Set A) : (adjoin R s).map φ = adjoin R (φ '' s)
theorem map_adjoin (φ : A →ₐ[R] B) (s : Set A) : (adjoin R s).map φ = adjoin R (φ '' s) :=
(adjoin_image _ _ _).symm
AlgHom.map_adjoin_singleton
theorem
(e : A →ₐ[R] B) (x : A) : (adjoin R { x }).map e = adjoin R {e x}
@[simp]
theorem map_adjoin_singleton (e : A →ₐ[R] B) (x : A) :
(adjoin R {x}).map e = adjoin R {e x} := by
rw [map_adjoin, Set.image_singleton]
AlgHom.adjoin_le_equalizer
theorem
(φ₁ φ₂ : A →ₐ[R] B) {s : Set A} (h : s.EqOn φ₁ φ₂) : adjoin R s ≤ equalizer φ₁ φ₂
AlgHom.ext_of_adjoin_eq_top
theorem
{s : Set A} (h : adjoin R s = ⊤) ⦃φ₁ φ₂ : A →ₐ[R] B⦄ (hs : s.EqOn φ₁ φ₂) : φ₁ = φ₂
theorem ext_of_adjoin_eq_top {s : Set A} (h : adjoin R s = ⊤) ⦃φ₁ φ₂ : A →ₐ[R] B⦄
(hs : s.EqOn φ₁ φ₂) : φ₁ = φ₂ :=
ext fun _x => adjoin_le_equalizer φ₁ φ₂ hs <| h.symm ▸ trivial
AlgHom.eqOn_adjoin_iff
theorem
{φ ψ : A →ₐ[R] B} {s : Set A} : Set.EqOn φ ψ (adjoin R s) ↔ Set.EqOn φ ψ s
/-- Two algebra morphisms are equal on `Algebra.span s`iff they are equal on s -/
theorem eqOn_adjoin_iff {φ ψ : A →ₐ[R] B} {s : Set A} :
Set.EqOnSet.EqOn φ ψ (adjoin R s) ↔ Set.EqOn φ ψ s := by
have (S : Set A) : S ≤ equalizer φ ψ ↔ Set.EqOn φ ψ S := Iff.rfl
simp only [← this, Set.le_eq_subset, SetLike.coe_subset_coe, adjoin_le_iff]
AlgHom.adjoin_ext
theorem
{s : Set A} ⦃φ₁ φ₂ : adjoin R s →ₐ[R] B⦄ (h : ∀ x hx, φ₁ ⟨x, subset_adjoin hx⟩ = φ₂ ⟨x, subset_adjoin hx⟩) : φ₁ = φ₂
theorem adjoin_ext {s : Set A} ⦃φ₁ φ₂ : adjoinadjoin R s →ₐ[R] B⦄
(h : ∀ x hx, φ₁ ⟨x, subset_adjoin hx⟩ = φ₂ ⟨x, subset_adjoin hx⟩) : φ₁ = φ₂ :=
ext fun ⟨x, hx⟩ ↦ adjoin_induction h (fun _ ↦ φ₂.commutes _ ▸ φ₁.commutes _)
(fun _ _ _ _ h₁ h₂ ↦ by convert congr_arg₂ (· + ·) h₁ h₂ <;> rw [← map_add] <;> rfl)
(fun _ _ _ _ h₁ h₂ ↦ by convert congr_arg₂ (· * ·) h₁ h₂ <;> rw [← map_mul] <;> rfl) hx
AlgHom.ext_of_eq_adjoin
theorem
{S : Subalgebra R A} {s : Set A} (hS : S = adjoin R s) ⦃φ₁ φ₂ : S →ₐ[R] B⦄
(h : ∀ x hx, φ₁ ⟨x, hS.ge (subset_adjoin hx)⟩ = φ₂ ⟨x, hS.ge (subset_adjoin hx)⟩) : φ₁ = φ₂
theorem ext_of_eq_adjoin {S : Subalgebra R A} {s : Set A} (hS : S = adjoin R s) ⦃φ₁ φ₂ : S →ₐ[R] B⦄
(h : ∀ x hx, φ₁ ⟨x, hS.ge (subset_adjoin hx)⟩ = φ₂ ⟨x, hS.ge (subset_adjoin hx)⟩) :
φ₁ = φ₂ := by
subst hS; exact adjoin_ext h
Algebra.adjoin_nat
theorem
{R : Type*} [Semiring R] (s : Set R) : adjoin ℕ s = subalgebraOfSubsemiring (Subsemiring.closure s)
theorem Algebra.adjoin_nat {R : Type*} [Semiring R] (s : Set R) :
adjoin ℕ s = subalgebraOfSubsemiring (Subsemiring.closure s) :=
le_antisymm (adjoin_le Subsemiring.subset_closure)
(Subsemiring.closure_le.2 subset_adjoin : Subsemiring.closure s ≤ (adjoin ℕ s).toSubsemiring)
Algebra.adjoin_int
theorem
{R : Type*} [Ring R] (s : Set R) : adjoin ℤ s = subalgebraOfSubring (Subring.closure s)
theorem Algebra.adjoin_int {R : Type*} [Ring R] (s : Set R) :
adjoin ℤ s = subalgebraOfSubring (Subring.closure s) :=
le_antisymm (adjoin_le Subring.subset_closure)
(Subring.closure_le.2 subset_adjoin : Subring.closure s ≤ (adjoin ℤ s).toSubring)
Subsemiring.closureEquivAdjoinNat
definition
{R : Type*} [Semiring R] (s : Set R) : Subsemiring.closure s ≃ₐ[ℕ] Algebra.adjoin ℕ s
/-- The `ℕ`-algebra equivalence between `Subsemiring.closure s` and `Algebra.adjoin ℕ s` given
by the identity map. -/
def Subsemiring.closureEquivAdjoinNat {R : Type*} [Semiring R] (s : Set R) :
Subsemiring.closureSubsemiring.closure s ≃ₐ[ℕ] Algebra.adjoin ℕ s :=
Subalgebra.equivOfEq (subalgebraOfSubsemiring <| Subsemiring.closure s) _ (adjoin_nat s).symm
Subring.closureEquivAdjoinInt
definition
{R : Type*} [Ring R] (s : Set R) : Subring.closure s ≃ₐ[ℤ] Algebra.adjoin ℤ s
/-- The `ℤ`-algebra equivalence between `Subring.closure s` and `Algebra.adjoin ℤ s` given by
the identity map. -/
def Subring.closureEquivAdjoinInt {R : Type*} [Ring R] (s : Set R) :
Subring.closureSubring.closure s ≃ₐ[ℤ] Algebra.adjoin ℤ s :=
Subalgebra.equivOfEq (subalgebraOfSubring <| Subring.closure s) _ (adjoin_int s).symm
Submonoid.adjoin_eq_span_of_eq_span
theorem
[Semiring F] [Module F K] [IsScalarTower F E K] (L : Submonoid K) {S : Set K} (h : (L : Set K) = span F S) :
toSubmodule (adjoin E (L : Set K)) = span E S
/-- If `K / E / F` is a ring extension tower, `L` is a submonoid of `K / F` which is generated by
`S` as an `F`-module, then `E[L]` is generated by `S` as an `E`-module. -/
theorem Submonoid.adjoin_eq_span_of_eq_span [Semiring F] [Module F K] [IsScalarTower F E K]
(L : Submonoid K) {S : Set K} (h : (L : Set K) = span F S) :
toSubmodule (adjoin E (L : Set K)) = span E S := by
rw [adjoin_eq_span, L.closure_eq, h]
exact (span_le.mpr <| span_subset_span _ _ _).antisymm (span_mono subset_span)
Subalgebra.adjoin_eq_span_of_eq_span
theorem
{S : Set K} (h : toSubmodule L = span F S) : toSubmodule (adjoin E (L : Set K)) = span E S
/-- If `K / E / F` is a ring extension tower, `L` is a subalgebra of `K / F` which is generated by
`S` as an `F`-module, then `E[L]` is generated by `S` as an `E`-module. -/
theorem Subalgebra.adjoin_eq_span_of_eq_span {S : Set K} (h : toSubmodule L = span F S) :
toSubmodule (adjoin E (L : Set K)) = span E S :=
L.toSubmonoid.adjoin_eq_span_of_eq_span F E (congr_arg ((↑) : _ → Set K) h)
NonUnitalAlgebra.adjoin_le_algebra_adjoin
theorem
(s : Set A) : adjoin R s ≤ (Algebra.adjoin R s).toNonUnitalSubalgebra
lemma NonUnitalAlgebra.adjoin_le_algebra_adjoin (s : Set A) :
adjoin R s ≤ (Algebra.adjoin R s).toNonUnitalSubalgebra := adjoin_le Algebra.subset_adjoin
Algebra.adjoin_nonUnitalSubalgebra
theorem
(s : Set A) : adjoin R (NonUnitalAlgebra.adjoin R s : Set A) = adjoin R s
lemma Algebra.adjoin_nonUnitalSubalgebra (s : Set A) :
adjoin R (NonUnitalAlgebra.adjoin R s : Set A) = adjoin R s :=
le_antisymm
(adjoin_le <| NonUnitalAlgebra.adjoin_le_algebra_adjoin R s)
(adjoin_le <| (NonUnitalAlgebra.subset_adjoin R).trans subset_adjoin)
Subalgebra.comap_map_eq
theorem
(f : A →ₐ[R] B) (S : Subalgebra R A) : (S.map f).comap f = S ⊔ Algebra.adjoin R (f ⁻¹' {0})
theorem comap_map_eq (f : A →ₐ[R] B) (S : Subalgebra R A) :
(S.map f).comap f = S ⊔ Algebra.adjoin R (f ⁻¹' {0}) := by
apply le_antisymm
· intro x hx
rw [mem_comap, mem_map] at hx
obtain ⟨y, hy, hxy⟩ := hx
replace hxy : x - y ∈ f ⁻¹' {0} := by simp [hxy]
rw [← Algebra.adjoin_eq S, ← Algebra.adjoin_union, ← add_sub_cancel y x]
exact Subalgebra.add_mem _
(Algebra.subset_adjoin <| Or.inl hy) (Algebra.subset_adjoin <| Or.inr hxy)
· rw [← map_le, Algebra.map_sup, f.map_adjoin]
apply le_of_eq
rw [sup_eq_left, Algebra.adjoin_le_iff]
exact (Set.image_preimage_subset f {0}).trans (Set.singleton_subset_iff.2 (S.map f).zero_mem)
Subalgebra.comap_map_eq_self
theorem
{f : A →ₐ[R] B} {S : Subalgebra R A} (h : f ⁻¹' {0} ⊆ S) : (S.map f).comap f = S
theorem comap_map_eq_self {f : A →ₐ[R] B} {S : Subalgebra R A}
(h : f ⁻¹' {0}f ⁻¹' {0} ⊆ S) : (S.map f).comap f = S := by
convert comap_map_eq f S
rwa [left_eq_sup, Algebra.adjoin_le_iff]