Skip to content

Commit 747d81a

Browse files
committed
feat(Algebra/Group/Torsion): characterise when a ^ n = 1 (#30680)
1 parent cd0d357 commit 747d81a

File tree

3 files changed

+31
-11
lines changed

3 files changed

+31
-11
lines changed

Mathlib/Algebra/Group/Torsion.lean

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,27 @@ lemma pow_left_injective (hn : n ≠ 0) : Injective fun a : M ↦ a ^ n :=
3535
@[to_additive nsmul_right_inj]
3636
lemma pow_left_inj (hn : n ≠ 0) : a ^ n = b ^ n ↔ a = b := (pow_left_injective hn).eq_iff
3737

38-
@[to_additive]
39-
lemma IsMulTorsionFree.pow_eq_one_iff (hn : n ≠ 0) : a ^ n = 1 ↔ a = 1 :=
40-
fun h ↦ by rwa [← pow_left_inj hn, one_pow], fun h ↦ by rw [h, one_pow]
38+
@[to_additive IsAddTorsionFree.nsmul_eq_zero_iff_right]
39+
lemma IsMulTorsionFree.pow_eq_one_iff_left (hn : n ≠ 0) : a ^ n = 1 ↔ a = 1 := by
40+
rw [← pow_left_inj (a := a) hn, one_pow]
4141

42-
@[to_additive]
43-
lemma IsMulTorsionFree.pow_eq_one_iff' (ha : a ≠ 1) : a ^ n = 1 ↔ n = 0 := by
44-
refine ⟨fun h ↦ ?_, fun h ↦ by rw [h, pow_zero]⟩
45-
by_contra h'
46-
simpa [h] using (pow_left_injective h').ne ha
42+
-- We want to use `IsAddTorsion.nsmul_eq_zero_iff` earlier than `smul_eq_zero`.
43+
@[to_additive (attr := simp high)]
44+
lemma IsMulTorsionFree.pow_eq_one_iff : a ^ n = 1 ↔ a = 1 ∨ n = 0 := by
45+
obtain rfl | hn := eq_or_ne n 0 <;> simp [pow_eq_one_iff_left, *]
46+
47+
@[to_additive IsAddTorsionFree.nsmul_eq_zero_iff_left]
48+
lemma IsMulTorsionFree.pow_eq_one_iff_right (ha : a ≠ 1) : a ^ n = 1 ↔ n = 0 := by simp [*]
49+
50+
@[deprecated (since := "2025-10-19")]
51+
alias IsAddTorsionFree.nsmul_eq_zero_iff' := IsAddTorsionFree.nsmul_eq_zero_iff_left
52+
53+
@[deprecated (since := "2025-10-19")]
54+
alias IsMulTorsionFree.pow_eq_one_iff' := IsMulTorsionFree.pow_eq_one_iff_right
4755

4856
/-- See `sq_eq_one_iff` for a version that holds in rings. -/
4957
@[to_additive two_nsmul_eq_zero]
50-
lemma sq_eq_one : a ^ 2 = 1 ↔ a = 1 := IsMulTorsionFree.pow_eq_one_iff (by cutsat)
58+
lemma sq_eq_one : a ^ 2 = 1 ↔ a = 1 := IsMulTorsionFree.pow_eq_one_iff_left (by cutsat)
5159

5260
end Monoid
5361

@@ -69,6 +77,18 @@ lemma zpow_left_inj (hn : n ≠ 0) : a ^ n = b ^ n ↔ a = b := (zpow_left_injec
6977
and `zsmul_lt_zsmul_iff'`. -/]
7078
lemma zpow_eq_zpow_iff' (hn : n ≠ 0) : a ^ n = b ^ n ↔ a = b := zpow_left_inj hn
7179

80+
@[to_additive IsAddTorsionFree.zsmul_eq_zero_iff_right]
81+
lemma IsMulTorsionFree.zpow_eq_one_iff_left (hn : n ≠ 0) : a ^ n = 1 ↔ a = 1 := by
82+
rw [← zpow_left_inj (a := a) hn, one_zpow]
83+
84+
-- We want to use `IsAddTorsion.zsmul_eq_zero_iff` earlier than `smul_eq_zero`.
85+
@[to_additive (attr := simp high)]
86+
lemma IsMulTorsionFree.zpow_eq_one_iff : a ^ n = 1 ↔ a = 1 ∨ n = 0 := by
87+
obtain rfl | hn := eq_or_ne n 0 <;> simp [zpow_eq_one_iff_left, *]
88+
89+
@[to_additive IsAddTorsionFree.zsmul_eq_zero_iff_left]
90+
lemma IsMulTorsionFree.zpow_eq_one_iff_right (ha : a ≠ 1) : a ^ n = 1 ↔ n = 0 := by simp [*]
91+
7292
@[to_additive] lemma self_eq_inv : a = a⁻¹ ↔ a = 1 := by rw [← sq_eq_one, sq, mul_eq_one_iff_eq_inv]
7393
@[to_additive] lemma inv_eq_self : a⁻¹ = a ↔ a = 1 := by rw [eq_comm, self_eq_inv]
7494
@[to_additive] lemma self_ne_inv : a ≠ a⁻¹ ↔ a ≠ 1 := self_eq_inv.ne

Mathlib/Algebra/GroupWithZero/Torsion.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ instance : IsMulTorsionFree M := by
3737
← associated_iff_normalizedFactors_eq_normalizedFactors hx hy] at this
3838
replace hx : IsLeftRegular (x ^ n) := (IsLeftCancelMulZero.mul_left_cancel_of_ne_zero hx).pow n
3939
rw [← hu, mul_pow, eq_comm, IsLeftRegular.mul_left_eq_self_iff hx, ← Units.val_pow_eq_pow_val,
40-
Units.val_eq_one, IsMulTorsionFree.pow_eq_one_iff hn] at hxy
40+
Units.val_eq_one, IsMulTorsionFree.pow_eq_one_iff_left hn] at hxy
4141
rwa [hxy, Units.val_one, mul_one] at hu
4242

4343
end UniqueFactorizationMonoid

Mathlib/Algebra/Ring/NonZeroDivisors.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ theorem IsLeftRegular.pow_injective [IsMulTorsionFree R]
2727
have main {n m} (h₁ : n ≤ m) (h₂ : r ^ n = r ^ m) : n = m := by
2828
obtain ⟨l, rfl⟩ := Nat.exists_eq_add_of_le h₁
2929
rw [pow_add, eq_comm, IsLeftRegular.mul_left_eq_self_iff (hx.pow n),
30-
IsMulTorsionFree.pow_eq_one_iff' hx'] at h₂
30+
IsMulTorsionFree.pow_eq_one_iff_right hx'] at h₂
3131
rw [h₂, Nat.add_zero]
3232
obtain h | h := Nat.le_or_le n m
3333
· exact main h hnm

0 commit comments

Comments
 (0)