Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit a008b33

Browse files
feat(data/finsupp/to_dfinsupp): add sigma_finsupp_lequiv_dfinsupp (#7818)
Equivalences between `(Σ i, η i) →₀ N` and `Π₀ i, (η i →₀ N)`. - [x] depends on: #7819 Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
1 parent 64d453e commit a008b33

File tree

1 file changed

+94
-6
lines changed

1 file changed

+94
-6
lines changed

src/data/finsupp/to_dfinsupp.lean

Lines changed: 94 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,17 @@ It is in its own file since neither `finsupp` or `dfinsupp` depend on each other
1515
1616
## Main definitions
1717
18-
* `finsupp.to_dfinsupp : (ι →₀ M) → (Π₀ i : ι, M)`
19-
* `dfinsupp.to_finsupp : (Π₀ i : ι, M) → (ι →₀ M)`
20-
* Bundled equiv versions of the above:
21-
* `finsupp_equiv_dfinsupp : (ι →₀ M) ≃ (Π₀ i : ι, M)`
22-
* `finsupp_add_equiv_dfinsupp : (ι →₀ M) ≃+ (Π₀ i : ι, M)`
23-
* `finsupp_lequiv_dfinsupp R : (ι →₀ M) ≃ₗ[R] (Π₀ i : ι, M)`
18+
* "identity" maps between `finsupp` and `dfinsupp`:
19+
* `finsupp.to_dfinsupp : (ι →₀ M) → (Π₀ i : ι, M)`
20+
* `dfinsupp.to_finsupp : (Π₀ i : ι, M) → (ι →₀ M)`
21+
* Bundled equiv versions of the above:
22+
* `finsupp_equiv_dfinsupp : (ι →₀ M) ≃ (Π₀ i : ι, M)`
23+
* `finsupp_add_equiv_dfinsupp : (ι →₀ M) ≃+ (Π₀ i : ι, M)`
24+
* `finsupp_lequiv_dfinsupp R : (ι →₀ M) ≃ₗ[R] (Π₀ i : ι, M)`
25+
* stronger versions of `finsupp.split`:
26+
* `sigma_finsupp_equiv_dfinsupp : ((Σ i, η i) →₀ N) ≃ (Π₀ i, (η i →₀ N))`
27+
* `sigma_finsupp_add_equiv_dfinsupp : ((Σ i, η i) →₀ N) ≃+ (Π₀ i, (η i →₀ N))`
28+
* `sigma_finsupp_lequiv_dfinsupp : ((Σ i, η i) →₀ N) ≃ₗ[R] (Π₀ i, (η i →₀ N))`
2429
2530
## Theorems
2631
@@ -187,4 +192,87 @@ noncomputable def finsupp_lequiv_dfinsupp
187192
map_add' := finsupp.to_dfinsupp_add,
188193
.. finsupp_equiv_dfinsupp}
189194

