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 Cmdinstead 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 ?u.9827
M
:
Type _: Type (?u.16689+1)
Type _
} namespace Set variable (
M: ?m.8
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: Type ?u.14 β†’ Type ?u.14
Mul
M: Type ?u.11
M
] :
Set: Type ?u.17 β†’ Type ?u.17
Set
M: Type ?u.11
M
:= {
z: ?m.26
z
| βˆ€
m: ?m.29
m
,
m: ?m.29
m
*
z: ?m.26
z
=
z: ?m.26
z
*
m: ?m.29
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: βˆ€ (M : Type u_1) [inst : Add M] {z : M}, z ∈ addCenter M ↔ βˆ€ (g : M), g + z = z + g
mem_addCenter_iff
] theorem
mem_center_iff: βˆ€ (M : Type u_1) [inst : Mul M] {z : M}, z ∈ center M ↔ βˆ€ (g : M), g * z = z * g
mem_center_iff
[
Mul: Type ?u.145 β†’ Type ?u.145
Mul
M: Type ?u.142
M
] {
z: M
z
:
M: Type ?u.142
M
} :
z: M
z
∈
center: (M : Type ?u.155) β†’ [inst : Mul M] β†’ Set M
center
M: Type ?u.142
M
↔ βˆ€
g: ?m.180
g
,
g: ?m.180
g
*
z: M
z
=
z: M
z
*
g: ?m.180
g
:=
Iff.rfl: βˆ€ {a : Prop}, a ↔ a
Iff.rfl
#align set.mem_center_iff
Set.mem_center_iff: βˆ€ (M : Type u_1) [inst : Mul M] {z : M}, z ∈ center M ↔ βˆ€ (g : M), g * z = z * g
Set.mem_center_iff
#align set.mem_add_center
Set.mem_addCenter_iff: βˆ€ (M : Type u_1) [inst : Add M] {z : M}, z ∈ addCenter M ↔ βˆ€ (g : M), g + z = z + g
Set.mem_addCenter_iff
instance
decidableMemCenter: [inst : Mul M] β†’ [inst_1 : (a : M) β†’ Decidable (βˆ€ (b : M), b * a = a * b)] β†’ DecidablePred fun x => x ∈ center M
decidableMemCenter
[
Mul: Type ?u.286 β†’ Type ?u.286
Mul
M: Type ?u.283
M
] [βˆ€
a: M
a
:
M: Type ?u.283
M
,
Decidable: Prop β†’ Type
Decidable
<| βˆ€
b: M
b
:
M: Type ?u.283
M
,
b: M
b
*
a: M
a
=
a: M
a
*
b: M
b
] :
DecidablePred: {Ξ± : Sort ?u.375} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.375)
DecidablePred
(· ∈
center: (M : Type ?u.385) β†’ [inst : Mul M] β†’ Set M
center
M: Type ?u.283
M
) := fun
_: ?m.419
_
=>
decidable_of_iff': {a : Prop} β†’ (b : Prop) β†’ (a ↔ b) β†’ [inst : Decidable b] β†’ Decidable a
decidable_of_iff'
_: Prop
_
(
mem_center_iff: βˆ€ (M : Type ?u.425) [inst : Mul M] {z : M}, z ∈ center M ↔ βˆ€ (g : M), g * z = z * g
mem_center_iff
M: Type ?u.283
M
) #align set.decidable_mem_center
Set.decidableMemCenter: (M : Type u_1) β†’ [inst : Mul M] β†’ [inst_1 : (a : M) β†’ Decidable (βˆ€ (b : M), b * a = a * b)] β†’ DecidablePred fun x => x ∈ center M
Set.decidableMemCenter
@[to_additive (attr := simp)
zero_mem_addCenter: βˆ€ (M : Type u_1) [inst : AddZeroClass M], 0 ∈ addCenter M
zero_mem_addCenter
] theorem
one_mem_center: βˆ€ [inst : MulOneClass M], 1 ∈ center M
one_mem_center
[
MulOneClass: Type ?u.541 β†’ Type ?u.541
MulOneClass
M: Type ?u.538
M
] : (
1: ?m.563
1
:
M: Type ?u.538
M
) ∈
Set.center: (M : Type ?u.832) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.538
M
:=

Goals accomplished! πŸ™
M: Type u_1

inst✝: MulOneClass M



