@@ -37,7 +37,11 @@ open Function
37
37
38
38
namespace MulAction
39
39
40
- variable (M : Type u) {α : Type v} [Monoid M] [MulAction M α]
40
+ variable (M : Type u) [Monoid M] (α : Type v) [MulAction M α]
41
+
42
+ section Orbit
43
+
44
+ variable {α}
41
45
42
46
/-- The orbit of an element under an action. -/
43
47
@[to_additive "The orbit of an element under an action."]
@@ -55,8 +59,8 @@ theorem mem_orbit_iff {a₁ a₂ : α} : a₂ ∈ orbit M a₁ ↔ ∃ x : M, x
55
59
#align add_action.mem_orbit_iff AddAction.mem_orbit_iff
56
60
57
61
@[to_additive (attr := simp)]
58
- theorem mem_orbit (a : α) (x : M) : x • a ∈ orbit M a :=
59
- ⟨x , rfl⟩
62
+ theorem mem_orbit (a : α) (m : M) : m • a ∈ orbit M a :=
63
+ ⟨m , rfl⟩
60
64
#align mul_action.mem_orbit MulAction.mem_orbit
61
65
#align add_action.mem_orbit AddAction.mem_orbit
62
66
@@ -102,7 +106,17 @@ theorem orbit.coe_smul {a : α} {m : M} {a' : orbit M a} : ↑(m • a') = m •
102
106
#align mul_action.orbit.coe_smul MulAction.orbit.coe_smul
103
107
#align add_action.orbit.coe_vadd AddAction.orbit.coe_vadd
104
108
105
- variable (M) (α)
109
+ variable (M)
110
+
111
+ @[to_additive]
112
+ theorem orbit_eq_univ [IsPretransitive M α] (a : α) : orbit M a = Set.univ :=
113
+ (surjective_smul M a).range_eq
114
+ #align mul_action.orbit_eq_univ MulAction.orbit_eq_univ
115
+ #align add_action.orbit_eq_univ AddAction.orbit_eq_univ
116
+
117
+ end Orbit
118
+
119
+ section FixedPoints
106
120
107
121
/-- The set of elements fixed under the whole action. -/
108
122
@[to_additive "The set of elements fixed under the whole action."]
@@ -111,21 +125,25 @@ def fixedPoints : Set α :=
111
125
#align mul_action.fixed_points MulAction.fixedPoints
112
126
#align add_action.fixed_points AddAction.fixedPoints
113
127
128
+ variable {M}
129
+
114
130
/-- `fixedBy m` is the set of elements fixed by `m`. -/
115
131
@[to_additive "`fixedBy m` is the set of elements fixed by `m`."]
116
132
def fixedBy (m : M) : Set α :=
117
133
{ x | m • x = x }
118
134
#align mul_action.fixed_by MulAction.fixedBy
119
135
#align add_action.fixed_by AddAction.fixedBy
120
136
137
+ variable (M)
138
+
121
139
@[to_additive]
122
- theorem fixed_eq_iInter_fixedBy : fixedPoints M α = ⋂ m : M, fixedBy M α m :=
140
+ theorem fixed_eq_iInter_fixedBy : fixedPoints M α = ⋂ m : M, fixedBy α m :=
123
141
Set.ext fun _ =>
124
142
⟨fun hx => Set.mem_iInter.2 fun m => hx m, fun hx m => (Set.mem_iInter.1 hx m : _)⟩
125
143
#align mul_action.fixed_eq_Inter_fixed_by MulAction.fixed_eq_iInter_fixedBy
126
144
#align add_action.fixed_eq_Inter_fixed_by AddAction.fixed_eq_iInter_fixedBy
127
145
128
- variable {M}
146
+ variable {M α }
129
147
130
148
@[to_additive (attr := simp)]
131
149
theorem mem_fixedPoints {a : α} : a ∈ fixedPoints M α ↔ ∀ m : M, m • a = a :=
@@ -134,7 +152,7 @@ theorem mem_fixedPoints {a : α} : a ∈ fixedPoints M α ↔ ∀ m : M, m • a
134
152
#align add_action.mem_fixed_points AddAction.mem_fixedPoints
135
153
136
154
@[to_additive (attr := simp)]
137
- theorem mem_fixedBy {m : M} {a : α} : a ∈ fixedBy M α m ↔ m • a = a :=
155
+ theorem mem_fixedBy {m : M} {a : α} : a ∈ fixedBy α m ↔ m • a = a :=
138
156
Iff.rfl
139
157
#align mul_action.mem_fixed_by MulAction.mem_fixedBy
140
158
#align add_action.mem_fixed_by AddAction.mem_fixedBy
@@ -148,36 +166,6 @@ theorem mem_fixedPoints' {a : α} : a ∈ fixedPoints M α ↔ ∀ a', a' ∈ or
148
166
#align mul_action.mem_fixed_points' MulAction.mem_fixedPoints'
149
167
#align add_action.mem_fixed_points' AddAction.mem_fixedPoints'
150
168
151
- variable (M) {α}
152
-
153
- /-- The stabilizer of a point `a` as a submonoid of `M`. -/
154
- @[to_additive "The stabilizer of m point `a` as an additive submonoid of `M`."]
155
- def Stabilizer.submonoid (a : α) : Submonoid M where
156
- carrier := { m | m • a = a }
157
- one_mem' := one_smul _ a
158
- mul_mem' {m m'} (ha : m • a = a) (hb : m' • a = a) :=
159
- show (m * m') • a = a by rw [← smul_smul, hb, ha]
160
- #align mul_action.stabilizer.submonoid MulAction.Stabilizer.submonoid
161
- #align add_action.stabilizer.add_submonoid AddAction.Stabilizer.addSubmonoid
162
-
163
- @[to_additive (attr := simp)]
164
- theorem mem_stabilizer_submonoid_iff {a : α} {m : M} : m ∈ Stabilizer.submonoid M a ↔ m • a = a :=
165
- Iff.rfl
166
- #align mul_action.mem_stabilizer_submonoid_iff MulAction.mem_stabilizer_submonoid_iff
167
- #align add_action.mem_stabilizer_add_submonoid_iff AddAction.mem_stabilizer_addSubmonoid_iff
168
-
169
- @[to_additive]
170
- instance [DecidableEq α] (a : α) : DecidablePred (· ∈ Stabilizer.submonoid M a) :=
171
- fun _ => inferInstanceAs <| Decidable (_ = _)
172
-
173
- @[to_additive]
174
- theorem orbit_eq_univ [IsPretransitive M α] (a : α) : orbit M a = Set.univ :=
175
- (surjective_smul M a).range_eq
176
- #align mul_action.orbit_eq_univ MulAction.orbit_eq_univ
177
- #align add_action.orbit_eq_univ AddAction.orbit_eq_univ
178
-
179
- variable {M}
180
-
181
169
@[to_additive mem_fixedPoints_iff_card_orbit_eq_one]
182
170
theorem mem_fixedPoints_iff_card_orbit_eq_one {a : α} [Fintype (orbit M a)] :
183
171
a ∈ fixedPoints M α ↔ Fintype.card (orbit M a) = 1 := by
@@ -192,34 +180,56 @@ theorem mem_fixedPoints_iff_card_orbit_eq_one {a : α} [Fintype (orbit M a)] :
192
180
#align mul_action.mem_fixed_points_iff_card_orbit_eq_one MulAction.mem_fixedPoints_iff_card_orbit_eq_one
193
181
#align add_action.mem_fixed_points_iff_card_orbit_eq_zero AddAction.mem_fixedPoints_iff_card_orbit_eq_one
194
182
195
- end MulAction
183
+ end FixedPoints
196
184
197
- namespace MulAction
185
+ section Stabilizers
198
186
199
- variable (G : Type u) {α : Type v} [Group G] [MulAction G α]
187
+ variable {α}
200
188
201
- /-- The stabilizer of an element under an action, i.e. what sends the element to itself.
202
- A subgroup. -/
203
- @[to_additive
204
- "The stabilizer of an element under an action, i.e. what sends the element to itself.
205
- An additive subgroup." ]
206
- def stabilizer (a : α) : Subgroup G :=
207
- { Stabilizer.submonoid G a with
208
- inv_mem' := fun {m} (ha : m • a = a) => show m⁻¹ • a = a by rw [inv_smul_eq_iff, ha] }
209
- #align mul_action.stabilizer MulAction.stabilizer
210
- #align add_action.stabilizer AddAction.stabilizer
189
+ /-- The stabilizer of a point `a` as a submonoid of `M`. -/
190
+ @[to_additive "The stabilizer of a point `a` as an additive submonoid of `M`."]
191
+ def stabilizerSubmonoid (a : α) : Submonoid M where
192
+ carrier := { m | m • a = a }
193
+ one_mem' := one_smul _ a
194
+ mul_mem' {m m'} (ha : m • a = a) (hb : m' • a = a) :=
195
+ show (m * m') • a = a by rw [← smul_smul, hb, ha]
196
+ #align mul_action.stabilizer.submonoid MulAction.stabilizerSubmonoid
197
+ #align add_action.stabilizer.add_submonoid AddAction.stabilizerAddSubmonoid
211
198
212
- variable {G}
199
+ variable {M}
200
+
201
+ @[to_additive]
202
+ instance [DecidableEq α] (a : α) : DecidablePred (· ∈ stabilizerSubmonoid M a) :=
203
+ fun _ => inferInstanceAs <| Decidable (_ = _)
213
204
214
205
@[to_additive (attr := simp)]
215
- theorem mem_stabilizer_iff {g : G } {a : α } : g ∈ stabilizer G a ↔ g • a = a :=
206
+ theorem mem_stabilizerSubmonoid_iff {a : α } {m : M } : m ∈ stabilizerSubmonoid M a ↔ m • a = a :=
216
207
Iff.rfl
217
- #align mul_action.mem_stabilizer_iff MulAction.mem_stabilizer_iff
218
- #align add_action.mem_stabilizer_iff AddAction.mem_stabilizer_iff
208
+ #align mul_action.mem_stabilizer_submonoid_iff MulAction.mem_stabilizerSubmonoid_iff
209
+ #align add_action.mem_stabilizer_add_submonoid_iff AddAction.mem_stabilizerAddSubmonoid_iff
219
210
220
- @[to_additive]
221
- instance [DecidableEq α] (a : α) : DecidablePred (· ∈ stabilizer G a) :=
222
- fun _ => inferInstanceAs <| Decidable (_ = _)
211
+ end Stabilizers
212
+
213
+ end MulAction
214
+
215
+ /-- `smul` by a `k : M` over a ring is injective, if `k` is not a zero divisor.
216
+ The general theory of such `k` is elaborated by `IsSMulRegular`.
217
+ The typeclass that restricts all terms of `M` to have this property is `NoZeroSMulDivisors`. -/
218
+ theorem smul_cancel_of_non_zero_divisor {M R : Type *} [Monoid M] [NonUnitalNonAssocRing R]
219
+ [DistribMulAction M R] (k : M) (h : ∀ x : R, k • x = 0 → x = 0 ) {a b : R} (h' : k • a = k • b) :
220
+ a = b := by
221
+ rw [← sub_eq_zero]
222
+ refine' h _ _
223
+ rw [smul_sub, h', sub_self]
224
+ #align smul_cancel_of_non_zero_divisor smul_cancel_of_non_zero_divisor
225
+
226
+ namespace MulAction
227
+
228
+ variable (G : Type u) [Group G] (α : Type v) [MulAction G α]
229
+
230
+ section Orbit
231
+
232
+ variable {G α}
223
233
224
234
@[to_additive (attr := simp)]
225
235
theorem smul_orbit (g : G) (a : α) : g • orbit G a = orbit G a :=
@@ -254,8 +264,6 @@ theorem orbit_eq_iff {a b : α} : orbit G a = orbit G b ↔ a ∈ orbit G b :=
254
264
#align mul_action.orbit_eq_iff MulAction.orbit_eq_iff
255
265
#align add_action.orbit_eq_iff AddAction.orbit_eq_iff
256
266
257
- variable (G)
258
-
259
267
@[to_additive]
260
268
theorem mem_orbit_smul (g : G) (a : α) : a ∈ orbit G (g • a) := by
261
269
simp only [orbit_smul, mem_orbit_self]
@@ -268,7 +276,7 @@ theorem smul_mem_orbit_smul (g h : G) (a : α) : g • a ∈ orbit G (h • a) :
268
276
#align mul_action.smul_mem_orbit_smul MulAction.smul_mem_orbit_smul
269
277
#align add_action.vadd_mem_orbit_vadd AddAction.vadd_mem_orbit_vadd
270
278
271
- variable (α)
279
+ variable (G α)
272
280
273
281
/-- The relation 'in the same orbit'. -/
274
282
@[to_additive "The relation 'in the same orbit'."]
@@ -420,7 +428,34 @@ def selfEquivSigmaOrbits : α ≃ Σω : Ω, orbit G ω.out' :=
420
428
#align mul_action.self_equiv_sigma_orbits MulAction.selfEquivSigmaOrbits
421
429
#align add_action.self_equiv_sigma_orbits AddAction.selfEquivSigmaOrbits
422
430
423
- variable {G α}
431
+ end Orbit
432
+
433
+ section Stabilizer
434
+
435
+ variable {α}
436
+
437
+ /-- The stabilizer of an element under an action, i.e. what sends the element to itself.
438
+ A subgroup. -/
439
+ @[to_additive
440
+ "The stabilizer of an element under an action, i.e. what sends the element to itself.
441
+ An additive subgroup." ]
442
+ def stabilizer (a : α) : Subgroup G :=
443
+ { stabilizerSubmonoid G a with
444
+ inv_mem' := fun {m} (ha : m • a = a) => show m⁻¹ • a = a by rw [inv_smul_eq_iff, ha] }
445
+ #align mul_action.stabilizer MulAction.stabilizer
446
+ #align add_action.stabilizer AddAction.stabilizer
447
+
448
+ variable {G}
449
+
450
+ @[to_additive]
451
+ instance [DecidableEq α] (a : α) : DecidablePred (· ∈ stabilizer G a) :=
452
+ fun _ => inferInstanceAs <| Decidable (_ = _)
453
+
454
+ @[to_additive (attr := simp)]
455
+ theorem mem_stabilizer_iff {a : α} {g : G} : g ∈ stabilizer G a ↔ g • a = a :=
456
+ Iff.rfl
457
+ #align mul_action.mem_stabilizer_iff MulAction.mem_stabilizer_iff
458
+ #align add_action.mem_stabilizer_iff AddAction.mem_stabilizer_iff
424
459
425
460
/-- If the stabilizer of `a` is `S`, then the stabilizer of `g • a` is `gSg⁻¹`. -/
426
461
theorem stabilizer_smul_eq_stabilizer_map_conj (g : G) (a : α) :
@@ -440,11 +475,13 @@ noncomputable def stabilizerEquivStabilizerOfOrbitRel {a b : α} (h : (orbitRel
440
475
(MulEquiv.subgroupCongr this).trans ((MulAut.conj g).subgroupMap <| stabilizer G b).symm
441
476
#align mul_action.stabilizer_equiv_stabilizer_of_orbit_rel MulAction.stabilizerEquivStabilizerOfOrbitRel
442
477
478
+ end Stabilizer
479
+
443
480
end MulAction
444
481
445
482
namespace AddAction
446
483
447
- variable (G : Type u) (α : Type v) [AddGroup G] [AddAction G α]
484
+ variable (G : Type u) [AddGroup G] (α : Type v) [AddAction G α]
448
485
449
486
/-- If the stabilizer of `x` is `S`, then the stabilizer of `g +ᵥ x` is `g + S + (-g)`. -/
450
487
theorem stabilizer_vadd_eq_stabilizer_map_conj (g : G) (a : α) :
@@ -466,14 +503,3 @@ noncomputable def stabilizerEquivStabilizerOfOrbitRel {a b : α} (h : (orbitRel
466
503
#align add_action.stabilizer_equiv_stabilizer_of_orbit_rel AddAction.stabilizerEquivStabilizerOfOrbitRel
467
504
468
505
end AddAction
469
-
470
- /-- `smul` by a `k : M` over a ring is injective, if `k` is not a zero divisor.
471
- The general theory of such `k` is elaborated by `IsSMulRegular`.
472
- The typeclass that restricts all terms of `M` to have this property is `NoZeroSMulDivisors`. -/
473
- theorem smul_cancel_of_non_zero_divisor {M R : Type *} [Monoid M] [NonUnitalNonAssocRing R]
474
- [DistribMulAction M R] (k : M) (h : ∀ x : R, k • x = 0 → x = 0 ) {a b : R} (h' : k • a = k • b) :
475
- a = b := by
476
- rw [← sub_eq_zero]
477
- refine' h _ _
478
- rw [smul_sub, h', sub_self]
479
- #align smul_cancel_of_non_zero_divisor smul_cancel_of_non_zero_divisor
0 commit comments