195+
section sigma
196+
/-- ### Stronger versions of `finsupp.split` -/
197+
198+
noncomputable theory
199+
open_locale classical
200+
201+
variables {η : ι → Type*} {N : Type*} [semiring R]
202+
203+
open finsupp
204+
205+
/-- `finsupp.split` is an equivalence between `(Σ i, η i) →₀ N` and `Π₀ i, (η i →₀ N)`. -/
206+
def sigma_finsupp_equiv_dfinsupp [has_zero N] : ((Σ i, η i) →₀ N) ≃ (Π₀ i, (η i →₀ N)) :=
207+
{ to_fun := λ f, ⟦⟨split f, (split_support f : finset ι).val, λ i,
208+
begin
209+
rw [← finset.mem_def, mem_split_support_iff_nonzero],
210+
exact (decidable.em _).symm
211+
end⟩⟧,
212+
inv_fun := λ f,
213+
begin
214+
refine on_finset (finset.sigma f.support (λ j, (f j).support)) (λ ji, f ji.1 ji.2)
215+
(λ g hg, finset.mem_sigma.mpr ⟨_, mem_support_iff.mpr hg⟩),
216+
simp only [ne.def, dfinsupp.mem_support_to_fun],
217+
intro h,
218+
rw h at hg,
219+
simpa using hg
220+
end,
221+
left_inv := λ f, by { ext, simp [split] },
222+
right_inv := λ f, by { ext, simp [split] } }
223+
224+
@[simp]
225+
lemma sigma_finsupp_equiv_dfinsupp_apply [has_zero N] (f : (Σ i, η i) →₀ N) :
226+
(sigma_finsupp_equiv_dfinsupp f : Π i, (η i →₀ N)) = finsupp.split f := rfl
227+
228+
@[simp]
229+
lemma sigma_finsupp_equiv_dfinsupp_symm_apply [has_zero N] (f : Π₀ i, (η i →₀ N)) (s : Σ i, η i) :
230+
(sigma_finsupp_equiv_dfinsupp.symm f : (Σ i, η i) →₀ N) s = f s.1 s.2 := rfl
231+
232+
@[simp]
233+
lemma sigma_finsupp_equiv_dfinsupp_support [has_zero N] (f : (Σ i, η i) →₀ N) :
234+
(sigma_finsupp_equiv_dfinsupp f).support = finsupp.split_support f :=
235+
begin
236+
ext,
237+
rw dfinsupp.mem_support_to_fun,
238+
exact (finsupp.mem_split_support_iff_nonzero _ _).symm,
239+
end
240+
241+
-- Without this Lean fails to find the `add_zero_class` instance on `Π₀ i, (η i →₀ N)`.
242+
local attribute [-instance] finsupp.has_zero
243+
244+
@[simp]
245+
lemma sigma_finsupp_equiv_dfinsupp_add [add_zero_class N] (f g : (Σ i, η i) →₀ N) :
246+
sigma_finsupp_equiv_dfinsupp (f + g) =
247+
(sigma_finsupp_equiv_dfinsupp f + (sigma_finsupp_equiv_dfinsupp g) : (Π₀ (i : ι), η i →₀ N)) :=
248+
by {ext, refl}
249+
250+
/-- `finsupp.split` is an additive equivalence between `(Σ i, η i) →₀ N` and `Π₀ i, (η i →₀ N)`. -/
251+
@[simps]
252+
def sigma_finsupp_add_equiv_dfinsupp [add_zero_class N] : ((Σ i, η i) →₀ N) ≃+ (Π₀ i, (η i →₀ N)) :=
253+
{ to_fun := sigma_finsupp_equiv_dfinsupp,
254+
inv_fun := sigma_finsupp_equiv_dfinsupp.symm,
255+
map_add' := sigma_finsupp_equiv_dfinsupp_add,
256+
.. sigma_finsupp_equiv_dfinsupp }
257+
258+
local attribute [-instance] finsupp.add_zero_class
259+
260+
--tofix: r • (sigma_finsupp_equiv_dfinsupp f) doesn't work.
261+
@[simp]
262+
lemma sigma_finsupp_equiv_dfinsupp_smul {R} [monoid R] [add_monoid N] [distrib_mul_action R N]
263+
(r : R) (f : (Σ i, η i) →₀ N) : sigma_finsupp_equiv_dfinsupp (r • f) =
264+
@has_scalar.smul R (Π₀ i, η i →₀ N) mul_action.to_has_scalar r (sigma_finsupp_equiv_dfinsupp f) :=
265+
by { ext, refl }
266+
267+
local attribute [-instance] finsupp.add_monoid
268+
269+
/-- `finsupp.split` is a linear equivalence between `(Σ i, η i) →₀ N` and `Π₀ i, (η i →₀ N)`. -/
270+
@[simps]
271+
def sigma_finsupp_lequiv_dfinsupp [add_comm_monoid N] [module R N] :
272+
((Σ i, η i) →₀ N) ≃ₗ[R] (Π₀ i, (η i →₀ N)) :=
273+
{ map_smul' := sigma_finsupp_equiv_dfinsupp_smul,
274+
.. sigma_finsupp_add_equiv_dfinsupp }
275+
276+
end sigma
277+
190278
end equivs

0 commit comments

Comments
 (0)