Goals accomplished! πŸ™
#align set.one_mem_center
Set.one_mem_center: βˆ€ (M : Type u_1) [inst : MulOneClass M], 1 ∈ center M
Set.one_mem_center
#align set.zero_mem_add_center
Set.zero_mem_addCenter: βˆ€ (M : Type u_1) [inst : AddZeroClass M], 0 ∈ addCenter M
Set.zero_mem_addCenter
@[simp] theorem
zero_mem_center: βˆ€ (M : Type u_1) [inst : MulZeroClass M], 0 ∈ center M
zero_mem_center
[
MulZeroClass: Type ?u.2064 β†’ Type ?u.2064
MulZeroClass
M: Type ?u.2061
M
] : (
0: ?m.2086
0
:
M: Type ?u.2061
M
) ∈
Set.center: (M : Type ?u.2251) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.2061
M
:=

Goals accomplished! πŸ™
M: Type u_1

inst✝: MulZeroClass M



Goals accomplished! πŸ™
#align set.zero_mem_center
Set.zero_mem_center: βˆ€ (M : Type u_1) [inst : MulZeroClass M], 0 ∈ center M
Set.zero_mem_center
variable {
M: ?m.3415
M
} @[to_additive (attr := simp)
add_mem_addCenter: βˆ€ {M : Type u_1} [inst : AddSemigroup M] {a b : M}, a ∈ addCenter M β†’ b ∈ addCenter M β†’ a + b ∈ addCenter M
add_mem_addCenter
] theorem
mul_mem_center: βˆ€ {M : Type u_1} [inst : Semigroup M] {a b : M}, a ∈ center M β†’ b ∈ center M β†’ a * b ∈ center M
mul_mem_center
[
Semigroup: Type ?u.3421 β†’ Type ?u.3421
Semigroup
M: Type ?u.3418
M
] {
a: M
a
b: M
b
:
M: Type ?u.3418
M
} (
ha: a ∈ center M
ha
:
a: M
a
∈
Set.center: (M : Type ?u.3445) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.3418
M
) (
hb: b ∈ center M
hb
:
b: M
b
∈
Set.center: (M : Type ?u.3782) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.3418
M
) :
a: M
a
*
b: M
b
∈
Set.center: (M : Type ?u.4302) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.3418
M
:= fun
g: ?m.4317
g
=>

Goals accomplished! πŸ™
M: Type u_1

inst✝: Semigroup M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

g: M


g * (a * b) = a * b * g
M: Type u_1

inst✝: Semigroup M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

g: M


g * (a * b) = a * b * g
M: Type u_1

inst✝: Semigroup M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

g: M


g * (a * b) = a * (b * g)
M: Type u_1

inst✝: Semigroup M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

g: M


g * (a * b) = a * b * g
M: Type u_1

inst✝: Semigroup M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

g: M


g * (a * b) = a * (g * b)
M: Type u_1

inst✝: Semigroup M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

g: M


g * (a * b) = a * b * g
M: Type u_1

inst✝: Semigroup M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

g: M


g * a * b = a * (g * b)
M: Type u_1

inst✝: Semigroup M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

g: M


g * (a * b) = a * b * g
M: Type u_1

inst✝: Semigroup M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

g: M


a * g * b = a * (g * b)
M: Type u_1

inst✝: Semigroup M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

g: M


g * (a * b) = a * b * g
M: Type u_1

inst✝: Semigroup M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

g: M


a * (g * b) = a * (g * b)

Goals accomplished! πŸ™
#align set.mul_mem_center
Set.mul_mem_center: βˆ€ {M : Type u_1} [inst : Semigroup M] {a b : M}, a ∈ center M β†’ b ∈ center M β†’ a * b ∈ center M
Set.mul_mem_center
#align set.add_mem_add_center
Set.add_mem_addCenter: βˆ€ {M : Type u_1} [inst : AddSemigroup M] {a b : M}, a ∈ addCenter M β†’ b ∈ addCenter M β†’ a + b ∈ addCenter M
Set.add_mem_addCenter
@[to_additive (attr := simp)
neg_mem_addCenter: βˆ€ {M : Type u_1} [inst : AddGroup M] {a : M}, a ∈ addCenter M β†’ -a ∈ addCenter M
neg_mem_addCenter
] theorem
inv_mem_center: βˆ€ [inst : Group M] {a : M}, a ∈ center M β†’ a⁻¹ ∈ center M
inv_mem_center
[
Group: Type ?u.4604 β†’ Type ?u.4604
Group
M: Type ?u.4601
M
] {
a: M
a
:
M: Type ?u.4601
M
} (
ha: a ∈ center M
ha
:
a: M
a
∈
Set.center: (M : Type ?u.4626) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.4601
M
) :
a: M
a
⁻¹ ∈
Set.center: (M : Type ?u.4945) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.4601
M
:= fun
g: ?m.4956
g
=>

Goals accomplished! πŸ™
M: Type u_1

inst✝: Group M

a: M

ha: a ∈ center M

g: M


M: Type u_1

