@@ -7,7 +7,7 @@ import Aesop
7
7
import Mathlib.Algebra.Group.Defs
8
8
import Mathlib.Data.Nat.Init
9
9
import Mathlib.Data.Int.Init
10
- import Mathlib.Logic.Function.Basic
10
+ import Mathlib.Logic.Function.Iterate
11
11
import Mathlib.Tactic.SimpRw
12
12
import Mathlib.Tactic.SplitIfs
13
13
@@ -206,6 +206,27 @@ lemma pow_eq_pow_mod (m : ℕ) (ha : a ^ n = 1) : a ^ m = a ^ (m % n) := by
206
206
_ = a ^ n * (a * b) * b ^ n := by simp only [mul_assoc]
207
207
_ = 1 := by simp [h, pow_mul_pow_eq_one]
208
208
209
+ @[to_additive (attr := simp)]
210
+ lemma mul_left_iterate (a : M) : ∀ n : ℕ, (a * ·)^[n] = (a ^ n * ·)
211
+ | 0 => by ext; simp
212
+ | n + 1 => by ext; simp [pow_succ, mul_left_iterate]
213
+
214
+ @[to_additive (attr := simp)]
215
+ lemma mul_right_iterate (a : M) : ∀ n : ℕ, (· * a)^[n] = (· * a ^ n)
216
+ | 0 => by ext; simp
217
+ | n + 1 => by ext; simp [pow_succ', mul_right_iterate]
218
+
219
+ @[to_additive]
220
+ lemma mul_left_iterate_apply_one (a : M) : (a * ·)^[n] 1 = a ^ n := by simp [mul_right_iterate]
221
+
222
+ @[to_additive]
223
+ lemma mul_right_iterate_apply_one (a : M) : (· * a)^[n] 1 = a ^ n := by simp [mul_right_iterate]
224
+
225
+ @[to_additive (attr := simp)]
226
+ lemma pow_iterate (k : ℕ) : ∀ n : ℕ, (fun x : M ↦ x ^ k)^[n] = (· ^ k ^ n)
227
+ | 0 => by ext; simp
228
+ | n + 1 => by ext; simp [pow_iterate, Nat.pow_succ', pow_mul]
229
+
209
230
end Monoid
210
231
211
232
section CommMonoid
@@ -866,6 +887,11 @@ theorem zpow_eq_zpow_emod {x : G} (m : ℤ) {n : ℤ} (h : x ^ n = 1) :
866
887
theorem zpow_eq_zpow_emod' {x : G} (m : ℤ) {n : ℕ} (h : x ^ n = 1 ) :
867
888
x ^ m = x ^ (m % (n : ℤ)) := zpow_eq_zpow_emod m (by simpa)
868
889
890
+ @[to_additive (attr := simp)]
891
+ lemma zpow_iterate (k : ℤ) : ∀ n : ℕ, (fun x : G ↦ x ^ k)^[n] = (· ^ k ^ n)
892
+ | 0 => by ext; simp [Int.pow_zero]
893
+ | n + 1 => by ext; simp [zpow_iterate, Int.pow_succ', zpow_mul]
894
+
869
895
/-- To show a property of all powers of `g` it suffices to show it is closed under multiplication
870
896
by `g` and `g⁻¹` on the left. For subgroups generated by more than one element, see
871
897
`Subgroup.closure_induction_left`. -/
@@ -1034,3 +1060,12 @@ theorem multiplicative_of_isTotal (p : α → Prop) (hswap : ∀ {a b}, p a →
1034
1060
exacts [⟨pa, pb⟩, ⟨pb, pc⟩, ⟨pa, pc⟩]
1035
1061
1036
1062
end multiplicative
1063
+
1064
+ /-- An auxiliary lemma that can be used to prove `⇑(f ^ n) = ⇑f^[n]`. -/
1065
+ @[to_additive]
1066
+ lemma hom_coe_pow {F : Type *} [Monoid F] (c : F → M → M) (h1 : c 1 = id)
1067
+ (hmul : ∀ f g, c (f * g) = c f ∘ c g) (f : F) : ∀ n, c (f ^ n) = (c f)^[n]
1068
+ | 0 => by
1069
+ rw [pow_zero, h1]
1070
+ rfl
1071
+ | n + 1 => by rw [pow_succ, iterate_succ, hmul, hom_coe_pow c h1 hmul f n]
0 commit comments