Skip to content

Commit f86a8b6

Browse files
committed
refactor(Analysis/Lp): EuclideanSpace.single -> PiLp.single (leanprover-community#36685)
Resolving a TODO in the code. This also makes `PiLp.single` the simp-normal form, as opposite to `toLp _ (Pi.single _ _)` that was in the code.
1 parent cd71411 commit f86a8b6

4 files changed

Lines changed: 136 additions & 56 deletions

File tree

Mathlib/Analysis/CStarAlgebra/Matrix.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ lemma inner_toEuclideanCLM (A : Matrix n n ℝ) (x y : EuclideanSpace ℝ n) :
129129
toLin_apply, mulVec_eq_sum, OrthonormalBasis.coe_toBasis_repr_apply,
130130
EuclideanSpace.basisFun_repr, op_smul_eq_smul, Finset.sum_apply, Pi.smul_apply, transpose_apply,
131131
smul_eq_mul, OrthonormalBasis.coe_toBasis, EuclideanSpace.basisFun_apply, PiLp.inner_apply,
132-
ofLp_sum, ofLp_smul, EuclideanSpace.ofLp_single, RCLike.inner_apply, conj_trivial, dotProduct]
132+
ofLp_sum, ofLp_smul, PiLp.ofLp_single, RCLike.inner_apply, conj_trivial, dotProduct]
133133
congr with i
134134
rw [mul_comm (x.ofLp i)]
135135
simp [Pi.single_apply]

Mathlib/Analysis/InnerProductSpace/PiL2.lean

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -288,25 +288,26 @@ section DecEq
288288

289289
variable [DecidableEq ι]
290290

291-
-- TODO : This should be generalized to `PiLp`.
292291
/-- The vector given in Euclidean space by being `a : 𝕜` at coordinate `i : ι` and `0 : 𝕜` at
293292
all other coordinates. -/
294-
def EuclideanSpace.single (i : ι) (a : 𝕜) : EuclideanSpace 𝕜 ι :=
295-
toLp _ (Pi.single i a)
293+
abbrev EuclideanSpace.single (i : ι) (a : 𝕜) : EuclideanSpace 𝕜 ι := PiLp.single 2 i a
296294

297-
@[simp] lemma EuclideanSpace.ofLp_single (i : ι) (a : 𝕜) : ofLp (single i a) = Pi.single i a := rfl
295+
@[deprecated PiLp.ofLp_single (since := "2026-03-15")]
296+
lemma EuclideanSpace.ofLp_single (i : ι) (a : 𝕜) : ofLp (single i a) = Pi.single i a := by
297+
simp
298298

299-
@[simp]
300-
lemma EuclideanSpace.toLp_single (i : ι) (a : 𝕜) : toLp _ (Pi.single i a) = single i a := rfl
299+
@[deprecated PiLp.toLp_single (since := "2026-03-15")]
300+
lemma EuclideanSpace.toLp_single (i : ι) (a : 𝕜) : toLp _ (Pi.single i a) = single i a := by
301+
simp
301302

302-
@[simp]
303+
@[deprecated PiLp.single_apply (since := "2026-03-15")]
303304
theorem EuclideanSpace.single_apply (i : ι) (a : 𝕜) (j : ι) :
304305
(EuclideanSpace.single i a) j = ite (j = i) a 0 := by
305-
rw [EuclideanSpace.single, PiLp.toLp_apply, ← Pi.single_apply i a j]
306+
simp
306307

307-
@[simp]
308+
@[deprecated PiLp.single_eq_zero_iff (since := "2026-03-15")]
308309
theorem EuclideanSpace.single_eq_zero_iff {i : ι} {a : 𝕜} :
309-
EuclideanSpace.single i a = 0 ↔ a = 0 := (toLp_eq_zero 2).trans Pi.single_eq_zero_iff
310+
EuclideanSpace.single i a = 0 ↔ a = 0 := by simp
310311

311312
variable [Fintype ι]
312313