inst✝: Group M

a: M

ha: a ∈ center M

g: M


M: Type u_1

inst✝: Group M

a: M

ha: a ∈ center M

g: M


M: Type u_1

inst✝: Group M

a: M

ha: a ∈ center M

g: M


M: Type u_1

inst✝: Group M

a: M

ha: a ∈ center M

g: M


M: Type u_1

inst✝: Group M

a: M

ha: a ∈ center M

g: M


M: Type u_1

inst✝: Group M

a: M

ha: a ∈ center M

g: M


M: Type u_1

inst✝: Group M

a: M

ha: a ∈ center M

g: M


M: Type u_1

inst✝: Group M

a: M

ha: a ∈ center M

g: M


M: Type u_1

inst✝: Group M

a: M

ha: a ∈ center M

g: M


M: Type u_1

inst✝: Group M

a: M

ha: a ∈ center M

g: M


M: Type u_1

inst✝: Group M

a: M

ha: a ∈ center M

g: M


M: Type u_1

inst✝: Group M

a: M

ha: a ∈ center M

g: M



Goals accomplished! πŸ™
#align set.inv_mem_center
Set.inv_mem_center: βˆ€ {M : Type u_1} [inst : Group M] {a : M}, a ∈ center M β†’ a⁻¹ ∈ center M
Set.inv_mem_center
#align set.neg_mem_add_center
Set.neg_mem_addCenter: βˆ€ {M : Type u_1} [inst : AddGroup M] {a : M}, a ∈ addCenter M β†’ -a ∈ addCenter M
Set.neg_mem_addCenter
@[simp] theorem
add_mem_center: βˆ€ {M : Type u_1} [inst : Distrib M] {a b : M}, a ∈ center M β†’ b ∈ center M β†’ a + b ∈ center M
add_mem_center
[
Distrib: Type ?u.5423 β†’ Type ?u.5423
Distrib
M: Type ?u.5420
M
] {
a: M
a
b: M
b
:
M: Type ?u.5420
M
} (
ha: a ∈ center M
ha
:
a: M
a
∈
Set.center: (M : Type ?u.5447) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.5420
M
) (
hb: b ∈ center M
hb
:
b: M
b
∈
Set.center: (M : Type ?u.5585) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.5420
M
) :
a: M
a
+
b: M
b
∈
Set.center: (M : Type ?u.5653) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.5420
M
:= fun
c: ?m.5668
c
=>

Goals accomplished! πŸ™
M: Type u_1

inst✝: Distrib M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

c: M


c * (a + b) = (a + b) * c
M: Type u_1

inst✝: Distrib M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

c: M


c * (a + b) = (a + b) * c
M: Type u_1

inst✝: Distrib M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

c: M


c * (a + b) = a * c + b * c
M: Type u_1

inst✝: Distrib M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

c: M


c * (a + b) = (a + b) * c
M: Type u_1

inst✝: Distrib M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

c: M


c * a + c * b = a * c + b * c
M: Type u_1

inst✝: Distrib M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

c: M


c * (a + b) = (a + b) * c
M: Type u_1

inst✝: Distrib M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

c: M


a * c + c * b = a * c + b * c
M: Type u_1

inst✝: Distrib M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

c: M


c * (a + b) = (a + b) * c
M: Type u_1

inst✝: Distrib M

a, b: M

ha: a ∈ center M

hb: b ∈ center M

c: M


a * c + b * c = a * c + b * c

Goals accomplished! πŸ™
#align set.add_mem_center
Set.add_mem_center: βˆ€ {M : Type u_1} [inst : Distrib M] {a b : M}, a ∈ center M β†’ b ∈ center M β†’ a + b ∈ center M
Set.add_mem_center
@[simp] theorem
neg_mem_center: βˆ€ {M : Type u_1} [inst : Ring M] {a : M}, a ∈ center M β†’ -a ∈ center M
neg_mem_center
[
Ring: Type ?u.6236 β†’ Type ?u.6236
Ring
M: Type ?u.6233
M
] {
a: M
a
:
M: Type ?u.6233
M
} (
ha: a ∈ center M
ha
:
a: M
a
∈
Set.center: (M : Type ?u.6258) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.6233
M
) : -
a: M
a
∈
Set.center: (M : Type ?u.6332) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.6233
M
:= fun
c: ?m.6343
c
=>

Goals accomplished! πŸ™
M: Type u_1

inst✝: Ring M

a: M

ha: a ∈ center M

c: M


c * -a = -a * c
M: Type u_1

inst✝: Ring M

a: M

ha: a ∈ center M

c: M


c * -a = -a * c
M: Type u_1

inst✝: Ring M

a: M

ha: a ∈ center M

c: M


