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) 2021 Eric Wieser. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Wieser, Jireh Loreaux
! This file was ported from Lean 3 source module group_theory.subsemigroup.center
! leanprover-community/mathlib commit a437a2499163d85d670479f69f625f461cc5fef9
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.Ring.Defs
import Mathlib.GroupTheory.Subsemigroup.Operations
/-!
# Centers of magmas and semigroups
## Main definitions
* `Set.center`: the center of a magma
* `Subsemigroup.center`: the center of a semigroup
* `Set.addCenter`: the center of an additive magma
* `AddSubsemigroup.center`: the center of an additive semigroup
We provide `Submonoid.center`, `AddSubmonoid.center`, `Subgroup.center`, `AddSubgroup.center`,
`Subsemiring.center`, and `Subring.center` in other files.
-/
variable { M : Type _ : Type (?u.16689+1) Type _}
namespace Set
variable ( M )
/-- The center of a magma. -/
@[ to_additive addCenter : (M : Type u_1) β [inst : Add M ] β Set M addCenter " The center of an additive magma. "]
def center : (M : Type u_1) β [inst : Mul M ] β Set M center [ Mul M ] : Set M :=
{ z | β m , m * z = z * m }
#align set.center Set.center : (M : Type u_1) β [inst : Mul M ] β Set M Set.center
#align set.add_center Set.addCenter : (M : Type u_1) β [inst : Add M ] β Set M Set.addCenter
-- porting note: The `to_additive` version used to be `mem_addCenter` without the iff
@[ to_additive mem_addCenter_iff ]
theorem mem_center_iff [ Mul M ] { z : M } : z β center : (M : Type ?u.155) β [inst : Mul M ] β Set M center M β β g , g * z = z * g :=
Iff.rfl
#align set.mem_center_iff Set.mem_center_iff
#align set.mem_add_center Set.mem_addCenter_iff
instance decidableMemCenter [ Mul M ] [β a : M , Decidable <| β b : M , b * a = a * b ] :
DecidablePred : {Ξ± : Sort ?u.375} β (Ξ± β Prop ) β Sort (max1?u.375) DecidablePred (Β· β center : (M : Type ?u.385) β [inst : Mul M ] β Set M center M ) := fun _ => decidable_of_iff' _ ( mem_center_iff M )
#align set.decidable_mem_center Set.decidableMemCenter
@[ to_additive ( attr := simp ) zero_mem_addCenter ]
theorem one_mem_center [ MulOneClass : Type ?u.541 β Type ?u.541 MulOneClass M ] : ( 1 : M ) β Set.center : (M : Type ?u.832) β [inst : Mul M ] β Set M Set.center M := by simp [ mem_center_iff ]
#align set.one_mem_center Set.one_mem_center
#align set.zero_mem_add_center Set.zero_mem_addCenter
@[ simp ]
theorem zero_mem_center [ MulZeroClass : Type ?u.2064 β Type ?u.2064 MulZeroClass M ] : ( 0 : M ) β Set.center : (M : Type ?u.2251) β [inst : Mul M ] β Set M Set.center M := by simp [ mem_center_iff ]
#align set.zero_mem_center Set.zero_mem_center
variable { M }
@[ to_additive ( attr := simp ) add_mem_addCenter ]
theorem mul_mem_center [ Semigroup : Type ?u.3421 β Type ?u.3421 Semigroup M ] { a b : M } ( ha : a β Set.center : (M : Type ?u.3445) β [inst : Mul M ] β Set M Set.center M ) ( hb : b β Set.center : (M : Type ?u.3782) β [inst : Mul M ] β Set M Set.center M ) :
a * b β Set.center : (M : Type ?u.4302) β [inst : Mul M ] β Set M Set.center M := fun g => by rw [ mul_assoc : β {G : Type ?u.4323} [inst : Semigroup G ] (a b c : G ), a * b * c = a * (b * c ) mul_assoc, g * (a * b ) = a * (b * g ) β hb g , g * (a * b ) = a * (g * b ) β mul_assoc : β {G : Type ?u.4395} [inst : Semigroup G ] (a b c : G ), a * b * c = a * (b * c ) mul_assoc, ha g , mul_assoc : β {G : Type ?u.4441} [inst : Semigroup G ] (a b c : G ), a * b * c = a * (b * c ) mul_assoca * (g * b ) = a * (g * b )]
#align set.mul_mem_center Set.mul_mem_center
#align set.add_mem_add_center Set.add_mem_addCenter
@[ to_additive ( attr := simp ) neg_mem_addCenter ]
theorem inv_mem_center [ Group M ] { a : M } ( ha : a β Set.center : (M : Type ?u.4626) β [inst : Mul M ] β Set M Set.center M ) :
a β»ΒΉ β Set.center : (M : Type ?u.4945) β [inst : Mul M ] β Set M Set.center M := fun g => by
rw [ β inv_inj , mul_inv_rev , inv_inv , β ha , mul_inv_rev , inv_inv ]
#align set.inv_mem_center Set.inv_mem_center
#align set.neg_mem_add_center Set.neg_mem_addCenter
@[ simp ]
theorem add_mem_center [ Distrib M ] { a b : M } ( ha : a β Set.center : (M : Type ?u.5447) β [inst : Mul M ] β Set M Set.center M ) ( hb : b β Set.center : (M : Type ?u.5585) β [inst : Mul M ] β Set M Set.center M ) :
a + b β Set.center : (M : Type ?u.5653) β [inst : Mul M ] β Set M Set.center M := fun c => by c * (a + b ) = (a + b ) * c rw [ c * (a + b ) = (a + b ) * c add_mul , c * (a + b ) = (a + b ) * c mul_add , c * (a + b ) = (a + b ) * c ha c , c * (a + b ) = (a + b ) * c hb c ]
#align set.add_mem_center Set.add_mem_center
@[ simp ]
theorem neg_mem_center [ Ring M ] { a : M } ( ha : a β Set.center : (M : Type ?u.6258) β [inst : Mul M ] β Set M Set.center M ) : - a β Set.center : (M : Type ?u.6332) β [inst : Mul M ] β Set M Set.center M := fun c => by
rw [ β neg_mul_comm , ha (- c ), neg_mul_comm ]
#align set.neg_mem_center Set.neg_mem_center
@[ to_additive subset_addCenter_add_units ]
theorem subset_center_units [ Monoid M ] : ( (β) : M Λ£ β M ) β»ΒΉ' center : (M : Type ?u.7729) β [inst : Mul M ] β Set M center M β Set.center : (M : Type ?u.7926) β [inst : Mul M ] β Set M Set.center M Λ£ :=
fun _ ha _ => Units.ext <| ha _
#align set.subset_center_units Set.subset_center_units
#align set.subset_add_center_add_units Set.subset_addCenter_add_units
theorem center_units_subset [ GroupWithZero : Type ?u.8163 β Type ?u.8163 GroupWithZero M ] : Set.center : (M : Type ?u.8174) β [inst : Mul M ] β Set M Set.center M Λ£ β ( (β) : M Λ£ β M ) β»ΒΉ' center : (M : Type ?u.9280) β [inst : Mul M ] β Set M center M :=
fun a ha b => by
obtain rfl | hb := eq_or_ne : β {Ξ± : Sort ?u.9413} (x y : Ξ± ), x = y β¨ x β y eq_or_ne b 0
Β· rw [ zero_mul , mul_zero ]
Β· exact Units.ext_iff : β {Ξ± : Type ?u.9725} [inst : Monoid Ξ± ] {a b : Ξ± Λ£ }, a = b β βa = βb Units.ext_iff. mp : β {a b : Prop }, (a β b ) β a β b mp ( ha ( Units.mk0 _ hb ))
#align set.center_units_subset Set.center_units_subset
/-- In a group with zero, the center of the units is the preimage of the center. -/
theorem center_units_eq [ GroupWithZero : Type ?u.9830 β Type ?u.9830 GroupWithZero M ] : Set.center : (M : Type ?u.9834) β [inst : Mul M ] β Set M Set.center M Λ£ = ( (β) : M Λ£ β M ) β»ΒΉ' center : (M : Type ?u.10938) β [inst : Mul M ] β Set M center M :=
Subset.antisymm : β {Ξ± : Type ?u.11049} {a b : Set Ξ± }, a β b β b β a β a = b Subset.antisymm center_units_subset subset_center_units
#align set.center_units_eq Set.center_units_eq
@[ simp ]
theorem inv_mem_centerβ [ GroupWithZero : Type ?u.11163 β Type ?u.11163 GroupWithZero M ] { a : M } ( ha : a β Set.center : (M : Type ?u.11185) β [inst : Mul M ] β Set M Set.center M ) : a β»ΒΉ β Set.center : (M : Type ?u.11396) β [inst : Mul M ] β Set M Set.center M := by
obtain rfl | ha0 := eq_or_ne : β {Ξ± : Sort ?u.11408} (x y : Ξ± ), x = y β¨ x β y eq_or_ne a 0
Β· rw [ inv_zero ]
exact zero_mem_center M
rcases IsUnit.mk0 _ ha0 with β¨ a , rfl β©
rw [ β Units.val_inv_eq_inv_val ]
exact center_units_subset ( inv_mem_center ( subset_center_units ha ))
#align set.inv_mem_centerβ Set.inv_mem_centerβ
@[ to_additive ( attr := simp ) sub_mem_addCenter ]
theorem div_mem_center [ Group M ] { a b : M } ( ha : a β Set.center : (M : Type ?u.12039) β [inst : Mul M ] β Set M Set.center M ) ( hb : b β Set.center : (M : Type ?u.12285) β [inst : Mul M ] β Set M Set.center M ) :
a / b β Set.center : (M : Type ?u.12383) β [inst : Mul M ] β Set M Set.center M := by
rw [ div_eq_mul_inv ]
exact mul_mem_center ha ( inv_mem_center hb )
#align set.div_mem_center Set.div_mem_center
#align set.sub_mem_add_center Set.sub_mem_addCenter
@[ simp ]
theorem div_mem_centerβ [ GroupWithZero : Type ?u.12799 β Type ?u.12799 GroupWithZero M ] { a b : M } ( ha : a β Set.center : (M : Type ?u.12823) β [inst : Mul M ] β Set M Set.center M )
( hb : b β Set.center : (M : Type ?u.12995) β [inst : Mul M ] β Set M Set.center M ) : a / b β Set.center : (M : Type ?u.13067) β [inst : Mul M ] β Set M Set.center M := by
rw [ div_eq_mul_inv ]
exact mul_mem_center ha ( inv_mem_centerβ hb )
#align set.div_mem_centerβ Set.div_mem_centerβ
variable ( M )
@[ to_additive ( attr := simp ) addCenter_eq_univ ]
theorem center_eq_univ [ CommSemigroup : Type ?u.13352 β Type ?u.13352 CommSemigroup M ] : center : (M : Type ?u.13356) β [inst : Mul M ] β Set M center M = Set.univ : {Ξ± : Type ?u.13687} β Set Ξ± Set.univ :=
( Subset.antisymm : β {Ξ± : Type ?u.13722} {a b : Set Ξ± }, a β b β b β a β a = b Subset.antisymm ( subset_univ : β {Ξ± : Type ?u.13726} (s : Set Ξ± ), s β univ subset_univ _ )) fun x _ y => mul_comm y x
#align set.center_eq_univ Set.center_eq_univ
#align set.add_center_eq_univ Set.addCenter_eq_univ
end Set
namespace Subsemigroup
section
variable ( M ) [ Semigroup : Type ?u.14284 β Type ?u.14284 Semigroup M ]
/-- The center of a semigroup `M` is the set of elements that commute with everything in `M` -/
@[ to_additive
"The center of a semigroup `M` is the set of elements that commute with everything in `M`"]
def center : Subsemigroup : (M : Type ?u.13812) β [inst : Mul M ] β Type ?u.13812 Subsemigroup M where
carrier := Set.center : (M : Type ?u.14123) β [inst : Mul M ] β Set M Set.center M
mul_mem' := Set.mul_mem_center
#align subsemigroup.center Subsemigroup.center
#align add_subsemigroup.center AddSubsemigroup.center
-- porting note: `coe_center` is now redundant
#noalign subsemigroup.coe_center
#noalign add_subsemigroup.coe_center
variable { M }
@[ to_additive ]
theorem mem_center_iff { z : M } : z β center M β β g , g * z = z * g :=
Iff.rfl
#align subsemigroup.mem_center_iff Subsemigroup.mem_center_iff
#align add_subsemigroup.mem_center_iff AddSubsemigroup.mem_center_iff
@[ to_additive ]
instance decidableMemCenter ( a ) [ Decidable <| β b : M , b * a = a * b ] : Decidable ( a β center M ) :=
decidable_of_iff' _ mem_center_iff
#align subsemigroup.decidable_mem_center Subsemigroup.decidableMemCenter
#align add_subsemigroup.decidable_mem_center AddSubsemigroup.decidableMemCenter
/-- The center of a semigroup is commutative. -/
@[ to_additive "The center of an additive semigroup is commutative."]
instance center.commSemigroup : CommSemigroup : Type ?u.16261 β Type ?u.16261 CommSemigroup ( center M ) :=
{ MulMemClass.toSemigroup ( center M ) with mul_comm := fun _ b => Subtype.ext : β {Ξ± : Sort ?u.16495} {p : Ξ± β Prop } {a1 a2 : { x // p x } }, βa1 = βa2 β a1 = a2 Subtype.ext <| b . 2 : β {Ξ± : Sort ?u.16506} {p : Ξ± β Prop } (self : Subtype p ), p βself 2 _ }
#align subsemigroup.center.comm_semigroup Subsemigroup.center.commSemigroup
#align add_subsemigroup.center.add_comm_semigroup AddSubsemigroup.center.addCommSemigroup
end
section
variable ( M ) [ CommSemigroup : Type ?u.16692 β Type ?u.16692 CommSemigroup M ]
@[ to_additive ( attr := simp )]
theorem center_eq_top : center M = β€ :=
SetLike.coe_injective ( Set.center_eq_univ M )
#align subsemigroup.center_eq_top Subsemigroup.center_eq_top
#align add_subsemigroup.center_eq_top AddSubsemigroup.center_eq_top
end
end Subsemigroup
-- Guard against import creep
assert_not_exists Finset