@@ -317,36 +318,34 @@ theorem EuclideanSpace.inner_single_left (i : ι) (a : 𝕜) (v : EuclideanSpace
317318
theorem EuclideanSpace.inner_single_right (i : ι) (a : 𝕜) (v : EuclideanSpace 𝕜 ι) :
318319
⟪v, EuclideanSpace.single i (a : 𝕜)⟫ = a * conj (v i) := by simp [PiLp.inner_apply]
319320

320-
@[simp]
321+
@[deprecated PiLp.norm_single (since := "2026-03-15")]
321322
theorem EuclideanSpace.norm_single (i : ι) (a : 𝕜) :
322-
‖EuclideanSpace.single i (a : 𝕜)‖ = ‖a‖ :=
323-
PiLp.norm_toLp_single 2 (fun _ => 𝕜) i a
323+
‖EuclideanSpace.single i (a : 𝕜)‖ = ‖a‖ := by simp
324324

325-
@[simp]
325+
@[deprecated PiLp.nnnorm_single (since := "2026-03-15")]
326326
theorem EuclideanSpace.nnnorm_single (i : ι) (a : 𝕜) :
327-
‖EuclideanSpace.single i (a : 𝕜)‖₊ = ‖a‖₊ :=
328-
PiLp.nnnorm_toLp_single 2 (fun _ => 𝕜) i a
327+
‖EuclideanSpace.single i (a : 𝕜)‖₊ = ‖a‖₊ := by simp
329328

330-
@[simp]
329+
@[deprecated PiLp.dist_single_same (since := "2026-03-15")]
331330
theorem EuclideanSpace.dist_single_same (i : ι) (a b : 𝕜) :
332-
dist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = dist a b :=
333-
PiLp.dist_toLp_single_same 2 (fun _ => 𝕜) i a b
331+
dist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = dist a b := by
332+
simp
334333

335-
@[simp]
334+
@[deprecated PiLp.nndist_single_same (since := "2026-03-15")]
336335
theorem EuclideanSpace.nndist_single_same (i : ι) (a b : 𝕜) :
337-
nndist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = nndist a b :=
338-
PiLp.nndist_toLp_single_same 2 (fun _ => 𝕜) i a b
336+
nndist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = nndist a b := by
337+
simp
339338

340-
@[simp]
339+
@[deprecated PiLp.edist_single_same (since := "2026-03-15")]
341340
theorem EuclideanSpace.edist_single_same (i : ι) (a b : 𝕜) :
342-
edist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = edist a b :=
343-
PiLp.edist_toLp_single_same 2 (fun _ => 𝕜) i a b
341+
edist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = edist a b := by
342+
simp
344343

345344
/-- `EuclideanSpace.single` forms an orthonormal family. -/
346345
theorem EuclideanSpace.orthonormal_single :
347346
Orthonormal 𝕜 fun i : ι => EuclideanSpace.single i (1 : 𝕜) := by
348347
simp_rw [orthonormal_iff_ite, EuclideanSpace.inner_single_left, map_one, one_mul,
349-
EuclideanSpace.single_apply]
348+
PiLp.single_apply]
350349
intros
351350
trivial
352351

@@ -411,7 +410,7 @@ instance instFunLike : FunLike (OrthonormalBasis ι 𝕜 E) ι E where
411410
rw [this, Pi.single_smul]
412411
replace h := congr_fun h i
413412
simp only [LinearEquiv.comp_coe, map_smul, LinearEquiv.coe_coe, LinearEquiv.trans_apply,
414-
coe_symm_linearEquiv, EuclideanSpace.toLp_single,
413+
coe_symm_linearEquiv, PiLp.toLp_single,
415414
LinearIsometryEquiv.coe_symm_toLinearEquiv] at h ⊢
416415
rw [h]
417416

@@ -445,7 +444,7 @@ protected theorem orthonormal (b : OrthonormalBasis ι 𝕜 E) : Orthonormal
445444
rw [orthonormal_iff_ite]
446445
intro i j
447446
rw [← b.repr.inner_map_map (b i) (b j), b.repr_self i, b.repr_self j,
448-
EuclideanSpace.inner_single_left, EuclideanSpace.single_apply, map_one, one_mul]
447+
EuclideanSpace.inner_single_left, PiLp.single_apply, map_one, one_mul]
449448