-c * a = -a * c
M: Type u_1

inst✝: Ring M

a: M

ha: a ∈ center M

c: M


c * -a = -a * c
M: Type u_1

inst✝: Ring M

a: M

ha: a ∈ center M

c: M


a * -c = -a * c
M: Type u_1

inst✝: Ring M

a: M

ha: a ∈ center M

c: M


c * -a = -a * c
M: Type u_1

inst✝: Ring M

a: M

ha: a ∈ center M

c: M


a * -c = a * -c

Goals accomplished! πŸ™
#align set.neg_mem_center
Set.neg_mem_center: βˆ€ {M : Type u_1} [inst : Ring M] {a : M}, a ∈ center M β†’ -a ∈ center M
Set.neg_mem_center
@[to_additive
subset_addCenter_add_units: βˆ€ {M : Type u_1} [inst : AddMonoid M], AddUnits.val ⁻¹' addCenter M βŠ† addCenter (AddUnits M)
subset_addCenter_add_units
] theorem
subset_center_units: βˆ€ {M : Type u_1} [inst : Monoid M], Units.val ⁻¹' center M βŠ† center MΛ£
subset_center_units
[
Monoid: Type ?u.6830 β†’ Type ?u.6830
Monoid
M: Type ?u.6827
M
] : (
(↑): MΛ£ β†’ M
(↑)
:
M: Type ?u.6827
M
Λ£ β†’
M: Type ?u.6827
M
) ⁻¹'
center: (M : Type ?u.7729) β†’ [inst : Mul M] β†’ Set M
center
M: Type ?u.6827
M
βŠ†
Set.center: (M : Type ?u.7926) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.6827
M
Λ£ := fun
_: ?m.8083
_
ha: ?m.8086
ha
_: ?m.8089
_
=>
Units.ext: βˆ€ {Ξ± : Type ?u.8091} [inst : Monoid Ξ±], Function.Injective Units.val
Units.ext
<|
ha: ?m.8086
ha
_: M
_
#align set.subset_center_units
Set.subset_center_units: βˆ€ {M : Type u_1} [inst : Monoid M], Units.val ⁻¹' center M βŠ† center MΛ£
Set.subset_center_units
#align set.subset_add_center_add_units
Set.subset_addCenter_add_units: βˆ€ {M : Type u_1} [inst : AddMonoid M], AddUnits.val ⁻¹' addCenter M βŠ† addCenter (AddUnits M)
Set.subset_addCenter_add_units
theorem
center_units_subset: βˆ€ [inst : GroupWithZero M], center MΛ£ βŠ† Units.val ⁻¹' center M
center_units_subset
[
GroupWithZero: Type ?u.8163 β†’ Type ?u.8163
GroupWithZero
M: Type ?u.8160
M
] :
Set.center: (M : Type ?u.8174) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.8160
M
Λ£ βŠ† (
(↑): MΛ£ β†’ M
(↑)
:
M: Type ?u.8160
M
Λ£ β†’
M: Type ?u.8160
M
) ⁻¹'
center: (M : Type ?u.9280) β†’ [inst : Mul M] β†’ Set M
center
M: Type ?u.8160
M
:= fun
a: ?m.9397
a
ha: ?m.9400
ha
b: ?m.9403
b
=>

Goals accomplished! πŸ™
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ

b: M


b * ↑a = ↑a * b
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ


inl
0 * ↑a = ↑a * 0
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ

b: M

hb: b β‰  0


inr
b * ↑a = ↑a * b
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ

b: M


b * ↑a = ↑a * b
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ


inl
0 * ↑a = ↑a * 0
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ


inl
0 * ↑a = ↑a * 0
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ

b: M

hb: b β‰  0


inr
b * ↑a = ↑a * b
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ


inl
0 * ↑a = ↑a * 0
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ


inl
0 = ↑a * 0
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ


inl
0 * ↑a = ↑a * 0
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ


inl
0 = 0

Goals accomplished! πŸ™
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ

b: M


b * ↑a = ↑a * b
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ

b: M

hb: b β‰  0


inr
b * ↑a = ↑a * b
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: a ∈ center Mˣ

b: M

hb: b β‰  0


inr
b * ↑a = ↑a * b

