Skip to content

Commit aefd553

Browse files
committed
refactor(Data/Finsupp): use single in uniqueEquiv (#37755)
In essence, this changes `(Finsupp.uniqueEquiv i).symm m` from having support `univ.filter (fun _ ↦ m ≠ 0)` to having support `if m = 0 then {i} else ∅`. These are equal, but having the RHS be `single 1 r` is much more useful in practice. Similarly for `MonoidAlgebra`. To avoid simp getting stuck after rewriting with `uniqueEquiv_symm_apply`, add `uniqueEquiv_symm_apply_apply` and tag it with `simp↓ high`. Also rename `Equiv.finsuppUnique` to `Finsupp.uniqueEquiv` and change the `Unique ι` argument into `Subsingleton ι` and `i : ι`. Similarly for `AddEquiv` and `LinearEquiv`.
1 parent 06f1f22 commit aefd553

18 files changed

Lines changed: 110 additions & 70 deletions

File tree

Mathlib/Algebra/FreeAlgebra/Cardinality.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ theorem cardinalMk_eq_max_lift [Nonempty X] [Nontrivial R] :
3636

3737
@[simp]
3838
theorem cardinalMk_eq_lift [IsEmpty X] : #(FreeAlgebra R X) = Cardinal.lift.{v} #R := by
39-
have := lift_mk_eq'.2show (FreeMonoid X →₀ R) ≃ R from Equiv.finsuppUnique
39+
have := lift_mk_eq'.2show (FreeMonoid X →₀ R) ≃ R from Finsupp.uniqueEquiv 1
4040
rw [lift_id'.{u, v}, lift_umax] at this
4141
rwa [equivMonoidAlgebraFreeMonoid.toEquiv.cardinal_eq, MonoidAlgebra]
4242

Mathlib/Algebra/Group/Finsupp.lean

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,19 @@ noncomputable def addEquivFunOnFinite {ι : Type*} [Finite ι] :
7777

7878
/-- If `M` is the trivial monoid, then the monoid of finitely supported functions `ι →₀ M` is
7979
is isomorphic to `M`. -/
80-
@[simps!]
80+
@[simps! apply symm_apply]
81+
noncomputable def uniqueAddEquiv (i : ι) [Subsingleton ι] : (ι →₀ M) ≃+ M where
82+
toEquiv := uniqueEquiv i
83+
map_add' _ _ := rfl
84+
85+
-- We want this lemma to fire before `uniqueAddEquiv_symm_apply`.
86+
@[simp↓ high] lemma uniqueAddEquiv_symm_apply_apply (i : ι) [Subsingleton ι] (m : M) (j : ι) :
87+
(uniqueAddEquiv i).symm m j = m := by simp [Subsingleton.elim j i]
88+
89+
set_option linter.deprecated false in
90+
/-- If `M` is the trivial monoid, then the monoid of finitely supported functions `ι →₀ M` is
91+
is isomorphic to `M`. -/
92+
@[simps!, deprecated uniqueAddEquiv (since := "2026-05-06")]
8193
noncomputable def _root_.AddEquiv.finsuppUnique {ι : Type*} [Unique ι] : (ι →₀ M) ≃+ M where
8294
toEquiv := .finsuppUnique
8395
map_add' _ _ := rfl
@@ -161,6 +173,8 @@ lemma support_single_add_single_subset [DecidableEq ι] {f₁ f₂ : ι} {g₁ g
161173
refine subset_trans Finsupp.support_add <| union_subset_iff.mpr ⟨?_, ?_⟩ <;>
162174
exact subset_trans Finsupp.support_single_subset (by simp)
163175

176+
set_option linter.deprecated false in
177+
@[deprecated uniqueAddEquiv_symm_apply (since := "2026-05-06")]
164178
lemma _root_.AddEquiv.finsuppUnique_symm {M : Type*} [AddZeroClass M] (d : M) :
165179
AddEquiv.finsuppUnique.symm d = single () d := by ext; simp [AddEquiv.finsuppUnique]
166180

Mathlib/Algebra/MonoidAlgebra/Defs.lean

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -634,12 +634,24 @@ instance isLocalHom_singleOneRingHom : IsLocalHom (singleOneRingHom (R := R) (M
634634
set_option backward.isDefEq.respectTransparency false in
635635
variable (M) in
636636
/-- The trivial monoid algebra is the base ring. -/
637-
@[to_additive (dont_translate := R) (attr := simps! apply symm_apply)
637+
@[to_additive (dont_translate := R) (attr := simps! apply)
638638
/-- The trivial additive monoid algebra is the base ring. -/]
639-
def uniqueRingEquiv [Unique M] : R[M] ≃+* R where
640-
toAddEquiv := .finsuppUnique
641-
map_mul' x y :=
642-
(mul_apply ..).trans <| by simp [Finsupp.sum_unique, Unique.eq_default, MonoidAlgebra]
639+
def uniqueRingEquiv [Subsingleton M] : R[M] ≃+* R where
640+
toAddEquiv := Finsupp.uniqueAddEquiv 1
641+
map_mul' x y := by
642+
let : Unique M := ⟨⟨1⟩, fun _ ↦ Subsingleton.elim _ _⟩
643+
refine (mul_apply ..).trans ?_
644+
simp [Finsupp.sum_unique, Unique.eq_default, MonoidAlgebra]
645+
646+
variable (M) in
647+
@[to_additive (dont_translate := R) (attr := simp)]
648+
lemma uniqueRingEquiv_symm_apply [Subsingleton M] (r : R) :
649+
(uniqueRingEquiv M).symm r = single 1 r := rfl
650+
651+
-- We want this lemma to fire before `uniqueRingEquiv_symm_apply`.
652+
@[to_additive (dont_translate := R) (attr := simp↓ high)]
653+
lemma uniqueRingEquiv_symm_apply_apply [Subsingleton M] (r : R) (m : M) :
654+
(uniqueRingEquiv M).symm r m = r := by simp [Subsingleton.elim m 1]
643655

644656
/-- A product monoid algebra is a nested monoid algebra. -/
645657
@[to_additive (dont_translate := R)

Mathlib/Data/Finsupp/Defs.lean

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -213,13 +213,6 @@ theorem equivFunOnFinite_symm_coe {α} [Finite α] (f : α →₀ M) : equivFunO
213213
@[simp]
214214
lemma coe_equivFunOnFinite_symm {α} [Finite α] (f : α → M) : ⇑(equivFunOnFinite.symm f) = f := rfl
215215

216-
/--
217-
If `α` has a unique term, the type of finitely supported functions `α →₀ β` is equivalent to `β`.
218-
-/
219-
@[simps!]
220-
noncomputable def _root_.Equiv.finsuppUnique {ι : Type*} [Unique ι] : (ι →₀ M) ≃ M :=
221-
Finsupp.equivFunOnFinite.trans (Equiv.funUnique ι M)
222-
223216
@[ext]
224217
theorem unique_ext [Unique α] {f g : α →₀ M} (h : f default = g default) : f = g :=
225218
ext fun a => by rwa [Unique.eq_default a]

Mathlib/Data/Finsupp/Single.lean

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,26 @@ theorem card_support_le_one' [Nonempty α] {f : α →₀ M} :
240240
#f.support ≤ 1 ↔ ∃ a b, f = single a b := by
241241
simp only [card_le_one_iff_subset_singleton, support_subset_singleton']
242242

243+
/-- If `α` has a unique term, then finitely supported functions `α →₀ M` are in bijection with `M`.
244+
-/
245+
@[simps]
246+
noncomputable def uniqueEquiv (a : α) [Subsingleton α] : (α →₀ M) ≃ M where
247+
toFun f := f a
248+
invFun := single a
249+
left_inv f := by ext b; simp [Subsingleton.elim b a]
250+
right_inv x := by simp
251+
252+
-- We want this lemma to fire before `uniqueEquiv_symm_apply`.
253+
@[simp↓ high] lemma uniqueEquiv_symm_apply_apply (a : α) [Subsingleton α] (m : M) (b : α) :
254+
(uniqueEquiv a).symm m b = m := by simp [Subsingleton.elim b a]
255+
256+
/--
257+
If `α` has a unique term, the type of finitely supported functions `α →₀ β` is equivalent to `β`.
258+
-/
259+
@[simps!, deprecated uniqueEquiv (since := "2026-05-06")]
260+
noncomputable def _root_.Equiv.finsuppUnique {ι : Type*} [Unique ι] : (ι →₀ M) ≃ M :=
261+
Finsupp.equivFunOnFinite.trans (Equiv.funUnique ι M)
262+
243263
@[simp]
244264
theorem equivFunOnFinite_single [DecidableEq α] [Finite α] (x : α) (m : M) :
245265
Finsupp.equivFunOnFinite (Finsupp.single x m) = Pi.single x m := by

Mathlib/LinearAlgebra/Dimension/FreeAndStrongRankCondition.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ theorem eq_bot_of_rank_le_one (h : Module.rank F S ≤ 1) [Module.Free F S] : S
247247
rw [← b.mk_eq_rank'', eq_one_iff_unique, ← unique_iff_subsingleton_and_nonempty] at h1
248248
obtain ⟨h1⟩ := h1
249249
obtain ⟨y, hy⟩ := (bijective_algebraMap_of_linearEquiv (b.repr ≪≫ₗ
250-
Finsupp.LinearEquiv.finsuppUnique _ _ _).symm).surjective ⟨x, hx⟩
250+
Finsupp.uniqueLinearEquiv _ _ default).symm).surjective ⟨x, hx⟩
251251
exact ⟨y, congr(Subtype.val $(hy))⟩
252252
haveI := mk_eq_zero_iff.1 (b.mk_eq_rank''.symm ▸ Cardinal.lt_one_iff.1 (h.lt_of_ne h1))
253253
haveI := b.repr.toEquiv.subsingleton

Mathlib/LinearAlgebra/FiniteDimensional/Basic.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,9 @@ noncomputable def basisSingleton (ι : Type*) [Unique ι] (h : finrank K V = 1)
129129
map_smul' := by simp [mul_div]
130130
left_inv := fun w => by
131131
apply_fun b.repr using b.repr.toEquiv.injective
132-
apply_fun Equiv.finsuppUnique
132+
apply_fun Finsupp.uniqueEquiv default
133133
simp only [map_smulₛₗ, Finsupp.coe_smul, Finsupp.single_eq_same,
134-
smul_eq_mul, Pi.smul_apply, Equiv.finsuppUnique_apply]
134+
smul_eq_mul, Pi.smul_apply, Finsupp.uniqueEquiv_apply]
135135
exact div_mul_cancel₀ _ h
136136
right_inv := fun f => by
137137
ext

Mathlib/LinearAlgebra/Finsupp/Pi.lean

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,35 +31,46 @@ open Set LinearMap Submodule
3131

3232
namespace Finsupp
3333

34-
section LinearEquiv.finsuppUnique
34+
section uniqueLinearEquiv
3535

36-
variable (R : Type*) {S : Type*} (M : Type*)
36+
variable (R : Type*) {S α : Type*} (M : Type*)
3737
variable [AddCommMonoid M] [Semiring R] [Module R M]
38-
variable (α : Type*) [Unique α]
3938

4039
/-- If `α` has a unique term, then the type of finitely supported functions `α →₀ M` is
4140
`R`-linearly equivalent to `M`. -/
42-
noncomputable def LinearEquiv.finsuppUnique : (α →₀ M) ≃ₗ[R] M :=
41+
@[simps! apply symm_apply]
42+
noncomputable def uniqueLinearEquiv [Subsingleton α] (a : α) : (α →₀ M) ≃ₗ[R] M where
43+
toAddEquiv := uniqueAddEquiv a
44+
map_smul' _ _ := rfl
45+
46+
-- We want this lemma to fire before `uniqueRingEquiv_symm_apply`.
47+
@[simp↓ high] lemma uniqueLinearEquiv_symm_apply_apply (a : α) [Subsingleton α] (m : M) (b : α) :
48+
(uniqueLinearEquiv R M a).symm m b = m := by simp [Subsingleton.elim b a]
49+
50+
/-- If `α` has a unique term, then the type of finitely supported functions `α →₀ M` is
51+
`R`-linearly equivalent to `M`. -/
52+
@[deprecated uniqueLinearEquiv (since := "2026-05-06")]
53+
noncomputable def LinearEquiv.finsuppUnique (α : Type*) [Unique α] : (α →₀ M) ≃ₗ[R] M :=
4354
{ Finsupp.equivFunOnFinite.trans (Equiv.funUnique α M) with
4455
map_add' := fun _ _ => rfl
4556
map_smul' := fun _ _ => rfl }
4657

4758
variable {R M}
4859

49-
@[simp]
50-
theorem LinearEquiv.finsuppUnique_apply (f : α →₀ M) :
60+
set_option linter.deprecated false in
61+
@[deprecated uniqueLinearEquiv_apply (since := "2026-05-06")]
62+
theorem LinearEquiv.finsuppUnique_apply (α : Type*) [Unique α] (f : α →₀ M) :
5163
LinearEquiv.finsuppUnique R M α f = f default :=
5264
rfl
5365

54-
variable {α}
55-
56-
@[simp]
57-
theorem LinearEquiv.finsuppUnique_symm_apply (m : M) :
66+
set_option linter.deprecated false in
67+
@[deprecated uniqueLinearEquiv_symm_apply (since := "2026-05-06")]
68+
theorem LinearEquiv.finsuppUnique_symm_apply (α : Type*) [Unique α] (m : M) :
5869
(LinearEquiv.finsuppUnique R M α).symm m = Finsupp.single default m := by
5970
ext; simp [LinearEquiv.finsuppUnique, Equiv.funUnique, single, Pi.single,
6071
equivFunOnFinite, Function.update]
6172

62-
end LinearEquiv.finsuppUnique
73+
end uniqueLinearEquiv
6374

6475
variable {α : Type*} {M : Type*} {N : Type*} {P : Type*} {R : Type*} {S : Type*}
6576
variable [Semiring R] [Semiring S] [AddCommMonoid M] [Module R M]

Mathlib/RepresentationTheory/Action.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ variable (k G) in
8181
@[simps toLinearMap]
8282
def ε : (trivial k G k).IntertwiningMap (linearize k G (MonoidalCategoryStruct.tensorUnit
8383
(Action (Type w) G))) where
84-
__ := Finsupp.LinearEquiv.finsuppUnique k k PUnit |>.symm.toLinearMap
84+
__ := Finsupp.uniqueLinearEquiv k k PUnit.unit |>.symm.toLinearMap
8585
isIntertwining' g := by ext1; simp [linearize_single _]
8686

8787
lemma ε_one : ε k G 1 = Finsupp.single PUnit.unit 1 := by
@@ -93,7 +93,7 @@ variable (k G) in
9393
/-- The unit of the linearize functor. -/
9494
@[simps toLinearMap]
9595
def η : (linearize k G (𝟙_ (Action (Type u) G))).IntertwiningMap (trivial k G k) where
96-
__ := (Finsupp.LinearEquiv.finsuppUnique k k PUnit).toLinearMap
96+
__ := (Finsupp.uniqueLinearEquiv k k PUnit.unit).toLinearMap
9797
isIntertwining' g := by ext; simp [linearize_single _]
9898

9999
lemma η_single (x : PUnit) : η k G (Finsupp.single x 1) = 1 := by

Mathlib/RepresentationTheory/Equiv.lean

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ variable (k G) in
3434
/-- If there exists `G`-action on a trivial monoid `H` then the induced representation
3535
on `k[H]` is equivalent to the trivial representation. -/
3636
def ofMulActionSubsingletonEquivTrivial : (ofMulAction k G H).Equiv (trivial k G k) :=
37-
letI : Unique H := uniqueOfSubsingleton 1
38-
.mk (Finsupp.LinearEquiv.finsuppUnique _ _ _) fun g ↦ by
37+
.mk (Finsupp.uniqueLinearEquiv _ _ 1) fun g ↦ by
3938
ext a; simp [Subsingleton.elim (g • a) a]
4039

4140
@[simp]
@@ -45,9 +44,7 @@ lemma ofMulActionSubsingletonEquivTrivial_apply (f : H →₀ k) :
4544
@[simp]
4645
lemma ofMulActionSubsingletonEquivTrivial_symm_apply (r : k) :
4746
(ofMulActionSubsingletonEquivTrivial k G H).symm.toIntertwiningMap.toLinearMap r =
48-
Finsupp.single 1 r := by
49-
letI : Unique H := uniqueOfSubsingleton 1
50-
simp [ofMulActionSubsingletonEquivTrivial, Subsingleton.elim (1 : H) (default : H)]
47+
Finsupp.single 1 r := rfl
5148

5249
variable (k G) in
5350
/-- The equivalence of representations between `(Fin 1 → G) →₀ k` and `G →₀ k`. -/

0 commit comments

Comments
 (0)