450449
@[simp]
451450
lemma norm_eq_one (b : OrthonormalBasis ι 𝕜 E) (i : ι) :
@@ -678,18 +677,18 @@ theorem _root_.Pi.orthonormalBasis_apply {η : Type*} [Fintype η] [DecidableEq
678677
[∀ i, Fintype (ι i)] {𝕜 : Type*} [RCLike 𝕜] {E : η → Type*} [∀ i, NormedAddCommGroup (E i)]
679678
[∀ i, InnerProductSpace 𝕜 (E i)] (B : ∀ i, OrthonormalBasis (ι i) 𝕜 (E i))
680679
(j : (i : η) × (ι i)) :
681-
Pi.orthonormalBasis B j = toLp _ (Pi.single _ (B j.fst j.snd)) := by
680+
Pi.orthonormalBasis B j = PiLp.single 2 j.fst (B j.fst j.snd) := by
682681
classical
683682
ext k
684683
obtain ⟨i, j⟩ := j
685684
simp only [Pi.orthonormalBasis, coe_ofRepr, LinearIsometryEquiv.symm_trans,
686685
LinearIsometryEquiv.symm_symm, LinearIsometryEquiv.piLpCongrRight_symm,
687686
LinearIsometryEquiv.trans_apply, LinearIsometryEquiv.piLpCongrRight_apply,
688-
LinearIsometryEquiv.piLpCurry_apply, EuclideanSpace.ofLp_single, PiLp.toLp_apply,
687+
LinearIsometryEquiv.piLpCurry_apply, PiLp.ofLp_single, PiLp.toLp_apply,
689688
Sigma.curry_single (γ := fun _ _ => 𝕜)]
690689
obtain rfl | hi := Decidable.eq_or_ne i k
691-
· simp only [Pi.single_eq_same, EuclideanSpace.toLp_single, OrthonormalBasis.repr_symm_single]
692-
· simp only [Pi.single_eq_of_ne' hi, toLp_zero, map_zero]
690+
· simp
691+
· simp [hi]
693692

694693
@[simp]
695694
theorem _root_.Pi.orthonormalBasis_repr {η : Type*} [Fintype η] {ι : η → Type*}
@@ -841,7 +840,7 @@ lemma equiv_apply_basis (i : ι) : b.equiv b' e (b i) = b' (e i) := by
841840
simp only [OrthonormalBasis.equiv, LinearIsometryEquiv.trans_apply, OrthonormalBasis.repr_self]
842841
refine DFunLike.congr rfl ?_
843842
ext j
844-
simp [Pi.single_apply, Equiv.symm_apply_eq]
843+
simp
845844

846845
@[simp]
847846
lemma equiv_self_rfl : b.equiv b (.refl ι) = .refl 𝕜 E := by

Mathlib/Analysis/Matrix/Spectrum.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,13 @@ theorem conjStarAlgAut_star_eigenvectorUnitary :
127127
diagonal (RCLike.ofReal ∘ hA.eigenvalues) := by
128128
apply Matrix.toEuclideanLin.injective <| (EuclideanSpace.basisFun n 𝕜).toBasis.ext fun i ↦ ?_
129129
simp only [conjStarAlgAut_star_apply, toLpLin_apply, OrthonormalBasis.coe_toBasis,
130-
EuclideanSpace.basisFun_apply, EuclideanSpace.ofLp_single, ← mulVec_mulVec,
130+
EuclideanSpace.basisFun_apply, PiLp.ofLp_single, ← mulVec_mulVec,
131131
eigenvectorUnitary_mulVec, ← mulVec_mulVec, mulVec_eigenvectorBasis,
132132
Matrix.diagonal_mulVec_single, mulVec_smul, star_eigenvectorUnitary_mulVec,
133-
RCLike.real_smul_eq_coe_smul (K := 𝕜), WithLp.toLp_smul, EuclideanSpace.toLp_single,
133+
RCLike.real_smul_eq_coe_smul (K := 𝕜), WithLp.toLp_smul, PiLp.toLp_single,
134134
Function.comp_apply, mul_one]
135135
apply PiLp.ext fun j ↦ ?_
136-
simp only [PiLp.smul_apply, EuclideanSpace.single_apply, smul_eq_mul, mul_ite, mul_one, mul_zero]
136+
simp only [PiLp.smul_apply, PiLp.single_apply, smul_eq_mul, mul_ite, mul_one, mul_zero]
137137

138138
@[deprecated (since := "2025-11-06")] alias star_mul_self_mul_eq_diagonal :=
139139
conjStarAlgAut_star_eigenvectorUnitary

Mathlib/Analysis/Normed/Lp/PiLp.lean

Lines changed: 100 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,67 @@ end
137137

138138
lemma toLp_apply (x : ∀ i, α i) (i : ι) : toLp p x i = x i := rfl
139139

140+
section Single
141+
variable [DecidableEq ι]
142+
variable {β}
143+
144+
section Zero
145+
variable [∀ i, Zero (β i)]
146+
147+
/-- The vector given in `PiLp` by being `a : β i` at coordinate `i : ι` and `0 : β j` at
148+
all other coordinates `j`. -/
149+
def single (i : ι) (a : β i) : PiLp p β := toLp p (Pi.single i a)
150+
151+
@[simp]
152+
lemma ofLp_single (i : ι) (a : β i) : ofLp (single p i a) = Pi.single i a := rfl
153+
154+
@[simp]
155+
lemma toLp_single (i : ι) (a : β i) : toLp p (Pi.single i a) = single p i a := rfl
156+
157+
@[simp]
158+
lemma single_eq_same (i : ι) (a : β i) : single p i a i = a := by
159+
rw [ofLp_single, Pi.single_eq_same]
160+
161+
@[simp]
162+
lemma single_eq_of_ne {i i' : ι} (h : i' ≠ i) (a : β i) : single p i a i' = 0 := by
163+
rw [ofLp_single, Pi.single_eq_of_ne h]
164+
165+
/-- Changing the hypothesis direction in `PiLp.single_eq_of_ne` for for ease of use by simp. -/
166+
@[simp]
167+
lemma single_eq_of_ne' {i i' : ι} (h : i ≠ i') (a : β i) : single p i a i' = 0 := by
168+
rw [ofLp_single, Pi.single_eq_of_ne' h]
169+
170+
end Zero
171+
172+
@[simp]
173+
lemma single_apply [Zero 𝕜] (i : ι) (a : 𝕜) (j : ι) :
174+
(single p i a : PiLp p (fun _ ↦ 𝕜)) j = ite (j = i) a 0 := by
175+
rw [← toLp_single, PiLp.toLp_apply, ← Pi.single_apply i a j]
176+
177+
section AddCommGroup
178+
variable [∀ i, AddCommGroup (β i)]
179+
180+
@[simp]
181+
theorem single_eq_zero_iff (p : ℝ≥0∞) (i : ι) {a : β i} :
182+
single p i a = 0 ↔ a = 0 :=
183+
(toLp_eq_zero p).trans Pi.single_eq_zero_iff
184+
185+
lemma single_add (p : ℝ≥0∞) (i : ι) {a b : β i} :
186+
single p i (a + b) = single p i a + single p i b := by
187+
simp_rw [← toLp_single, Pi.single_add, toLp_add]
188+
189+
lemma single_sub (p : ℝ≥0∞) (i : ι) {a b : β i} :
190+
single p i (a - b) = single p i a - single p i b := by
191+
simp_rw [← toLp_single, Pi.single_sub, toLp_sub]
192+
193+
lemma single_neg (p : ℝ≥0∞) (i : ι) {a : β i} :
194+
single p i (-a) = -single p i a := by
195+
simp_rw [← toLp_single, Pi.single_neg, toLp_neg]
196+
197+
end AddCommGroup
198+
199+
end Single
200+
140201
section DistNorm
141202

142203
variable [Fintype ι]
@@ -798,8 +859,7 @@ theorem _root_.LinearIsometryEquiv.piLpCongrLeft_symm (e : ι ≃ ι') :
798859
@[simp high]
799860
theorem _root_.LinearIsometryEquiv.piLpCongrLeft_single [DecidableEq ι] [DecidableEq ι']
800861
(e : ι ≃ ι') (i : ι) (v : E) :
801-
LinearIsometryEquiv.piLpCongrLeft p 𝕜 E e (toLp p <| Pi.single i v) =
802-
toLp p (Pi.single (e i) v) := by
862+
LinearIsometryEquiv.piLpCongrLeft p 𝕜 E e (single p i v) = single p (e i) v := by
803863
ext x
804864
simp [LinearIsometryEquiv.piLpCongrLeft_apply, Equiv.piCongrLeft',
805865
Pi.single, Function.update, Equiv.symm_apply_eq]
@@ -847,8 +907,7 @@ theorem _root_.LinearIsometryEquiv.piLpCongrRight_symm (e : ∀ i, α i ≃ₗ
847907
@[simp high]
848908
theorem _root_.LinearIsometryEquiv.piLpCongrRight_single (e : ∀ i, α i ≃ₗᵢ[𝕜] β i) [DecidableEq ι]
849909
(i : ι) (v : α i) :
850-
LinearIsometryEquiv.piLpCongrRight p e (toLp p <| Pi.single i v) =
851-
toLp p (Pi.single i (e _ v)) :=
910+
LinearIsometryEquiv.piLpCongrRight p e (single p i v) = single p i (e _ v) :=
852911
PiLp.ext <| Pi.apply_single (e ·) (fun _ => map_zero _) _ _
853912

854913
end piLpCongrRight
@@ -927,46 +986,68 @@ variable [DecidableEq ι]
927986

928987
set_option backward.isDefEq.respectTransparency false in
929988
@[simp]
930-
theorem nnnorm_toLp_single (i : ι) (b : β i) :
931-
‖toLp p (Pi.single i b)‖₊ = ‖b‖₊ := by
989+
theorem nnnorm_single (i : ι) (b : β i) : ‖single p i b‖₊ = ‖b‖₊ := by
932990
haveI : Nonempty ι := ⟨i⟩
933991
induction p generalizing hp with
934992
| top =>
935993
simp_rw [nnnorm_eq_ciSup]
936994
refine
937995
ciSup_eq_of_forall_le_of_forall_lt_exists_gt (fun j => ?_) fun n hn => ⟨i, hn.trans_eq ?_⟩
938996
· obtain rfl | hij := Decidable.eq_or_ne i j
939-
· rw [Pi.single_eq_same]
940-
· rw [Pi.single_eq_of_ne' hij, nnnorm_zero]
997+
· rw [single_eq_same]
998+
· rw [single_eq_of_ne' _ hij, nnnorm_zero]
941999
exact zero_le _
942-
· rw [Pi.single_eq_same]
1000+
· rw [single_eq_same]
9431001
| coe p =>
9441002
have hp0 : (p : ℝ) ≠ 0 :=
9451003
mod_cast (zero_lt_one.trans_le <| Fact.out (p := 1 ≤ (p : ℝ≥0∞))).ne'
9461004
rw [nnnorm_eq_sum ENNReal.coe_ne_top, ENNReal.coe_toReal, Fintype.sum_eq_single i,
947-
toLp_apply, Pi.single_eq_same, ← NNReal.rpow_mul, one_div,
1005+
toLp_apply, single_eq_same, ← NNReal.rpow_mul, one_div,
9481006
mul_inv_cancel₀ hp0, NNReal.rpow_one]
9491007
intro j hij
950-
rw [toLp_apply, Pi.single_eq_of_ne hij, nnnorm_zero, NNReal.zero_rpow hp0]
1008+
rw [toLp_apply, single_eq_of_ne _ hij, nnnorm_zero, NNReal.zero_rpow hp0]
1009+
1010+
@[deprecated nnnorm_single (since := "2026-03-15")]
1011+
theorem nnnorm_toLp_single (i : ι) (b : β i) : ‖toLp p (Pi.single i b)‖₊ = ‖b‖₊ :=
1012+
nnnorm_single p β i b
9511013

9521014
@[simp]
1015+
lemma norm_single (i : ι) (b : β i) : ‖single p i b‖ = ‖b‖ :=
1016+
congr_arg ((↑) : ℝ≥0 → ℝ) <| nnnorm_single p β i b
1017+
1018+
@[deprecated norm_single (since := "2026-03-15")]
9531019
lemma norm_toLp_single (i : ι) (b : β i) : ‖toLp p (Pi.single i b)‖ = ‖b‖ :=
954-
congr_arg ((↑) : ℝ≥0 → ℝ) <| nnnorm_toLp_single p β i b
1020+
norm_single p β i b
9551021

9561022
@[simp]
1023+
lemma nndist_single_same (i : ι) (b₁ b₂ : β i) :
1024+
nndist (single p i b₁) (single p i b₂) = nndist b₁ b₂ := by
1025+
rw [nndist_eq_nnnorm, nndist_eq_nnnorm, ← single_sub, nnnorm_single]
1026+
1027+
@[deprecated nndist_single_same (since := "2026-03-15")]
9571028
lemma nndist_toLp_single_same (i : ι) (b₁ b₂ : β i) :
958-
nndist (toLp p (Pi.single i b₁)) (toLp p (Pi.single i b₂)) = nndist b₁ b₂ := by
959-
rw [nndist_eq_nnnorm, nndist_eq_nnnorm, ← toLp_sub, ← Pi.single_sub, nnnorm_toLp_single]
1029+
nndist (toLp p (Pi.single i b₁)) (toLp p (Pi.single i b₂)) = nndist b₁ b₂ :=
1030+
nndist_single_same p β i b₁ b₂
9601031

9611032
@[simp]
1033+
lemma dist_single_same (i : ι) (b₁ b₂ : β i) :
1034+
dist (single p i b₁) (single p i b₂) = dist b₁ b₂ :=
1035+
congr_arg ((↑) : ℝ≥0 → ℝ) <| nndist_single_same p β i b₁ b₂
1036+
1037+
@[deprecated dist_single_same (since := "2026-03-15")]
9621038
lemma dist_toLp_single_same (i : ι) (b₁ b₂ : β i) :
9631039
dist (toLp p (Pi.single i b₁)) (toLp p (Pi.single i b₂)) = dist b₁ b₂ :=
964-
congr_arg ((↑) : ℝ≥0 → ℝ) <| nndist_toLp_single_same p β i b₁ b₂
1040+
dist_single_same p β i b₁ b₂
9651041

9661042
@[simp]
1043+
lemma edist_single_same (i : ι) (b₁ b₂ : β i) :
1044+
edist (single p i b₁) (single p i b₂) = edist b₁ b₂ := by
1045+
simp only [edist_nndist, nndist_single_same p β i b₁ b₂]
1046+
1047+
@[deprecated edist_single_same (since := "2026-03-15")]
9671048
lemma edist_toLp_single_same (i : ι) (b₁ b₂ : β i) :
968-
edist (toLp p (Pi.single i b₁)) (toLp p (Pi.single i b₂)) = edist b₁ b₂ := by
969-
simp only [edist_nndist, nndist_toLp_single_same p β i b₁ b₂]
1049+
edist (toLp p (Pi.single i b₁)) (toLp p (Pi.single i b₂)) = edist b₁ b₂ :=
1050+
edist_single_same p β i b₁ b₂
9701051

9711052
end Single
9721053

@@ -1061,8 +1142,8 @@ def basisFun : Basis ι 𝕜 (PiLp p fun _ : ι => 𝕜) :=
10611142

10621143
@[simp]
10631144
theorem basisFun_apply [DecidableEq ι] (i) :
1064-
basisFun p 𝕜 ι i = toLp p (Pi.single i 1) := by
1065-
simp_rw [basisFun, Basis.coe_ofEquivFun, WithLp.coe_symm_linearEquiv]
1145+
basisFun p 𝕜 ι i = single p i 1 := by
1146+
simp_rw [basisFun, Basis.coe_ofEquivFun, WithLp.coe_symm_linearEquiv, toLp_single]
10661147

10671148
@[simp]
10681149
theorem basisFun_repr (x : PiLp p fun _ : ι => 𝕜) (i : ι) : (basisFun p 𝕜 ι).repr x i = x i :=

0 commit comments

Comments
 (0)