Goals accomplished! πŸ™
#align set.center_units_subset
Set.center_units_subset: βˆ€ {M : Type u_1} [inst : GroupWithZero M], center MΛ£ βŠ† Units.val ⁻¹' center M
Set.center_units_subset
/-- In a group with zero, the center of the units is the preimage of the center. -/ theorem
center_units_eq: βˆ€ [inst : GroupWithZero M], center MΛ£ = Units.val ⁻¹' center M
center_units_eq
[
GroupWithZero: Type ?u.9830 β†’ Type ?u.9830
GroupWithZero
M: Type ?u.9827
M
] :
Set.center: (M : Type ?u.9834) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.9827
M
Λ£ = (
(↑): MΛ£ β†’ M
(↑)
:
M: Type ?u.9827
M
Λ£ β†’
M: Type ?u.9827
M
) ⁻¹'
center: (M : Type ?u.10938) β†’ [inst : Mul M] β†’ Set M
center
M: Type ?u.9827
M
:=
Subset.antisymm: βˆ€ {Ξ± : Type ?u.11049} {a b : Set Ξ±}, a βŠ† b β†’ b βŠ† a β†’ a = b
Subset.antisymm
center_units_subset: βˆ€ {M : Type ?u.11057} [inst : GroupWithZero M], center MΛ£ βŠ† Units.val ⁻¹' center M
center_units_subset
subset_center_units: βˆ€ {M : Type ?u.11085} [inst : Monoid M], Units.val ⁻¹' center M βŠ† center MΛ£
subset_center_units
#align set.center_units_eq
Set.center_units_eq: βˆ€ {M : Type u_1} [inst : GroupWithZero M], center MΛ£ = Units.val ⁻¹' center M
Set.center_units_eq
@[simp] theorem
inv_mem_centerβ‚€: βˆ€ {M : Type u_1} [inst : GroupWithZero M] {a : M}, a ∈ center M β†’ a⁻¹ ∈ center M
inv_mem_centerβ‚€
[
GroupWithZero: Type ?u.11163 β†’ Type ?u.11163
GroupWithZero
M: Type ?u.11160
M
] {
a: M
a
:
M: Type ?u.11160
M
} (
ha: a ∈ center M
ha
:
a: M
a
∈
Set.center: (M : Type ?u.11185) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.11160
M
) :
a: M
a
⁻¹ ∈
Set.center: (M : Type ?u.11396) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.11160
M
:=

Goals accomplished! πŸ™
M: Type u_1

inst✝: GroupWithZero M

a: M

ha: a ∈ center M


M: Type u_1

inst✝: GroupWithZero M

ha: 0 ∈ center M


inl
M: Type u_1

inst✝: GroupWithZero M

a: M

ha: a ∈ center M

ha0: a β‰  0


inr
M: Type u_1

inst✝: GroupWithZero M

a: M

ha: a ∈ center M


M: Type u_1

inst✝: GroupWithZero M

ha: 0 ∈ center M


inl
M: Type u_1

inst✝: GroupWithZero M

ha: 0 ∈ center M


inl
M: Type u_1

inst✝: GroupWithZero M

a: M

ha: a ∈ center M

ha0: a β‰  0


inr
M: Type u_1

inst✝: GroupWithZero M

ha: 0 ∈ center M


inl
M: Type u_1

inst✝: GroupWithZero M

ha: 0 ∈ center M


inl
M: Type u_1

inst✝: GroupWithZero M

ha: 0 ∈ center M


inl
M: Type u_1

inst✝: GroupWithZero M

ha: 0 ∈ center M


inl

Goals accomplished! πŸ™
M: Type u_1

inst✝: GroupWithZero M

a: M

ha: a ∈ center M


M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: ↑a ∈ center M

ha0: ↑a β‰  0


inr.intro
M: Type u_1

inst✝: GroupWithZero M

a: M

ha: a ∈ center M


M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: ↑a ∈ center M

ha0: ↑a β‰  0


inr.intro
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: ↑a ∈ center M

ha0: ↑a β‰  0


inr.intro
M: Type u_1

inst✝: GroupWithZero M

a: MΛ£

ha: ↑a ∈ center M

ha0: ↑a β‰  0


inr.intro
M: Type u_1

inst✝: GroupWithZero M

a: M

ha: a ∈ center M



Goals accomplished! πŸ™
#align set.inv_mem_centerβ‚€
Set.inv_mem_centerβ‚€: βˆ€ {M : Type u_1} [inst : GroupWithZero M] {a : M}, a ∈ center M β†’ a⁻¹ ∈ center M
Set.inv_mem_centerβ‚€
@[to_additive (attr := simp)
sub_mem_addCenter: βˆ€ {M : Type u_1} [inst : AddGroup M] {a b : M}, a ∈ addCenter M β†’ b ∈ addCenter M β†’ a - b ∈ addCenter M
sub_mem_addCenter
] theorem
div_mem_center: βˆ€ {M : Type u_1} [inst : Group M] {a b : M}, a ∈ center M β†’ b ∈ center M β†’ a / b ∈ center M
div_mem_center
[
Group: Type ?u.12015 β†’ Type ?u.12015
Group
M: Type ?u.12012
M
] {
a: M
a
b: M
b
:
M: Type ?u.12012
M
} (
ha: a ∈ center M
ha
:
a: M
a
∈
Set.center: (M : Type ?u.12039) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.12012
M
) (
hb: b ∈ center M
hb
:
b: M
b
∈
Set.center: (M : Type ?u.12285) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.12012
M
) :
a: M
a
/
b: M
b
∈
Set.center: (M : Type ?u.12383) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.12012
M
:=

