Skip to content

Commit 30a9315

Browse files
committed
feat(GroupTheory/GroupAction): define MulAction.period and create GroupTheory/GroupAction/Period (#9490)
Defines `MulAction.period g a` as a wrapper around `Function.minimalPeriod (fun x => g • x) a`, allowing for some cleaner proofs involving the period of a group action. The existing `MulAction.*_minimalPeriod_*` lemmas are changed to be defined using their now-preferred `MulAction.*_period_*` counterparts, although they will only be made deprecated in another pull request. The `Mathlib.GroupTheory.GroupAction.Period` module is also created, for additional lemmas around `MulAction.period`. Some core lemmas need to remain in `Mathlib.Dynamics.PeriodicPts`, as they are needed for `ZMod` and the quotient group.
1 parent d43978d commit 30a9315

File tree

4 files changed

+223
-16
lines changed

4 files changed

+223
-16
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2284,6 +2284,7 @@ import Mathlib.GroupTheory.GroupAction.Group
22842284
import Mathlib.GroupTheory.GroupAction.Hom
22852285
import Mathlib.GroupTheory.GroupAction.Opposite
22862286
import Mathlib.GroupTheory.GroupAction.Option
2287+
import Mathlib.GroupTheory.GroupAction.Period
22872288
import Mathlib.GroupTheory.GroupAction.Pi
22882289
import Mathlib.GroupTheory.GroupAction.Prod
22892290
import Mathlib.GroupTheory.GroupAction.Quotient

Mathlib/Algebra/GroupPower/IterateHom.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,10 @@ theorem smul_iterate [MulAction G H] : (a • · : H → H)^[n] = (a ^ n • ·)
174174
#align smul_iterate smul_iterate
175175
#align vadd_iterate vadd_iterate
176176

177+
@[to_additive]
178+
lemma smul_iterate_apply [MulAction G H] {b : H} : (a • ·)^[n] b = a ^ n • b := by
179+
rw [smul_iterate]
180+
177181
@[to_additive (attr := simp)]
178182
theorem mul_left_iterate : (a * ·)^[n] = (a ^ n * ·) :=
179183
smul_iterate a n

Mathlib/Dynamics/PeriodicPts.lean

Lines changed: 93 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ A point `x : α` is a periodic point of `f : α → α` of period `n` if `f^[n]
2727
* `minimalPeriod f x` : the minimal period of a point `x` under an endomorphism `f` or zero
2828
if `x` is not a periodic point of `f`.
2929
* `orbit f x`: the cycle `[x, f x, f (f x), ...]` for a periodic point.
30+
* `MulAction.period g x` : the minimal period of a point `x` under the multiplicative action of `g`;
31+
an equivalent `AddAction.period g x` is defined for additive actions.
3032
3133
## Main statements
3234
@@ -628,42 +630,117 @@ namespace MulAction
628630

629631
open Function
630632

631-
variable {α β : Type*} [Group α] [MulAction α β] {a : α} {b : β}
633+
universe u v
634+
variable {α : Type v}
635+
variable {G : Type u} [Group G] [MulAction G α]
636+
variable {M : Type u} [Monoid M] [MulAction M α]
637+
638+
/--
639+
The period of a multiplicative action of `g` on `a` is the smallest positive `n` such that
640+
`g ^ n • a = a`, or `0` if such an `n` does not exist.
641+
-/
642+
@[to_additive "The period of an additive action of `g` on `a` is the smallest positive `n`
643+
such that `(n • g) +ᵥ a = a`, or `0` if such an `n` does not exist."]
644+
noncomputable def period (m : M) (a : α) : ℕ := minimalPeriod (fun x => m • x) a
645+
646+
/-- `MulAction.period m a` is definitionally equal to `Function.minimalPeriod (m • ·) a`. -/
647+
@[to_additive "`AddAction.period m a` is definitionally equal to
648+
`Function.minimalPeriod (m +ᵥ ·) a`"]
649+
theorem period_eq_minimalPeriod {m : M} {a : α} :
650+
MulAction.period m a = minimalPeriod (fun x => m • x) a := rfl
651+
652+
/-- `m ^ (period m a)` fixes `a`. -/
653+
@[to_additive (attr := simp) "`(period m a) • m` fixes `a`."]
654+
theorem pow_period_smul (m : M) (a : α) : m ^ (period m a) • a = a := by
655+
rw [period_eq_minimalPeriod, ← smul_iterate_apply, iterate_minimalPeriod]
656+
657+
@[to_additive]
658+
lemma isPeriodicPt_smul_iff {m : M} {a : α} {n : ℕ} :
659+
IsPeriodicPt (m • ·) n a ↔ m ^ n • a = a := by
660+
rw [← smul_iterate_apply, IsPeriodicPt, IsFixedPt]
661+
662+
/-! ### Multiples of `MulAction.period`
663+
664+
It is easy to convince oneself that if `g ^ n • a = a` (resp. `(n • g) +ᵥ a = a`),
665+
then `n` must be a multiple of `period g a`.
666+
667+
This also holds for negative powers/multiples.
668+
-/
669+
670+
@[to_additive]
671+
theorem pow_smul_eq_iff_period_dvd {n : ℕ} {m : M} {a : α} :
672+
m ^ n • a = a ↔ period m a ∣ n := by
673+
rw [period_eq_minimalPeriod, ← isPeriodicPt_iff_minimalPeriod_dvd, isPeriodicPt_smul_iff]
674+
675+
@[to_additive]
676+
theorem zpow_smul_eq_iff_period_dvd {j : ℤ} {g : G} {a : α} :
677+
g ^ j • a = a ↔ (period g a : ℤ) ∣ j := by
678+
rcases j with n | n
679+
· rw [Int.ofNat_eq_coe, zpow_ofNat, Int.coe_nat_dvd, pow_smul_eq_iff_period_dvd]
680+
· rw [Int.negSucc_coe, zpow_neg, zpow_ofNat, inv_smul_eq_iff, eq_comm, dvd_neg, Int.coe_nat_dvd,
681+
pow_smul_eq_iff_period_dvd]
682+
683+
@[to_additive (attr := simp)]
684+
theorem pow_mod_period_smul (n : ℕ) {m : M} {a : α} :
685+
m ^ (n % period m a) • a = m ^ n • a := by
686+
conv_rhs => rw [← Nat.mod_add_div n (period m a), pow_add, mul_smul,
687+
pow_smul_eq_iff_period_dvd.mpr (dvd_mul_right _ _)]
688+
689+
@[to_additive (attr := simp)]
690+
theorem zpow_mod_period_smul (j : ℤ) {g : G} {a : α} :
691+
g ^ (j % (period g a : ℤ)) • a = g ^ j • a := by
692+
conv_rhs => rw [← Int.emod_add_ediv j (period g a), zpow_add, mul_smul,
693+
zpow_smul_eq_iff_period_dvd.mpr (dvd_mul_right _ _)]
694+
695+
@[to_additive (attr := simp)]
696+
theorem pow_add_period_smul (n : ℕ) (m : M) (a : α) :
697+
m ^ (n + period m a) • a = m ^ n • a := by
698+
rw [← pow_mod_period_smul, Nat.add_mod_right, pow_mod_period_smul]
699+
700+
@[to_additive (attr := simp)]
701+
theorem pow_period_add_smul (n : ℕ) (m : M) (a : α) :
702+
m ^ (period m a + n) • a = m ^ n • a := by
703+
rw [← pow_mod_period_smul, Nat.add_mod_left, pow_mod_period_smul]
704+
705+
@[to_additive (attr := simp)]
706+
theorem zpow_add_period_smul (i : ℤ) (g : G) (a : α) :
707+
g ^ (i + period g a) • a = g ^ i • a := by
708+
rw [← zpow_mod_period_smul, Int.add_emod_self, zpow_mod_period_smul]
709+
710+
@[to_additive (attr := simp)]
711+
theorem zpow_period_add_smul (i : ℤ) (g : G) (a : α) :
712+
g ^ (period g a + i) • a = g ^ i • a := by
713+
rw [← zpow_mod_period_smul, Int.add_emod_self_left, zpow_mod_period_smul]
714+
715+
variable {a : G} {b : α}
632716

633717
@[to_additive]
634718
theorem pow_smul_eq_iff_minimalPeriod_dvd {n : ℕ} :
635-
a ^ n • b = b ↔ Function.minimalPeriod (a • ·) b ∣ n := by
636-
rw [← isPeriodicPt_iff_minimalPeriod_dvd, IsPeriodicPt, IsFixedPt, smul_iterate]
719+
a ^ n • b = b ↔ minimalPeriod (a • ·) b ∣ n := by
720+
rw [← period_eq_minimalPeriod, pow_smul_eq_iff_period_dvd]
637721
#align mul_action.pow_smul_eq_iff_minimal_period_dvd MulAction.pow_smul_eq_iff_minimalPeriod_dvd
638722
#align add_action.nsmul_vadd_eq_iff_minimal_period_dvd AddAction.nsmul_vadd_eq_iff_minimalPeriod_dvd
639723

640724
@[to_additive]
641725
theorem zpow_smul_eq_iff_minimalPeriod_dvd {n : ℤ} :
642-
a ^ n • b = b ↔ (Function.minimalPeriod (a • ·) b : ℤ) ∣ n := by
643-
cases n
644-
· rw [Int.ofNat_eq_coe, zpow_ofNat, Int.coe_nat_dvd, pow_smul_eq_iff_minimalPeriod_dvd]
645-
· rw [Int.negSucc_coe, zpow_neg, zpow_ofNat, inv_smul_eq_iff, eq_comm, dvd_neg, Int.coe_nat_dvd,
646-
pow_smul_eq_iff_minimalPeriod_dvd]
726+
a ^ n • b = b ↔ (minimalPeriod (a • ·) b : ℤ) ∣ n := by
727+
rw [← period_eq_minimalPeriod, zpow_smul_eq_iff_period_dvd]
647728
#align mul_action.zpow_smul_eq_iff_minimal_period_dvd MulAction.zpow_smul_eq_iff_minimalPeriod_dvd
648729
#align add_action.zsmul_vadd_eq_iff_minimal_period_dvd AddAction.zsmul_vadd_eq_iff_minimalPeriod_dvd
649730

650731
variable (a b)
651732

652733
@[to_additive (attr := simp)]
653734
theorem pow_smul_mod_minimalPeriod (n : ℕ) :
654-
a ^ (n % Function.minimalPeriod (a • ·) b) • b = a ^ n • b := by
655-
conv_rhs =>
656-
rw [← Nat.mod_add_div n (minimalPeriod (a • ·) b), pow_add, mul_smul,
657-
pow_smul_eq_iff_minimalPeriod_dvd.mpr (dvd_mul_right _ _)]
735+
a ^ (n % minimalPeriod (a • ·) b) • b = a ^ n • b := by
736+
rw [← period_eq_minimalPeriod, pow_mod_period_smul]
658737
#align mul_action.pow_smul_mod_minimal_period MulAction.pow_smul_mod_minimalPeriod
659738
#align add_action.nsmul_vadd_mod_minimal_period AddAction.nsmul_vadd_mod_minimalPeriod
660739

661740
@[to_additive (attr := simp)]
662741
theorem zpow_smul_mod_minimalPeriod (n : ℤ) :
663-
a ^ (n % (Function.minimalPeriod (a • ·) b : ℤ)) • b = a ^ n • b := by
664-
conv_rhs =>
665-
rw [← Int.emod_add_ediv n (minimalPeriod ((a • ·)) b), zpow_add, mul_smul,
666-
zpow_smul_eq_iff_minimalPeriod_dvd.mpr (dvd_mul_right _ _)]
742+
a ^ (n % (minimalPeriod (a • ·) b : ℤ)) • b = a ^ n • b := by
743+
rw [← period_eq_minimalPeriod, zpow_mod_period_smul]
667744
#align mul_action.zpow_smul_mod_minimal_period MulAction.zpow_smul_mod_minimalPeriod
668745
#align add_action.zsmul_vadd_mod_minimal_period AddAction.zsmul_vadd_mod_minimalPeriod
669746

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/-
2+
Copyright (c) 2024 Emilie Burgun. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Emilie Burgun
5+
-/
6+
7+
import Mathlib.Dynamics.PeriodicPts
8+
import Mathlib.GroupTheory.Exponent
9+
import Mathlib.GroupTheory.GroupAction.Basic
10+
11+
/-!
12+
# Period of a group action
13+
14+
This module defines some helpful lemmas around [`MulAction.period`] and [`AddAction.period`].
15+
The period of a point `a` by a group element `g` is the smallest `m` such that `g ^ m • a = a`
16+
(resp. `(m • g) +ᵥ a = a`) for a given `g : G` and `a : α`.
17+
18+
If such an `m` does not exist,
19+
then by convention `MulAction.period` and `AddAction.period` return 0.
20+
-/
21+
22+
namespace MulAction
23+
24+
universe u v
25+
variable {α : Type v}
26+
variable {G : Type u} [Group G] [MulAction G α]
27+
variable {M : Type u} [Monoid M] [MulAction M α]
28+
29+
/-- If the action is periodic, then a lower bound for its period can be computed. -/
30+
@[to_additive "If the action is periodic, then a lower bound for its period can be computed."]
31+
theorem le_period {m : M} {a : α} {n : ℕ} (period_pos : 0 < period m a)
32+
(moved : ∀ k, 0 < k → k < n → m ^ k • a ≠ a) : n ≤ period m a :=
33+
le_of_not_gt fun period_lt_n =>
34+
moved _ period_pos period_lt_n <| pow_period_smul m a
35+
36+
/-- If for some `n`, `m ^ n • a = a`, then `period m a ≤ n`. -/
37+
@[to_additive "If for some `n`, `(n • m) +ᵥ a = a`, then `period m a ≤ n`."]
38+
theorem period_le_of_fixed {m : M} {a : α} {n : ℕ} (n_pos : 0 < n) (fixed : m ^ n • a = a) :
39+
period m a ≤ n :=
40+
(isPeriodicPt_smul_iff.mpr fixed).minimalPeriod_le n_pos
41+
42+
/-- If for some `n`, `m ^ n • a = a`, then `0 < period m a`. -/
43+
@[to_additive "If for some `n`, `(n • m) +ᵥ a = a`, then `0 < period m a`."]
44+
theorem period_pos_of_fixed {m : M} {a : α} {n : ℕ} (n_pos : 0 < n) (fixed : m ^ n • a = a) :
45+
0 < period m a :=
46+
(isPeriodicPt_smul_iff.mpr fixed).minimalPeriod_pos n_pos
47+
48+
@[to_additive]
49+
theorem period_eq_one_iff {m : M} {a : α} : period m a = 1 ↔ m • a = a :=
50+
fun eq_one => pow_one m ▸ eq_one ▸ pow_period_smul m a,
51+
fun fixed => le_antisymm
52+
(period_le_of_fixed one_pos (by simpa))
53+
(period_pos_of_fixed one_pos (by simpa))⟩
54+
55+
/-- For any non-zero `n` less than the period of `m` on `a`, `a` is moved by `m ^ n`. -/
56+
@[to_additive "For any non-zero `n` less than the period of `m` on `a`, `a` is moved by `n • m`."]
57+
theorem pow_smul_ne_of_lt_period {m : M} {a : α} {n : ℕ} (n_pos : 0 < n)
58+
(n_lt_period : n < period m a) : m ^ n • a ≠ a := fun a_fixed =>
59+
not_le_of_gt n_lt_period <| period_le_of_fixed n_pos a_fixed
60+
61+
section Identities
62+
63+
/-! ### `MulAction.period` for common group elements
64+
-/
65+
66+
variable (M) in
67+
@[to_additive (attr := simp)]
68+
theorem period_one (a : α) : period (1 : M) a = 1 := period_eq_one_iff.mpr (one_smul M a)
69+
70+
@[to_additive (attr := simp)]
71+
theorem period_inv (g : G) (a : α) : period g⁻¹ a = period g a := by
72+
simp only [period_eq_minimalPeriod, Function.minimalPeriod_eq_minimalPeriod_iff,
73+
isPeriodicPt_smul_iff]
74+
intro n
75+
rw [smul_eq_iff_eq_inv_smul, eq_comm, ← zpow_ofNat, inv_zpow, inv_inv, zpow_ofNat]
76+
77+
end Identities
78+
79+
section MonoidExponent
80+
81+
/-! ### `MulAction.period` and group exponents
82+
83+
The period of a given element `m : M` can be bounded by the `Monoid.exponent M` or `orderOf m`.
84+
-/
85+
86+
@[to_additive]
87+
theorem period_dvd_orderOf (m : M) (a : α) : period m a ∣ orderOf m := by
88+
rw [← pow_smul_eq_iff_period_dvd, pow_orderOf_eq_one, one_smul]
89+
90+
@[to_additive]
91+
theorem period_pos_of_orderOf_pos {m : M} (order_pos : 0 < orderOf m) (a : α) :
92+
0 < period m a :=
93+
Nat.pos_of_dvd_of_pos (period_dvd_orderOf m a) order_pos
94+
95+
@[to_additive]
96+
theorem period_le_orderOf {m : M} (order_pos : 0 < orderOf m) (a : α) :
97+
period m a ≤ orderOf m :=
98+
Nat.le_of_dvd order_pos (period_dvd_orderOf m a)
99+
100+
@[to_additive]
101+
theorem period_dvd_exponent (m : M) (a : α) : period m a ∣ Monoid.exponent M := by
102+
rw [← pow_smul_eq_iff_period_dvd, Monoid.pow_exponent_eq_one, one_smul]
103+
104+
@[to_additive]
105+
theorem period_pos_of_exponent_pos (exp_pos : 0 < Monoid.exponent M) (m : M) (a : α) :
106+
0 < period m a :=
107+
Nat.pos_of_dvd_of_pos (period_dvd_exponent m a) exp_pos
108+
109+
@[to_additive]
110+
theorem period_le_exponent (exp_pos : 0 < Monoid.exponent M) (m : M) (a : α) :
111+
period m a ≤ Monoid.exponent M :=
112+
Nat.le_of_dvd exp_pos (period_dvd_exponent m a)
113+
114+
variable (α)
115+
116+
@[to_additive]
117+
theorem period_bounded_of_exponent_pos (exp_pos : 0 < Monoid.exponent M) (m : M) :
118+
BddAbove (Set.range (fun a : α => period m a)) := by
119+
use Monoid.exponent M
120+
simpa [upperBounds] using period_le_exponent exp_pos _
121+
122+
end MonoidExponent
123+
124+
125+
end MulAction

0 commit comments

Comments
 (0)