@@ -15,12 +15,17 @@ It is in its own file since neither `finsupp` or `dfinsupp` depend on each other
15
15
16
16
## Main definitions
17
17
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))`
24
29
25
30
## Theorems
26
31
@@ -187,4 +192,87 @@ noncomputable def finsupp_lequiv_dfinsupp
187
192
map_add' := finsupp.to_dfinsupp_add,
188
193
.. finsupp_equiv_dfinsupp}
189
194
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
+
190
278
end equivs
0 commit comments