Goals accomplished! πŸ™
M: Type u_1

inst✝: Group M

a, b: M

ha: a ∈ center M

hb: b ∈ center M


M: Type u_1

inst✝: Group M

a, b: M

ha: a ∈ center M

hb: b ∈ center M


M: Type u_1

inst✝: Group M

a, b: M

ha: a ∈ center M

hb: b ∈ center M


M: Type u_1

inst✝: Group M

a, b: M

ha: a ∈ center M

hb: b ∈ center M


M: Type u_1

inst✝: Group M

a, b: M

ha: a ∈ center M

hb: b ∈ center M



Goals accomplished! πŸ™
#align set.div_mem_center
Set.div_mem_center: βˆ€ {M : Type u_1} [inst : Group M] {a b : M}, a ∈ center M β†’ b ∈ center M β†’ a / b ∈ center M
Set.div_mem_center
#align set.sub_mem_add_center
Set.sub_mem_addCenter: βˆ€ {M : Type u_1} [inst : AddGroup M] {a b : M}, a ∈ addCenter M β†’ b ∈ addCenter M β†’ a - b ∈ addCenter M
Set.sub_mem_addCenter
@[simp] theorem
div_mem_centerβ‚€: βˆ€ {M : Type u_1} [inst : GroupWithZero M] {a b : M}, a ∈ center M β†’ b ∈ center M β†’ a / b ∈ center M
div_mem_centerβ‚€
[
GroupWithZero: Type ?u.12799 β†’ Type ?u.12799
GroupWithZero
M: Type ?u.12796
M
] {
a: M
a
b: M
b
:
M: Type ?u.12796
M
} (
ha: a ∈ center M
ha
:
a: M
a
∈
Set.center: (M : Type ?u.12823) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.12796
M
) (
hb: b ∈ center M
hb
:
b: M
b
∈
Set.center: (M : Type ?u.12995) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.12796
M
) :
a: M
a
/
b: M
b
∈
Set.center: (M : Type ?u.13067) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.12796
M
:=

Goals accomplished! πŸ™
M: Type u_1

inst✝: GroupWithZero M

a, b: M

ha: a ∈ center M

hb: b ∈ center M


M: Type u_1

inst✝: GroupWithZero M

a, b: M

ha: a ∈ center M

hb: b ∈ center M


M: Type u_1

inst✝: GroupWithZero M

a, b: M

ha: a ∈ center M

hb: b ∈ center M


M: Type u_1

inst✝: GroupWithZero M

a, b: M

ha: a ∈ center M

hb: b ∈ center M


M: Type u_1

inst✝: GroupWithZero M

a, b: M

ha: a ∈ center M

hb: b ∈ center M



Goals accomplished! πŸ™
#align set.div_mem_centerβ‚€
Set.div_mem_centerβ‚€: βˆ€ {M : Type u_1} [inst : GroupWithZero M] {a b : M}, a ∈ center M β†’ b ∈ center M β†’ a / b ∈ center M
Set.div_mem_centerβ‚€
variable (
M: ?m.13346
M
) @[to_additive (attr := simp)
addCenter_eq_univ: βˆ€ (M : Type u_1) [inst : AddCommSemigroup M], addCenter M = univ
addCenter_eq_univ
] theorem
center_eq_univ: βˆ€ (M : Type u_1) [inst : CommSemigroup M], center M = univ
center_eq_univ
[
CommSemigroup: Type ?u.13352 β†’ Type ?u.13352
CommSemigroup
M: Type ?u.13349
M
] :
center: (M : Type ?u.13356) β†’ [inst : Mul M] β†’ Set M
center
M: Type ?u.13349
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
_: Set ?m.13727
_
)) fun
x: ?m.13747
x
_: ?m.13750
_
y: ?m.13753
y
=>
mul_comm: βˆ€ {G : Type ?u.13755} [inst : CommSemigroup G] (a b : G), a * b = b * a
mul_comm
y: ?m.13753
y
x: ?m.13747
x
#align set.center_eq_univ
Set.center_eq_univ: βˆ€ (M : Type u_1) [inst : CommSemigroup M], center M = univ
Set.center_eq_univ
#align set.add_center_eq_univ
Set.addCenter_eq_univ: βˆ€ (M : Type u_1) [inst : AddCommSemigroup M], addCenter M = univ
Set.addCenter_eq_univ
end Set namespace Subsemigroup section variable (
M: ?m.13800
M
) [
Semigroup: Type ?u.14284 β†’ Type ?u.14284
Semigroup
M: Type ?u.14272
M
] /-- The center of a semigroup `M` is the set of elements that commute with everything in `M` -/ @[
to_additive: (M : Type u_1) β†’ [inst : AddSemigroup M] β†’ AddSubsemigroup M
to_additive
"The center of a semigroup `M` is the set of elements that commute with everything in `M`"] def
center: (M : Type u_1) β†’ [inst : Semigroup M] β†’ Subsemigroup M
center
:
Subsemigroup: (M : Type ?u.13812) β†’ [inst : Mul M] β†’ Type ?u.13812
Subsemigroup
M: Type ?u.13806
M
where carrier :=
Set.center: (M : Type ?u.14123) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.13806
M
mul_mem':=
Set.mul_mem_center: βˆ€ {M : Type ?u.14129} [inst : Semigroup M] {a b : M}, a ∈ Set.center M β†’ b ∈ Set.center M β†’ a * b ∈ Set.center M
Set.mul_mem_center
#align subsemigroup.center
Subsemigroup.center: (M : Type u_1) β†’ [inst : Semigroup M] β†’ Subsemigroup M
Subsemigroup.center
#align add_subsemigroup.center
AddSubsemigroup.center: (M : Type u_1) β†’ [inst : AddSemigroup M] β†’ AddSubsemigroup M
AddSubsemigroup.center
-- porting note: `coe_center` is now redundant #noalign subsemigroup.coe_center #noalign add_subsemigroup.coe_center variable {
M: ?m.14278
M
} @[
to_additive: βˆ€ {M : Type u_1} [inst : AddSemigroup M] {z : M}, z ∈ AddSubsemigroup.center M ↔ βˆ€ (g : M), g + z = z + g
to_additive
] theorem
mem_center_iff: βˆ€ {M : Type u_1} [inst : Semigroup M] {z : M}, z ∈ center M ↔ βˆ€ (g : M), g * z = z * g
mem_center_iff
{
z: M
z
:
M: Type ?u.14281
M
} :
z: M
z
∈
center: (M : Type ?u.14294) β†’ [inst : Semigroup M] β†’ Subsemigroup M
center
M: Type ?u.14281
M
↔ βˆ€
g: ?m.14329
g
,
g: ?m.14329
g
*
z: M
z
=
z: M
z
*
g: ?m.14329
g
:=
Iff.rfl: βˆ€ {a : Prop}, a ↔ a
Iff.rfl
#align subsemigroup.mem_center_iff
Subsemigroup.mem_center_iff: βˆ€ {M : Type u_1} [inst : Semigroup M] {z : M}, z ∈ center M ↔ βˆ€ (g : M), g * z = z * g
Subsemigroup.mem_center_iff
#align add_subsemigroup.mem_center_iff
AddSubsemigroup.mem_center_iff: βˆ€ {M : Type u_1} [inst : AddSemigroup M] {z : M}, z ∈ AddSubsemigroup.center M ↔ βˆ€ (g : M), g + z = z + g
AddSubsemigroup.mem_center_iff
@[
to_additive: {M : Type u_1} β†’ [inst : AddSemigroup M] β†’ (a : M) β†’ [inst_1 : Decidable (βˆ€ (b : M), b + a = a + b)] β†’ Decidable (a ∈ AddSubsemigroup.center M)
to_additive
] instance
decidableMemCenter: {M : Type u_1} β†’ [inst : Semigroup M] β†’ (a : M) β†’ [inst_1 : Decidable (βˆ€ (b : M), b * a = a * b)] β†’ Decidable (a ∈ center M)
decidableMemCenter
(
a: M
a
) [
Decidable: Prop β†’ Type
Decidable
<| βˆ€
b: M
b
:
M: Type ?u.15176
M
,
b: M
b
*
a: ?m.15182
a
=
a: ?m.15182
a
*
b: M
b
] :
Decidable: Prop β†’ Type
Decidable
(
a: ?m.15182
a
∈
center: (M : Type ?u.16019) β†’ [inst : Semigroup M] β†’ Subsemigroup M
center
M: Type ?u.15176
M
) :=
decidable_of_iff': {a : Prop} β†’ (b : Prop) β†’ (a ↔ b) β†’ [inst : Decidable b] β†’ Decidable a
decidable_of_iff'
_: Prop
_
mem_center_iff: βˆ€ {M : Type ?u.16055} [inst : Semigroup M] {z : M}, z ∈ center M ↔ βˆ€ (g : M), g * z = z * g
mem_center_iff
#align subsemigroup.decidable_mem_center
Subsemigroup.decidableMemCenter: {M : Type u_1} β†’ [inst : Semigroup M] β†’ (a : M) β†’ [inst_1 : Decidable (βˆ€ (b : M), b * a = a * b)] β†’ Decidable (a ∈ center M)
Subsemigroup.decidableMemCenter
#align add_subsemigroup.decidable_mem_center
AddSubsemigroup.decidableMemCenter: {M : Type u_1} β†’ [inst : AddSemigroup M] β†’ (a : M) β†’ [inst_1 : Decidable (βˆ€ (b : M), b + a = a + b)] β†’ Decidable (a ∈ AddSubsemigroup.center M)
AddSubsemigroup.decidableMemCenter
/-- The center of a semigroup is commutative. -/ @[
to_additive: {M : Type u_1} β†’ [inst : AddSemigroup M] β†’ AddCommSemigroup { x // x ∈ AddSubsemigroup.center M }
to_additive
"The center of an additive semigroup is commutative."] instance
center.commSemigroup: {M : Type u_1} β†’ [inst : Semigroup M] β†’ CommSemigroup { x // x ∈ center M }
center.commSemigroup
:
CommSemigroup: Type ?u.16261 β†’ Type ?u.16261
CommSemigroup
(
center: (M : Type ?u.16262) β†’ [inst : Semigroup M] β†’ Subsemigroup M
center
M: Type ?u.16255
M
) := {
MulMemClass.toSemigroup: {M : Type ?u.16418} β†’ [inst : Semigroup M] β†’ {A : Type ?u.16417} β†’ [inst_1 : SetLike A M] β†’ [inst : MulMemClass A M] β†’ (S : A) β†’ Semigroup { x // x ∈ S }
MulMemClass.toSemigroup
(
center: (M : Type ?u.16424) β†’ [inst : Semigroup M] β†’ Subsemigroup M
center
M: Type ?u.16255
M
) with mul_comm := fun
_: ?m.16490
_
b: ?m.16493
b
=>
Subtype.ext: βˆ€ {Ξ± : Sort ?u.16495} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, ↑a1 = ↑a2 β†’ a1 = a2
Subtype.ext
<|
b: ?m.16493
b
.
2: βˆ€ {Ξ± : Sort ?u.16506} {p : Ξ± β†’ Prop} (self : Subtype p), p ↑self
2
_: M
_
} #align subsemigroup.center.comm_semigroup
Subsemigroup.center.commSemigroup: {M : Type u_1} β†’ [inst : Semigroup M] β†’ CommSemigroup { x // x ∈ center M }
Subsemigroup.center.commSemigroup
#align add_subsemigroup.center.add_comm_semigroup
AddSubsemigroup.center.addCommSemigroup: {M : Type u_1} β†’ [inst : AddSemigroup M] β†’ AddCommSemigroup { x // x ∈ AddSubsemigroup.center M }
AddSubsemigroup.center.addCommSemigroup
end section variable (
M: ?m.16683
M
) [
CommSemigroup: Type ?u.16692 β†’ Type ?u.16692
CommSemigroup
M: ?m.16683
M
] @[
to_additive: βˆ€ (M : Type u_1) [inst : AddCommSemigroup M], AddSubsemigroup.center M = ⊀
to_additive
(attr := simp)] theorem
center_eq_top: βˆ€ (M : Type u_1) [inst : CommSemigroup M], center M = ⊀
center_eq_top
:
center: (M : Type ?u.16696) β†’ [inst : Semigroup M] β†’ Subsemigroup M
center
M: Type ?u.16689
M
=
⊀: ?m.16943
⊀
:=
SetLike.coe_injective: βˆ€ {A : Type ?u.16992} {B : Type ?u.16993} [i : SetLike A B], Function.Injective SetLike.coe
SetLike.coe_injective
(
Set.center_eq_univ: βˆ€ (M : Type ?u.17010) [inst : CommSemigroup M], Set.center M = Set.univ
Set.center_eq_univ
M: Type ?u.16689
M
) #align subsemigroup.center_eq_top
Subsemigroup.center_eq_top: βˆ€ (M : Type u_1) [inst : CommSemigroup M], center M = ⊀
Subsemigroup.center_eq_top
#align add_subsemigroup.center_eq_top
AddSubsemigroup.center_eq_top: βˆ€ (M : Type u_1) [inst : AddCommSemigroup M], AddSubsemigroup.center M = ⊀
AddSubsemigroup.center_eq_top
end end Subsemigroup -- Guard against import creep assert_not_exists Finset