analysis.inner_product_space.pi_L2
⟷
Mathlib.Analysis.InnerProductSpace.PiL2
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -92,7 +92,7 @@ instance PiLp.innerProductSpace {ι : Type _} [Fintype ι] (f : ι → Type _)
conj_symm := by
intro x y
unfold inner
- rw [RingHom.map_sum]
+ rw [map_sum]
apply Finset.sum_congr rfl
rintro z -
apply inner_conj_symm
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -57,7 +57,7 @@ For consequences in infinite dimension (Hilbert bases, etc.), see the file
-/
-open Real Set Filter IsROrC Submodule Function
+open Real Set Filter RCLike Submodule Function
open scoped BigOperators uniformity Topology NNReal ENNReal ComplexConjugate DirectSum
@@ -65,7 +65,7 @@ noncomputable section
variable {ι : Type _} {ι' : Type _}
-variable {𝕜 : Type _} [IsROrC 𝕜]
+variable {𝕜 : Type _} [RCLike 𝕜]
variable {E : Type _} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E]
@@ -117,41 +117,41 @@ theorem PiLp.inner_apply {ι : Type _} [Fintype ι] {f : ι → Type _} [∀ i,
/-- The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
space use `euclidean_space 𝕜 (fin n)`. -/
@[reducible, nolint unused_arguments]
-def EuclideanSpace (𝕜 : Type _) [IsROrC 𝕜] (n : Type _) [Fintype n] : Type _ :=
+def EuclideanSpace (𝕜 : Type _) [RCLike 𝕜] (n : Type _) [Fintype n] : Type _ :=
PiLp 2 fun i : n => 𝕜
#align euclidean_space EuclideanSpace
-/
#print EuclideanSpace.nnnorm_eq /-
-theorem EuclideanSpace.nnnorm_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
+theorem EuclideanSpace.nnnorm_eq {𝕜 : Type _} [RCLike 𝕜] {n : Type _} [Fintype n]
(x : EuclideanSpace 𝕜 n) : ‖x‖₊ = NNReal.sqrt (∑ i, ‖x i‖₊ ^ 2) :=
PiLp.nnnorm_eq_of_L2 x
#align euclidean_space.nnnorm_eq EuclideanSpace.nnnorm_eq
-/
#print EuclideanSpace.norm_eq /-
-theorem EuclideanSpace.norm_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
+theorem EuclideanSpace.norm_eq {𝕜 : Type _} [RCLike 𝕜] {n : Type _} [Fintype n]
(x : EuclideanSpace 𝕜 n) : ‖x‖ = Real.sqrt (∑ i, ‖x i‖ ^ 2) := by
simpa only [Real.coe_sqrt, NNReal.coe_sum] using congr_arg (coe : ℝ≥0 → ℝ) x.nnnorm_eq
#align euclidean_space.norm_eq EuclideanSpace.norm_eq
-/
#print EuclideanSpace.dist_eq /-
-theorem EuclideanSpace.dist_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
+theorem EuclideanSpace.dist_eq {𝕜 : Type _} [RCLike 𝕜] {n : Type _} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : dist x y = (∑ i, dist (x i) (y i) ^ 2).sqrt :=
(PiLp.dist_eq_of_L2 x y : _)
#align euclidean_space.dist_eq EuclideanSpace.dist_eq
-/
#print EuclideanSpace.nndist_eq /-
-theorem EuclideanSpace.nndist_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
+theorem EuclideanSpace.nndist_eq {𝕜 : Type _} [RCLike 𝕜] {n : Type _} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : nndist x y = (∑ i, nndist (x i) (y i) ^ 2).sqrt :=
(PiLp.nndist_eq_of_L2 x y : _)
#align euclidean_space.nndist_eq EuclideanSpace.nndist_eq
-/
#print EuclideanSpace.edist_eq /-
-theorem EuclideanSpace.edist_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
+theorem EuclideanSpace.edist_eq {𝕜 : Type _} [RCLike 𝕜] {n : Type _} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : edist x y = (∑ i, edist (x i) (y i) ^ 2) ^ (1 / 2 : ℝ) :=
(PiLp.edist_eq_of_L2 x y : _)
#align euclidean_space.edist_eq EuclideanSpace.edist_eq
@@ -501,7 +501,7 @@ protected theorem sum_inner_mul_inner (b : OrthonormalBasis ι 𝕜 E) (x y : E)
rw [map_sum] at this
convert this
ext i
- rw [SMulHomClass.map_smul, b.repr_apply_apply, mul_comm]
+ rw [MulActionSemiHomClass.map_smul, b.repr_apply_apply, mul_comm]
rfl
#align orthonormal_basis.sum_inner_mul_inner OrthonormalBasis.sum_inner_mul_inner
-/
@@ -809,7 +809,7 @@ unit length. -/
theorem OrthonormalBasis.det_to_matrix_orthonormalBasis : ‖a.toBasis.det b‖ = 1 :=
by
have : (norm_sq (a.to_basis.det b) : 𝕜) = 1 := by
- simpa [IsROrC.mul_conj] using
+ simpa [RCLike.mul_conj] using
(Matrix.det_of_mem_unitary (a.to_matrix_orthonormal_basis_mem_unitary b)).2
norm_cast at this
rwa [← sqrt_norm_sq_eq_norm, sqrt_eq_one]
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -498,7 +498,7 @@ protected theorem sum_inner_mul_inner (b : OrthonormalBasis ι 𝕜 E) (x y : E)
∑ i, ⟪x, b i⟫ * ⟪b i, y⟫ = ⟪x, y⟫ :=
by
have := congr_arg (innerSL 𝕜 x) (b.sum_repr y)
- rw [map_sum] at this
+ rw [map_sum] at this
convert this
ext i
rw [SMulHomClass.map_smul, b.repr_apply_apply, mul_comm]
@@ -654,7 +654,7 @@ protected def mkOfOrthogonalEqBot (hon : Orthonormal 𝕜 v) (hsp : (span 𝕜 (
haveI : FiniteDimensional 𝕜 (span 𝕜 (range v)) :=
FiniteDimensional.span_of_finite 𝕜 (finite_range v)
haveI : CompleteSpace (span 𝕜 (range v)) := FiniteDimensional.complete 𝕜 _
- rwa [orthogonal_eq_bot_iff] at hsp )
+ rwa [orthogonal_eq_bot_iff] at hsp)
#align orthonormal_basis.mk_of_orthogonal_eq_bot OrthonormalBasis.mkOfOrthogonalEqBot
-/
@@ -811,7 +811,7 @@ theorem OrthonormalBasis.det_to_matrix_orthonormalBasis : ‖a.toBasis.det b‖
have : (norm_sq (a.to_basis.det b) : 𝕜) = 1 := by
simpa [IsROrC.mul_conj] using
(Matrix.det_of_mem_unitary (a.to_matrix_orthonormal_basis_mem_unitary b)).2
- norm_cast at this
+ norm_cast at this
rwa [← sqrt_norm_sq_eq_norm, sqrt_eq_one]
#align orthonormal_basis.det_to_matrix_orthonormal_basis OrthonormalBasis.det_to_matrix_orthonormalBasis
-/
@@ -886,7 +886,7 @@ theorem Orthonormal.exists_orthonormalBasis_extension (hv : Orthonormal 𝕜 (co
∃ (u : Finset E) (b : OrthonormalBasis u 𝕜 E), v ⊆ u ∧ ⇑b = coe :=
by
obtain ⟨u₀, hu₀s, hu₀, hu₀_max⟩ := exists_maximal_orthonormal hv
- rw [maximal_orthonormal_iff_orthogonalComplement_eq_bot hu₀] at hu₀_max
+ rw [maximal_orthonormal_iff_orthogonalComplement_eq_bot hu₀] at hu₀_max
have hu₀_finite : u₀.finite := hu₀.linear_independent.finite
let u : Finset E := hu₀_finite.to_finset
let fu : ↥u ≃ ↥u₀ := Equiv.cast (congr_arg coeSort hu₀_finite.coe_to_finset)
@@ -953,7 +953,7 @@ theorem orthonormalBasis_one_dim (b : OrthonormalBasis ι ℝ ℝ) :
have : b default = 1 ∨ b default = -1 :=
by
have : ‖b default‖ = 1 := b.orthonormal.1 _
- rwa [Real.norm_eq_abs, abs_eq (zero_le_one : (0 : ℝ) ≤ 1)] at this
+ rwa [Real.norm_eq_abs, abs_eq (zero_le_one : (0 : ℝ) ≤ 1)] at this
rw [eq_const_of_unique b]
refine' this.imp _ _ <;> simp
#align orthonormal_basis_one_dim orthonormalBasis_one_dim
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -222,7 +222,13 @@ def DirectSum.IsInternal.isometryL2OfOrthogonalFamily [DecidableEq ι] {V : ι
theorem DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply [DecidableEq ι]
{V : ι → Submodule 𝕜 E} (hV : DirectSum.IsInternal V)
(hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) (w : PiLp 2 fun i => V i) :
- (hV.isometryL2OfOrthogonalFamily hV').symm w = ∑ i, (w i : E) := by classical
+ (hV.isometryL2OfOrthogonalFamily hV').symm w = ∑ i, (w i : E) := by
+ classical
+ let e₁ := DirectSum.linearEquivFunOnFintype 𝕜 ι fun i => V i
+ let e₂ := LinearEquiv.ofBijective (DirectSum.coeLinearMap V) hV
+ suffices ∀ v : ⨁ i, V i, e₂ v = ∑ i, e₁ v i by exact this (e₁.symm w)
+ intro v
+ simp [e₂, DirectSum.coeLinearMap, DirectSum.toModule, DFinsupp.sumAddHom_apply]
#align direct_sum.is_internal.isometry_L2_of_orthogonal_family_symm_apply DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply
-/
@@ -385,7 +391,8 @@ instance : Inhabited (OrthonormalBasis ι 𝕜 (EuclideanSpace 𝕜 ι)) :=
⟨ofRepr (LinearIsometryEquiv.refl 𝕜 (EuclideanSpace 𝕜 ι))⟩
/-- `b i` is the `i`th basis vector. -/
-instance : CoeFun (OrthonormalBasis ι 𝕜 E) fun _ => ι → E where coe b i := by classical
+instance : CoeFun (OrthonormalBasis ι 𝕜 E) fun _ => ι → E
+ where coe b i := by classical exact b.repr.symm (EuclideanSpace.single i (1 : 𝕜))
#print OrthonormalBasis.coe_ofRepr /-
@[simp]
@@ -403,7 +410,10 @@ theorem coe_ofRepr [DecidableEq ι] (e : E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜
#print OrthonormalBasis.repr_symm_single /-
@[simp]
protected theorem repr_symm_single [DecidableEq ι] (b : OrthonormalBasis ι 𝕜 E) (i : ι) :
- b.repr.symm (EuclideanSpace.single i (1 : 𝕜)) = b i := by classical
+ b.repr.symm (EuclideanSpace.single i (1 : 𝕜)) = b i := by
+ classical
+ congr
+ simp
#align orthonormal_basis.repr_symm_single OrthonormalBasis.repr_symm_single
-/
@@ -417,13 +427,21 @@ protected theorem repr_self [DecidableEq ι] (b : OrthonormalBasis ι 𝕜 E) (i
#print OrthonormalBasis.repr_apply_apply /-
protected theorem repr_apply_apply (b : OrthonormalBasis ι 𝕜 E) (v : E) (i : ι) :
- b.repr v i = ⟪b i, v⟫ := by classical
+ b.repr v i = ⟪b i, v⟫ := by
+ classical
+ rw [← b.repr.inner_map_map (b i) v, b.repr_self i, EuclideanSpace.inner_single_left]
+ simp only [one_mul, eq_self_iff_true, map_one]
#align orthonormal_basis.repr_apply_apply OrthonormalBasis.repr_apply_apply
-/
#print OrthonormalBasis.orthonormal /-
@[simp]
-protected theorem orthonormal (b : OrthonormalBasis ι 𝕜 E) : Orthonormal 𝕜 b := by classical
+protected theorem orthonormal (b : OrthonormalBasis ι 𝕜 E) : Orthonormal 𝕜 b := by
+ classical
+ rw [orthonormal_iff_ite]
+ intro i j
+ rw [← b.repr.inner_map_map (b i) (b j), b.repr_self i, b.repr_self j,
+ EuclideanSpace.inner_single_left, EuclideanSpace.single_apply, map_one, one_mul]
#align orthonormal_basis.orthonormal OrthonormalBasis.orthonormal
-/
@@ -441,6 +459,8 @@ protected theorem coe_toBasis (b : OrthonormalBasis ι 𝕜 E) : (⇑b.toBasis :
change ⇑(Basis.ofEquivFun b.repr.to_linear_equiv) = b
ext j
classical
+ rw [Basis.coe_ofEquivFun]
+ congr
#align orthonormal_basis.coe_to_basis OrthonormalBasis.coe_toBasis
-/
@@ -566,7 +586,8 @@ theorem Basis.toBasis_toOrthonormalBasis (v : Basis ι 𝕜 E) (hv : Orthonormal
theorem Basis.coe_toOrthonormalBasis (v : Basis ι 𝕜 E) (hv : Orthonormal 𝕜 v) :
(v.toOrthonormalBasis hv : ι → E) = (v : ι → E) :=
calc
- (v.toOrthonormalBasis hv : ι → E) = ((v.toOrthonormalBasis hv).toBasis : ι → E) := by classical
+ (v.toOrthonormalBasis hv : ι → E) = ((v.toOrthonormalBasis hv).toBasis : ι → E) := by
+ classical rw [OrthonormalBasis.coe_toBasis]
_ = (v : ι → E) := by simp
#align basis.coe_to_orthonormal_basis Basis.coe_toOrthonormalBasis
-/
@@ -584,7 +605,8 @@ protected def mk (hon : Orthonormal 𝕜 v) (hsp : ⊤ ≤ Submodule.span 𝕜 (
#print OrthonormalBasis.coe_mk /-
@[simp]
protected theorem coe_mk (hon : Orthonormal 𝕜 v) (hsp : ⊤ ≤ Submodule.span 𝕜 (Set.range v)) :
- ⇑(OrthonormalBasis.mk hon hsp) = v := by classical
+ ⇑(OrthonormalBasis.mk hon hsp) = v := by
+ classical rw [OrthonormalBasis.mk, _root_.basis.coe_to_orthonormal_basis, Basis.coe_mk]
#align orthonormal_basis.coe_mk OrthonormalBasis.coe_mk
-/
@@ -655,7 +677,13 @@ def reindex (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') : OrthonormalBasis
#print OrthonormalBasis.reindex_apply /-
protected theorem reindex_apply (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') (i' : ι') :
- (b.reindex e) i' = b (e.symm i') := by classical
+ (b.reindex e) i' = b (e.symm i') := by
+ classical
+ dsimp [reindex, OrthonormalBasis.hasCoeToFun]
+ rw [coe_of_repr]
+ dsimp
+ rw [← b.repr_symm_single, LinearIsometryEquiv.piLpCongrLeft_symm,
+ EuclideanSpace.piLpCongrLeft_single]
#align orthonormal_basis.reindex_apply OrthonormalBasis.reindex_apply
-/
@@ -670,7 +698,8 @@ protected theorem coe_reindex (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι')
#print OrthonormalBasis.repr_reindex /-
@[simp]
protected theorem repr_reindex (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') (x : E) (i' : ι') :
- (b.reindex e).repr x i' = b.repr x (e.symm i') := by classical
+ (b.reindex e).repr x i' = b.repr x (e.symm i') := by
+ classical rw [OrthonormalBasis.repr_apply_apply, b.repr_apply_apply, OrthonormalBasis.coe_reindex]
#align orthonormal_basis.repr_reindex OrthonormalBasis.repr_reindex
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -222,13 +222,7 @@ def DirectSum.IsInternal.isometryL2OfOrthogonalFamily [DecidableEq ι] {V : ι
theorem DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply [DecidableEq ι]
{V : ι → Submodule 𝕜 E} (hV : DirectSum.IsInternal V)
(hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) (w : PiLp 2 fun i => V i) :
- (hV.isometryL2OfOrthogonalFamily hV').symm w = ∑ i, (w i : E) := by
- classical
- let e₁ := DirectSum.linearEquivFunOnFintype 𝕜 ι fun i => V i
- let e₂ := LinearEquiv.ofBijective (DirectSum.coeLinearMap V) hV
- suffices ∀ v : ⨁ i, V i, e₂ v = ∑ i, e₁ v i by exact this (e₁.symm w)
- intro v
- simp [e₂, DirectSum.coeLinearMap, DirectSum.toModule, DFinsupp.sumAddHom_apply]
+ (hV.isometryL2OfOrthogonalFamily hV').symm w = ∑ i, (w i : E) := by classical
#align direct_sum.is_internal.isometry_L2_of_orthogonal_family_symm_apply DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply
-/
@@ -391,8 +385,7 @@ instance : Inhabited (OrthonormalBasis ι 𝕜 (EuclideanSpace 𝕜 ι)) :=
⟨ofRepr (LinearIsometryEquiv.refl 𝕜 (EuclideanSpace 𝕜 ι))⟩
/-- `b i` is the `i`th basis vector. -/
-instance : CoeFun (OrthonormalBasis ι 𝕜 E) fun _ => ι → E
- where coe b i := by classical exact b.repr.symm (EuclideanSpace.single i (1 : 𝕜))
+instance : CoeFun (OrthonormalBasis ι 𝕜 E) fun _ => ι → E where coe b i := by classical
#print OrthonormalBasis.coe_ofRepr /-
@[simp]
@@ -410,10 +403,7 @@ theorem coe_ofRepr [DecidableEq ι] (e : E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜
#print OrthonormalBasis.repr_symm_single /-
@[simp]
protected theorem repr_symm_single [DecidableEq ι] (b : OrthonormalBasis ι 𝕜 E) (i : ι) :
- b.repr.symm (EuclideanSpace.single i (1 : 𝕜)) = b i := by
- classical
- congr
- simp
+ b.repr.symm (EuclideanSpace.single i (1 : 𝕜)) = b i := by classical
#align orthonormal_basis.repr_symm_single OrthonormalBasis.repr_symm_single
-/
@@ -427,21 +417,13 @@ protected theorem repr_self [DecidableEq ι] (b : OrthonormalBasis ι 𝕜 E) (i
#print OrthonormalBasis.repr_apply_apply /-
protected theorem repr_apply_apply (b : OrthonormalBasis ι 𝕜 E) (v : E) (i : ι) :
- b.repr v i = ⟪b i, v⟫ := by
- classical
- rw [← b.repr.inner_map_map (b i) v, b.repr_self i, EuclideanSpace.inner_single_left]
- simp only [one_mul, eq_self_iff_true, map_one]
+ b.repr v i = ⟪b i, v⟫ := by classical
#align orthonormal_basis.repr_apply_apply OrthonormalBasis.repr_apply_apply
-/
#print OrthonormalBasis.orthonormal /-
@[simp]
-protected theorem orthonormal (b : OrthonormalBasis ι 𝕜 E) : Orthonormal 𝕜 b := by
- classical
- rw [orthonormal_iff_ite]
- intro i j
- rw [← b.repr.inner_map_map (b i) (b j), b.repr_self i, b.repr_self j,
- EuclideanSpace.inner_single_left, EuclideanSpace.single_apply, map_one, one_mul]
+protected theorem orthonormal (b : OrthonormalBasis ι 𝕜 E) : Orthonormal 𝕜 b := by classical
#align orthonormal_basis.orthonormal OrthonormalBasis.orthonormal
-/
@@ -459,8 +441,6 @@ protected theorem coe_toBasis (b : OrthonormalBasis ι 𝕜 E) : (⇑b.toBasis :
change ⇑(Basis.ofEquivFun b.repr.to_linear_equiv) = b
ext j
classical
- rw [Basis.coe_ofEquivFun]
- congr
#align orthonormal_basis.coe_to_basis OrthonormalBasis.coe_toBasis
-/
@@ -586,8 +566,7 @@ theorem Basis.toBasis_toOrthonormalBasis (v : Basis ι 𝕜 E) (hv : Orthonormal
theorem Basis.coe_toOrthonormalBasis (v : Basis ι 𝕜 E) (hv : Orthonormal 𝕜 v) :
(v.toOrthonormalBasis hv : ι → E) = (v : ι → E) :=
calc
- (v.toOrthonormalBasis hv : ι → E) = ((v.toOrthonormalBasis hv).toBasis : ι → E) := by
- classical rw [OrthonormalBasis.coe_toBasis]
+ (v.toOrthonormalBasis hv : ι → E) = ((v.toOrthonormalBasis hv).toBasis : ι → E) := by classical
_ = (v : ι → E) := by simp
#align basis.coe_to_orthonormal_basis Basis.coe_toOrthonormalBasis
-/
@@ -605,8 +584,7 @@ protected def mk (hon : Orthonormal 𝕜 v) (hsp : ⊤ ≤ Submodule.span 𝕜 (
#print OrthonormalBasis.coe_mk /-
@[simp]
protected theorem coe_mk (hon : Orthonormal 𝕜 v) (hsp : ⊤ ≤ Submodule.span 𝕜 (Set.range v)) :
- ⇑(OrthonormalBasis.mk hon hsp) = v := by
- classical rw [OrthonormalBasis.mk, _root_.basis.coe_to_orthonormal_basis, Basis.coe_mk]
+ ⇑(OrthonormalBasis.mk hon hsp) = v := by classical
#align orthonormal_basis.coe_mk OrthonormalBasis.coe_mk
-/
@@ -677,13 +655,7 @@ def reindex (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') : OrthonormalBasis
#print OrthonormalBasis.reindex_apply /-
protected theorem reindex_apply (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') (i' : ι') :
- (b.reindex e) i' = b (e.symm i') := by
- classical
- dsimp [reindex, OrthonormalBasis.hasCoeToFun]
- rw [coe_of_repr]
- dsimp
- rw [← b.repr_symm_single, LinearIsometryEquiv.piLpCongrLeft_symm,
- EuclideanSpace.piLpCongrLeft_single]
+ (b.reindex e) i' = b (e.symm i') := by classical
#align orthonormal_basis.reindex_apply OrthonormalBasis.reindex_apply
-/
@@ -698,8 +670,7 @@ protected theorem coe_reindex (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι')
#print OrthonormalBasis.repr_reindex /-
@[simp]
protected theorem repr_reindex (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') (x : E) (i' : ι') :
- (b.reindex e).repr x i' = b.repr x (e.symm i') := by
- classical rw [OrthonormalBasis.repr_apply_apply, b.repr_apply_apply, OrthonormalBasis.coe_reindex]
+ (b.reindex e).repr x i' = b.repr x (e.symm i') := by classical
#align orthonormal_basis.repr_reindex OrthonormalBasis.repr_reindex
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -88,8 +88,7 @@ instance PiLp.innerProductSpace {ι : Type _} [Fintype ι] (f : ι → Type _)
InnerProductSpace 𝕜 (PiLp 2 f)
where
inner x y := ∑ i, inner (x i) (y i)
- norm_sq_eq_inner x := by
- simp only [PiLp.norm_sq_eq_of_L2, AddMonoidHom.map_sum, ← norm_sq_eq_inner, one_div]
+ norm_sq_eq_inner x := by simp only [PiLp.norm_sq_eq_of_L2, map_sum, ← norm_sq_eq_inner, one_div]
conj_symm := by
intro x y
unfold inner
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,10 +3,10 @@ Copyright (c) 2020 Joseph Myers. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Myers, Sébastien Gouëzel, Heather Macbeth
-/
-import Mathbin.Analysis.InnerProductSpace.Projection
-import Mathbin.Analysis.NormedSpace.PiLp
-import Mathbin.LinearAlgebra.FiniteDimensional
-import Mathbin.LinearAlgebra.UnitaryGroup
+import Analysis.InnerProductSpace.Projection
+import Analysis.NormedSpace.PiLp
+import LinearAlgebra.FiniteDimensional
+import LinearAlgebra.UnitaryGroup
#align_import analysis.inner_product_space.pi_L2 from "leanprover-community/mathlib"@"f60c6087a7275b72d5db3c5a1d0e19e35a429c0a"
mathlib commit https://github.com/leanprover-community/mathlib/commit/442a83d738cb208d3600056c489be16900ba701d
@@ -277,27 +277,27 @@ def EuclideanSpace.single [DecidableEq ι] (i : ι) (a : 𝕜) : EuclideanSpace
#align euclidean_space.single EuclideanSpace.single
-/
-#print PiLp.equiv_single /-
+#print WithLp.equiv_single /-
@[simp]
-theorem PiLp.equiv_single [DecidableEq ι] (i : ι) (a : 𝕜) :
+theorem WithLp.equiv_single [DecidableEq ι] (i : ι) (a : 𝕜) :
PiLp.equiv _ _ (EuclideanSpace.single i a) = Pi.single i a :=
rfl
-#align pi_Lp.equiv_single PiLp.equiv_single
+#align pi_Lp.equiv_single WithLp.equiv_single
-/
-#print PiLp.equiv_symm_single /-
+#print WithLp.equiv_symm_single /-
@[simp]
-theorem PiLp.equiv_symm_single [DecidableEq ι] (i : ι) (a : 𝕜) :
+theorem WithLp.equiv_symm_single [DecidableEq ι] (i : ι) (a : 𝕜) :
(PiLp.equiv _ _).symm (Pi.single i a) = EuclideanSpace.single i a :=
rfl
-#align pi_Lp.equiv_symm_single PiLp.equiv_symm_single
+#align pi_Lp.equiv_symm_single WithLp.equiv_symm_single
-/
#print EuclideanSpace.single_apply /-
@[simp]
theorem EuclideanSpace.single_apply [DecidableEq ι] (i : ι) (a : 𝕜) (j : ι) :
(EuclideanSpace.single i a) j = ite (j = i) a 0 := by
- rw [EuclideanSpace.single, PiLp.equiv_symm_apply, ← Pi.single_apply i a j]
+ rw [EuclideanSpace.single, WithLp.equiv_symm_pi_apply, ← Pi.single_apply i a j]
#align euclidean_space.single_apply EuclideanSpace.single_apply
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,17 +2,14 @@
Copyright (c) 2020 Joseph Myers. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Myers, Sébastien Gouëzel, Heather Macbeth
-
-! This file was ported from Lean 3 source module analysis.inner_product_space.pi_L2
-! leanprover-community/mathlib commit f60c6087a7275b72d5db3c5a1d0e19e35a429c0a
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Analysis.InnerProductSpace.Projection
import Mathbin.Analysis.NormedSpace.PiLp
import Mathbin.LinearAlgebra.FiniteDimensional
import Mathbin.LinearAlgebra.UnitaryGroup
+#align_import analysis.inner_product_space.pi_L2 from "leanprover-community/mathlib"@"f60c6087a7275b72d5db3c5a1d0e19e35a429c0a"
+
/-!
# `L²` inner product space structure on finite products of inner product spaces
mathlib commit https://github.com/leanprover-community/mathlib/commit/4e24c4bfcff371c71f7ba22050308aa17815626c
@@ -232,7 +232,7 @@ theorem DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply [DecidableE
let e₂ := LinearEquiv.ofBijective (DirectSum.coeLinearMap V) hV
suffices ∀ v : ⨁ i, V i, e₂ v = ∑ i, e₁ v i by exact this (e₁.symm w)
intro v
- simp [e₂, DirectSum.coeLinearMap, DirectSum.toModule, Dfinsupp.sumAddHom_apply]
+ simp [e₂, DirectSum.coeLinearMap, DirectSum.toModule, DFinsupp.sumAddHom_apply]
#align direct_sum.is_internal.isometry_L2_of_orthogonal_family_symm_apply DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/2a0ce625dbb0ffbc7d1316597de0b25c1ec75303
@@ -799,7 +799,7 @@ theorem OrthonormalBasis.toMatrix_orthonormalBasis_mem_unitary :
a.toBasis.toMatrix b ∈ Matrix.unitaryGroup ι 𝕜 :=
by
rw [Matrix.mem_unitaryGroup_iff']
- ext (i j)
+ ext i j
convert a.repr.inner_map_map (b i) (b j)
rw [orthonormal_iff_ite.mp b.orthonormal i j]
rfl
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -78,9 +78,9 @@ variable {F : Type _} [NormedAddCommGroup F] [InnerProductSpace ℝ F]
variable {F' : Type _} [NormedAddCommGroup F'] [InnerProductSpace ℝ F']
--- mathport name: «expr⟪ , ⟫»
local notation "⟪" x ", " y "⟫" => @inner 𝕜 _ _ x y
+#print PiLp.innerProductSpace /-
/-
If `ι` is a finite type and each space `f i`, `i : ι`, is an inner product space,
then `Π i, f i` is an inner product space as well. Since `Π i, f i` is endowed with the sup norm,
@@ -107,12 +107,15 @@ instance PiLp.innerProductSpace {ι : Type _} [Fintype ι] (f : ι → Type _)
show ∑ i : ι, inner (r • x i) (y i) = conj r * ∑ i, inner (x i) (y i) by
simp only [Finset.mul_sum, inner_smul_left]
#align pi_Lp.inner_product_space PiLp.innerProductSpace
+-/
+#print PiLp.inner_apply /-
@[simp]
theorem PiLp.inner_apply {ι : Type _} [Fintype ι] {f : ι → Type _} [∀ i, NormedAddCommGroup (f i)]
[∀ i, InnerProductSpace 𝕜 (f i)] (x y : PiLp 2 f) : ⟪x, y⟫ = ∑ i, ⟪x i, y i⟫ :=
rfl
#align pi_Lp.inner_apply PiLp.inner_apply
+-/
#print EuclideanSpace /-
/-- The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
@@ -123,30 +126,40 @@ def EuclideanSpace (𝕜 : Type _) [IsROrC 𝕜] (n : Type _) [Fintype n] : Type
#align euclidean_space EuclideanSpace
-/
+#print EuclideanSpace.nnnorm_eq /-
theorem EuclideanSpace.nnnorm_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
(x : EuclideanSpace 𝕜 n) : ‖x‖₊ = NNReal.sqrt (∑ i, ‖x i‖₊ ^ 2) :=
PiLp.nnnorm_eq_of_L2 x
#align euclidean_space.nnnorm_eq EuclideanSpace.nnnorm_eq
+-/
+#print EuclideanSpace.norm_eq /-
theorem EuclideanSpace.norm_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
(x : EuclideanSpace 𝕜 n) : ‖x‖ = Real.sqrt (∑ i, ‖x i‖ ^ 2) := by
simpa only [Real.coe_sqrt, NNReal.coe_sum] using congr_arg (coe : ℝ≥0 → ℝ) x.nnnorm_eq
#align euclidean_space.norm_eq EuclideanSpace.norm_eq
+-/
+#print EuclideanSpace.dist_eq /-
theorem EuclideanSpace.dist_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : dist x y = (∑ i, dist (x i) (y i) ^ 2).sqrt :=
(PiLp.dist_eq_of_L2 x y : _)
#align euclidean_space.dist_eq EuclideanSpace.dist_eq
+-/
+#print EuclideanSpace.nndist_eq /-
theorem EuclideanSpace.nndist_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : nndist x y = (∑ i, nndist (x i) (y i) ^ 2).sqrt :=
(PiLp.nndist_eq_of_L2 x y : _)
#align euclidean_space.nndist_eq EuclideanSpace.nndist_eq
+-/
+#print EuclideanSpace.edist_eq /-
theorem EuclideanSpace.edist_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : edist x y = (∑ i, edist (x i) (y i) ^ 2) ^ (1 / 2 : ℝ) :=
(PiLp.edist_eq_of_L2 x y : _)
#align euclidean_space.edist_eq EuclideanSpace.edist_eq
+-/
variable [Fintype ι]
@@ -185,6 +198,7 @@ theorem EuclideanSpace.inner_piLp_equiv_symm (x y : ι → 𝕜) :
#align euclidean_space.inner_pi_Lp_equiv_symm EuclideanSpace.inner_piLp_equiv_symm
-/
+#print DirectSum.IsInternal.isometryL2OfOrthogonalFamily /-
/-- A finite, mutually orthogonal family of subspaces of `E`, which span `E`, induce an isometry
from `E` to `pi_Lp 2` of the subspaces equipped with the `L2` inner product. -/
def DirectSum.IsInternal.isometryL2OfOrthogonalFamily [DecidableEq ι] {V : ι → Submodule 𝕜 E}
@@ -205,7 +219,9 @@ def DirectSum.IsInternal.isometryL2OfOrthogonalFamily [DecidableEq ι] {V : ι
· simp only [sum_inner, hV'.inner_right_fintype, PiLp.inner_apply]
· congr <;> simp
#align direct_sum.is_internal.isometry_L2_of_orthogonal_family DirectSum.IsInternal.isometryL2OfOrthogonalFamily
+-/
+#print DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply /-
@[simp]
theorem DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply [DecidableEq ι]
{V : ι → Submodule 𝕜 E} (hV : DirectSum.IsInternal V)
@@ -218,6 +234,7 @@ theorem DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply [DecidableE
intro v
simp [e₂, DirectSum.coeLinearMap, DirectSum.toModule, Dfinsupp.sumAddHom_apply]
#align direct_sum.is_internal.isometry_L2_of_orthogonal_family_symm_apply DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply
+-/
end
@@ -263,62 +280,83 @@ def EuclideanSpace.single [DecidableEq ι] (i : ι) (a : 𝕜) : EuclideanSpace
#align euclidean_space.single EuclideanSpace.single
-/
+#print PiLp.equiv_single /-
@[simp]
theorem PiLp.equiv_single [DecidableEq ι] (i : ι) (a : 𝕜) :
PiLp.equiv _ _ (EuclideanSpace.single i a) = Pi.single i a :=
rfl
#align pi_Lp.equiv_single PiLp.equiv_single
+-/
+#print PiLp.equiv_symm_single /-
@[simp]
theorem PiLp.equiv_symm_single [DecidableEq ι] (i : ι) (a : 𝕜) :
(PiLp.equiv _ _).symm (Pi.single i a) = EuclideanSpace.single i a :=
rfl
#align pi_Lp.equiv_symm_single PiLp.equiv_symm_single
+-/
+#print EuclideanSpace.single_apply /-
@[simp]
theorem EuclideanSpace.single_apply [DecidableEq ι] (i : ι) (a : 𝕜) (j : ι) :
(EuclideanSpace.single i a) j = ite (j = i) a 0 := by
rw [EuclideanSpace.single, PiLp.equiv_symm_apply, ← Pi.single_apply i a j]
#align euclidean_space.single_apply EuclideanSpace.single_apply
+-/
+#print EuclideanSpace.inner_single_left /-
theorem EuclideanSpace.inner_single_left [DecidableEq ι] (i : ι) (a : 𝕜) (v : EuclideanSpace 𝕜 ι) :
⟪EuclideanSpace.single i (a : 𝕜), v⟫ = conj a * v i := by simp [apply_ite conj]
#align euclidean_space.inner_single_left EuclideanSpace.inner_single_left
+-/
+#print EuclideanSpace.inner_single_right /-
theorem EuclideanSpace.inner_single_right [DecidableEq ι] (i : ι) (a : 𝕜) (v : EuclideanSpace 𝕜 ι) :
⟪v, EuclideanSpace.single i (a : 𝕜)⟫ = a * conj (v i) := by simp [apply_ite conj, mul_comm]
#align euclidean_space.inner_single_right EuclideanSpace.inner_single_right
+-/
+#print EuclideanSpace.norm_single /-
@[simp]
theorem EuclideanSpace.norm_single [DecidableEq ι] (i : ι) (a : 𝕜) :
‖EuclideanSpace.single i (a : 𝕜)‖ = ‖a‖ :=
(PiLp.norm_equiv_symm_single 2 (fun i => 𝕜) i a : _)
#align euclidean_space.norm_single EuclideanSpace.norm_single
+-/
+#print EuclideanSpace.nnnorm_single /-
@[simp]
theorem EuclideanSpace.nnnorm_single [DecidableEq ι] (i : ι) (a : 𝕜) :
‖EuclideanSpace.single i (a : 𝕜)‖₊ = ‖a‖₊ :=
(PiLp.nnnorm_equiv_symm_single 2 (fun i => 𝕜) i a : _)
#align euclidean_space.nnnorm_single EuclideanSpace.nnnorm_single
+-/
+#print EuclideanSpace.dist_single_same /-
@[simp]
theorem EuclideanSpace.dist_single_same [DecidableEq ι] (i : ι) (a b : 𝕜) :
dist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = dist a b :=
(PiLp.dist_equiv_symm_single_same 2 (fun i => 𝕜) i a b : _)
#align euclidean_space.dist_single_same EuclideanSpace.dist_single_same
+-/
+#print EuclideanSpace.nndist_single_same /-
@[simp]
theorem EuclideanSpace.nndist_single_same [DecidableEq ι] (i : ι) (a b : 𝕜) :
nndist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = nndist a b :=
(PiLp.nndist_equiv_symm_single_same 2 (fun i => 𝕜) i a b : _)
#align euclidean_space.nndist_single_same EuclideanSpace.nndist_single_same
+-/
+#print EuclideanSpace.edist_single_same /-
@[simp]
theorem EuclideanSpace.edist_single_same [DecidableEq ι] (i : ι) (a b : 𝕜) :
edist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = edist a b :=
(PiLp.edist_equiv_symm_single_same 2 (fun i => 𝕜) i a b : _)
#align euclidean_space.edist_single_same EuclideanSpace.edist_single_same
+-/
+#print EuclideanSpace.orthonormal_single /-
/-- `euclidean_space.single` forms an orthonormal family. -/
theorem EuclideanSpace.orthonormal_single [DecidableEq ι] :
Orthonormal 𝕜 fun i : ι => EuclideanSpace.single i (1 : 𝕜) :=
@@ -328,13 +366,16 @@ theorem EuclideanSpace.orthonormal_single [DecidableEq ι] :
intro i j
rfl
#align euclidean_space.orthonormal_single EuclideanSpace.orthonormal_single
+-/
+#print EuclideanSpace.piLpCongrLeft_single /-
theorem EuclideanSpace.piLpCongrLeft_single [DecidableEq ι] {ι' : Type _} [Fintype ι']
[DecidableEq ι'] (e : ι' ≃ ι) (i' : ι') (v : 𝕜) :
LinearIsometryEquiv.piLpCongrLeft 2 𝕜 𝕜 e (EuclideanSpace.single i' v) =
EuclideanSpace.single (e i') v :=
LinearIsometryEquiv.piLpCongrLeft_single e i' _
#align euclidean_space.pi_Lp_congr_left_single EuclideanSpace.piLpCongrLeft_single
+-/
variable (ι 𝕜 E)
@@ -357,6 +398,7 @@ instance : Inhabited (OrthonormalBasis ι 𝕜 (EuclideanSpace 𝕜 ι)) :=
instance : CoeFun (OrthonormalBasis ι 𝕜 E) fun _ => ι → E
where coe b i := by classical exact b.repr.symm (EuclideanSpace.single i (1 : 𝕜))
+#print OrthonormalBasis.coe_ofRepr /-
@[simp]
theorem coe_ofRepr [DecidableEq ι] (e : E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜 ι) :
⇑(OrthonormalBasis.ofRepr e) = fun i => e.symm (EuclideanSpace.single i (1 : 𝕜)) :=
@@ -367,7 +409,9 @@ theorem coe_ofRepr [DecidableEq ι] (e : E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜
congr
simp only [eq_iff_true_of_subsingleton]
#align orthonormal_basis.coe_of_repr OrthonormalBasis.coe_ofRepr
+-/
+#print OrthonormalBasis.repr_symm_single /-
@[simp]
protected theorem repr_symm_single [DecidableEq ι] (b : OrthonormalBasis ι 𝕜 E) (i : ι) :
b.repr.symm (EuclideanSpace.single i (1 : 𝕜)) = b i := by
@@ -375,20 +419,26 @@ protected theorem repr_symm_single [DecidableEq ι] (b : OrthonormalBasis ι
congr
simp
#align orthonormal_basis.repr_symm_single OrthonormalBasis.repr_symm_single
+-/
+#print OrthonormalBasis.repr_self /-
@[simp]
protected theorem repr_self [DecidableEq ι] (b : OrthonormalBasis ι 𝕜 E) (i : ι) :
b.repr (b i) = EuclideanSpace.single i (1 : 𝕜) := by
rw [← b.repr_symm_single i, LinearIsometryEquiv.apply_symm_apply]
#align orthonormal_basis.repr_self OrthonormalBasis.repr_self
+-/
+#print OrthonormalBasis.repr_apply_apply /-
protected theorem repr_apply_apply (b : OrthonormalBasis ι 𝕜 E) (v : E) (i : ι) :
b.repr v i = ⟪b i, v⟫ := by
classical
rw [← b.repr.inner_map_map (b i) v, b.repr_self i, EuclideanSpace.inner_single_left]
simp only [one_mul, eq_self_iff_true, map_one]
#align orthonormal_basis.repr_apply_apply OrthonormalBasis.repr_apply_apply
+-/
+#print OrthonormalBasis.orthonormal /-
@[simp]
protected theorem orthonormal (b : OrthonormalBasis ι 𝕜 E) : Orthonormal 𝕜 b := by
classical
@@ -397,6 +447,7 @@ protected theorem orthonormal (b : OrthonormalBasis ι 𝕜 E) : Orthonormal
rw [← b.repr.inner_map_map (b i) (b j), b.repr_self i, b.repr_self j,
EuclideanSpace.inner_single_left, EuclideanSpace.single_apply, map_one, one_mul]
#align orthonormal_basis.orthonormal OrthonormalBasis.orthonormal
+-/
#print OrthonormalBasis.toBasis /-
/-- The `basis ι 𝕜 E` underlying the `orthonormal_basis` -/
@@ -405,6 +456,7 @@ protected def toBasis (b : OrthonormalBasis ι 𝕜 E) : Basis ι 𝕜 E :=
#align orthonormal_basis.to_basis OrthonormalBasis.toBasis
-/
+#print OrthonormalBasis.coe_toBasis /-
@[simp]
protected theorem coe_toBasis (b : OrthonormalBasis ι 𝕜 E) : (⇑b.toBasis : ι → E) = ⇑b :=
by
@@ -414,28 +466,38 @@ protected theorem coe_toBasis (b : OrthonormalBasis ι 𝕜 E) : (⇑b.toBasis :
rw [Basis.coe_ofEquivFun]
congr
#align orthonormal_basis.coe_to_basis OrthonormalBasis.coe_toBasis
+-/
+#print OrthonormalBasis.coe_toBasis_repr /-
@[simp]
protected theorem coe_toBasis_repr (b : OrthonormalBasis ι 𝕜 E) :
b.toBasis.equivFun = b.repr.toLinearEquiv :=
Basis.equivFun_ofEquivFun _
#align orthonormal_basis.coe_to_basis_repr OrthonormalBasis.coe_toBasis_repr
+-/
+#print OrthonormalBasis.coe_toBasis_repr_apply /-
@[simp]
protected theorem coe_toBasis_repr_apply (b : OrthonormalBasis ι 𝕜 E) (x : E) (i : ι) :
b.toBasis.repr x i = b.repr x i := by
rw [← Basis.equivFun_apply, OrthonormalBasis.coe_toBasis_repr,
LinearIsometryEquiv.coe_toLinearEquiv]
#align orthonormal_basis.coe_to_basis_repr_apply OrthonormalBasis.coe_toBasis_repr_apply
+-/
+#print OrthonormalBasis.sum_repr /-
protected theorem sum_repr (b : OrthonormalBasis ι 𝕜 E) (x : E) : ∑ i, b.repr x i • b i = x := by
simp_rw [← b.coe_to_basis_repr_apply, ← b.coe_to_basis]; exact b.to_basis.sum_repr x
#align orthonormal_basis.sum_repr OrthonormalBasis.sum_repr
+-/
+#print OrthonormalBasis.sum_repr_symm /-
protected theorem sum_repr_symm (b : OrthonormalBasis ι 𝕜 E) (v : EuclideanSpace 𝕜 ι) :
∑ i, v i • b i = b.repr.symm v := by simpa using (b.to_basis.equiv_fun_symm_apply v).symm
#align orthonormal_basis.sum_repr_symm OrthonormalBasis.sum_repr_symm
+-/
+#print OrthonormalBasis.sum_inner_mul_inner /-
protected theorem sum_inner_mul_inner (b : OrthonormalBasis ι 𝕜 E) (x y : E) :
∑ i, ⟪x, b i⟫ * ⟪b i, y⟫ = ⟪x, y⟫ :=
by
@@ -446,13 +508,16 @@ protected theorem sum_inner_mul_inner (b : OrthonormalBasis ι 𝕜 E) (x y : E)
rw [SMulHomClass.map_smul, b.repr_apply_apply, mul_comm]
rfl
#align orthonormal_basis.sum_inner_mul_inner OrthonormalBasis.sum_inner_mul_inner
+-/
+#print OrthonormalBasis.orthogonalProjection_eq_sum /-
protected theorem orthogonalProjection_eq_sum {U : Submodule 𝕜 E} [CompleteSpace U]
(b : OrthonormalBasis ι 𝕜 U) (x : E) : orthogonalProjection U x = ∑ i, ⟪(b i : E), x⟫ • b i :=
by
simpa only [b.repr_apply_apply, inner_orthogonalProjection_eq_of_mem_left] using
(b.sum_repr (orthogonalProjection U x)).symm
#align orthonormal_basis.orthogonal_projection_eq_sum OrthonormalBasis.orthogonalProjection_eq_sum
+-/
#print OrthonormalBasis.map /-
/-- Mapping an orthonormal basis along a `linear_isometry_equiv`. -/
@@ -462,18 +527,22 @@ protected def map {G : Type _} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
#align orthonormal_basis.map OrthonormalBasis.map
-/
+#print OrthonormalBasis.map_apply /-
@[simp]
protected theorem map_apply {G : Type _} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
(b : OrthonormalBasis ι 𝕜 E) (L : E ≃ₗᵢ[𝕜] G) (i : ι) : b.map L i = L (b i) :=
rfl
#align orthonormal_basis.map_apply OrthonormalBasis.map_apply
+-/
+#print OrthonormalBasis.toBasis_map /-
@[simp]
protected theorem toBasis_map {G : Type _} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
(b : OrthonormalBasis ι 𝕜 E) (L : E ≃ₗᵢ[𝕜] G) :
(b.map L).toBasis = b.toBasis.map L.toLinearEquiv :=
rfl
#align orthonormal_basis.to_basis_map OrthonormalBasis.toBasis_map
+-/
#print Basis.toOrthonormalBasis /-
/-- A basis that is orthonormal is an orthonormal basis. -/
@@ -492,24 +561,31 @@ def Basis.toOrthonormalBasis (v : Basis ι 𝕜 E) (hv : Orthonormal 𝕜 v) : O
#align basis.to_orthonormal_basis Basis.toOrthonormalBasis
-/
+#print Basis.coe_toOrthonormalBasis_repr /-
@[simp]
theorem Basis.coe_toOrthonormalBasis_repr (v : Basis ι 𝕜 E) (hv : Orthonormal 𝕜 v) :
((v.toOrthonormalBasis hv).repr : E → EuclideanSpace 𝕜 ι) = v.equivFun :=
rfl
#align basis.coe_to_orthonormal_basis_repr Basis.coe_toOrthonormalBasis_repr
+-/
+#print Basis.coe_toOrthonormalBasis_repr_symm /-
@[simp]
theorem Basis.coe_toOrthonormalBasis_repr_symm (v : Basis ι 𝕜 E) (hv : Orthonormal 𝕜 v) :
((v.toOrthonormalBasis hv).repr.symm : EuclideanSpace 𝕜 ι → E) = v.equivFun.symm :=
rfl
#align basis.coe_to_orthonormal_basis_repr_symm Basis.coe_toOrthonormalBasis_repr_symm
+-/
+#print Basis.toBasis_toOrthonormalBasis /-
@[simp]
theorem Basis.toBasis_toOrthonormalBasis (v : Basis ι 𝕜 E) (hv : Orthonormal 𝕜 v) :
(v.toOrthonormalBasis hv).toBasis = v := by
simp [Basis.toOrthonormalBasis, OrthonormalBasis.toBasis]
#align basis.to_basis_to_orthonormal_basis Basis.toBasis_toOrthonormalBasis
+-/
+#print Basis.coe_toOrthonormalBasis /-
@[simp]
theorem Basis.coe_toOrthonormalBasis (v : Basis ι 𝕜 E) (hv : Orthonormal 𝕜 v) :
(v.toOrthonormalBasis hv : ι → E) = (v : ι → E) :=
@@ -518,20 +594,25 @@ theorem Basis.coe_toOrthonormalBasis (v : Basis ι 𝕜 E) (hv : Orthonormal
classical rw [OrthonormalBasis.coe_toBasis]
_ = (v : ι → E) := by simp
#align basis.coe_to_orthonormal_basis Basis.coe_toOrthonormalBasis
+-/
variable {v : ι → E}
+#print OrthonormalBasis.mk /-
/-- A finite orthonormal set that spans is an orthonormal basis -/
protected def mk (hon : Orthonormal 𝕜 v) (hsp : ⊤ ≤ Submodule.span 𝕜 (Set.range v)) :
OrthonormalBasis ι 𝕜 E :=
(Basis.mk (Orthonormal.linearIndependent hon) hsp).toOrthonormalBasis (by rwa [Basis.coe_mk])
#align orthonormal_basis.mk OrthonormalBasis.mk
+-/
+#print OrthonormalBasis.coe_mk /-
@[simp]
protected theorem coe_mk (hon : Orthonormal 𝕜 v) (hsp : ⊤ ≤ Submodule.span 𝕜 (Set.range v)) :
⇑(OrthonormalBasis.mk hon hsp) = v := by
classical rw [OrthonormalBasis.mk, _root_.basis.coe_to_orthonormal_basis, Basis.coe_mk]
#align orthonormal_basis.coe_mk OrthonormalBasis.coe_mk
+-/
#print OrthonormalBasis.span /-
/-- Any finite subset of a orthonormal family is an `orthonormal_basis` for its span. -/
@@ -555,15 +636,18 @@ protected def span [DecidableEq E] {v' : ι' → E} (h : Orthonormal 𝕜 v') (s
#align orthonormal_basis.span OrthonormalBasis.span
-/
+#print OrthonormalBasis.span_apply /-
@[simp]
protected theorem span_apply [DecidableEq E] {v' : ι' → E} (h : Orthonormal 𝕜 v') (s : Finset ι')
(i : s) : (OrthonormalBasis.span h s i : E) = v' i := by
simp only [OrthonormalBasis.span, Basis.span_apply, LinearIsometryEquiv.ofEq_symm,
OrthonormalBasis.map_apply, OrthonormalBasis.coe_mk, LinearIsometryEquiv.coe_ofEq_apply]
#align orthonormal_basis.span_apply OrthonormalBasis.span_apply
+-/
open Submodule
+#print OrthonormalBasis.mkOfOrthogonalEqBot /-
/-- A finite orthonormal family of vectors whose span has trivial orthogonal complement is an
orthonormal basis. -/
protected def mkOfOrthogonalEqBot (hon : Orthonormal 𝕜 v) (hsp : (span 𝕜 (Set.range v))ᗮ = ⊥) :
@@ -576,12 +660,15 @@ protected def mkOfOrthogonalEqBot (hon : Orthonormal 𝕜 v) (hsp : (span 𝕜 (
haveI : CompleteSpace (span 𝕜 (range v)) := FiniteDimensional.complete 𝕜 _
rwa [orthogonal_eq_bot_iff] at hsp )
#align orthonormal_basis.mk_of_orthogonal_eq_bot OrthonormalBasis.mkOfOrthogonalEqBot
+-/
+#print OrthonormalBasis.coe_of_orthogonal_eq_bot_mk /-
@[simp]
protected theorem coe_of_orthogonal_eq_bot_mk (hon : Orthonormal 𝕜 v)
(hsp : (span 𝕜 (Set.range v))ᗮ = ⊥) : ⇑(OrthonormalBasis.mkOfOrthogonalEqBot hon hsp) = v :=
OrthonormalBasis.coe_mk hon _
#align orthonormal_basis.coe_of_orthogonal_eq_bot_mk OrthonormalBasis.coe_of_orthogonal_eq_bot_mk
+-/
variable [Fintype ι']
@@ -592,6 +679,7 @@ def reindex (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') : OrthonormalBasis
#align orthonormal_basis.reindex OrthonormalBasis.reindex
-/
+#print OrthonormalBasis.reindex_apply /-
protected theorem reindex_apply (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') (i' : ι') :
(b.reindex e) i' = b (e.symm i') := by
classical
@@ -601,21 +689,27 @@ protected theorem reindex_apply (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι'
rw [← b.repr_symm_single, LinearIsometryEquiv.piLpCongrLeft_symm,
EuclideanSpace.piLpCongrLeft_single]
#align orthonormal_basis.reindex_apply OrthonormalBasis.reindex_apply
+-/
+#print OrthonormalBasis.coe_reindex /-
@[simp]
protected theorem coe_reindex (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') :
⇑(b.reindex e) = ⇑b ∘ ⇑e.symm :=
funext (b.reindex_apply e)
#align orthonormal_basis.coe_reindex OrthonormalBasis.coe_reindex
+-/
+#print OrthonormalBasis.repr_reindex /-
@[simp]
protected theorem repr_reindex (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') (x : E) (i' : ι') :
(b.reindex e).repr x i' = b.repr x (e.symm i') := by
classical rw [OrthonormalBasis.repr_apply_apply, b.repr_apply_apply, OrthonormalBasis.coe_reindex]
#align orthonormal_basis.repr_reindex OrthonormalBasis.repr_reindex
+-/
end OrthonormalBasis
+#print Complex.orthonormalBasisOneI /-
/-- `![1, I]` is an orthonormal basis for `ℂ` considered as a real inner product space. -/
def Complex.orthonormalBasisOneI : OrthonormalBasis (Fin 2) ℝ ℂ :=
Complex.basisOneI.toOrthonormalBasis
@@ -623,51 +717,68 @@ def Complex.orthonormalBasisOneI : OrthonormalBasis (Fin 2) ℝ ℂ :=
rw [orthonormal_iff_ite]
intro i; fin_cases i <;> intro j <;> fin_cases j <;> simp [real_inner_eq_re_inner])
#align complex.orthonormal_basis_one_I Complex.orthonormalBasisOneI
+-/
+#print Complex.orthonormalBasisOneI_repr_apply /-
@[simp]
theorem Complex.orthonormalBasisOneI_repr_apply (z : ℂ) :
Complex.orthonormalBasisOneI.repr z = ![z.re, z.im] :=
rfl
#align complex.orthonormal_basis_one_I_repr_apply Complex.orthonormalBasisOneI_repr_apply
+-/
+#print Complex.orthonormalBasisOneI_repr_symm_apply /-
@[simp]
theorem Complex.orthonormalBasisOneI_repr_symm_apply (x : EuclideanSpace ℝ (Fin 2)) :
Complex.orthonormalBasisOneI.repr.symm x = x 0 + x 1 * i :=
rfl
#align complex.orthonormal_basis_one_I_repr_symm_apply Complex.orthonormalBasisOneI_repr_symm_apply
+-/
+#print Complex.toBasis_orthonormalBasisOneI /-
@[simp]
theorem Complex.toBasis_orthonormalBasisOneI :
Complex.orthonormalBasisOneI.toBasis = Complex.basisOneI :=
Basis.toBasis_toOrthonormalBasis _ _
#align complex.to_basis_orthonormal_basis_one_I Complex.toBasis_orthonormalBasisOneI
+-/
+#print Complex.coe_orthonormalBasisOneI /-
@[simp]
theorem Complex.coe_orthonormalBasisOneI : (Complex.orthonormalBasisOneI : Fin 2 → ℂ) = ![1, i] :=
by simp [Complex.orthonormalBasisOneI]
#align complex.coe_orthonormal_basis_one_I Complex.coe_orthonormalBasisOneI
+-/
+#print Complex.isometryOfOrthonormal /-
/-- The isometry between `ℂ` and a two-dimensional real inner product space given by a basis. -/
def Complex.isometryOfOrthonormal (v : OrthonormalBasis (Fin 2) ℝ F) : ℂ ≃ₗᵢ[ℝ] F :=
Complex.orthonormalBasisOneI.repr.trans v.repr.symm
#align complex.isometry_of_orthonormal Complex.isometryOfOrthonormal
+-/
+#print Complex.map_isometryOfOrthonormal /-
@[simp]
theorem Complex.map_isometryOfOrthonormal (v : OrthonormalBasis (Fin 2) ℝ F) (f : F ≃ₗᵢ[ℝ] F') :
Complex.isometryOfOrthonormal (v.map f) = (Complex.isometryOfOrthonormal v).trans f := by
simp [Complex.isometryOfOrthonormal, LinearIsometryEquiv.trans_assoc, OrthonormalBasis.map]
#align complex.map_isometry_of_orthonormal Complex.map_isometryOfOrthonormal
+-/
+#print Complex.isometryOfOrthonormal_symm_apply /-
theorem Complex.isometryOfOrthonormal_symm_apply (v : OrthonormalBasis (Fin 2) ℝ F) (f : F) :
(Complex.isometryOfOrthonormal v).symm f =
(v.toBasis.Coord 0 f : ℂ) + (v.toBasis.Coord 1 f : ℂ) * i :=
by simp [Complex.isometryOfOrthonormal]
#align complex.isometry_of_orthonormal_symm_apply Complex.isometryOfOrthonormal_symm_apply
+-/
+#print Complex.isometryOfOrthonormal_apply /-
theorem Complex.isometryOfOrthonormal_apply (v : OrthonormalBasis (Fin 2) ℝ F) (z : ℂ) :
Complex.isometryOfOrthonormal v z = z.re • v 0 + z.im • v 1 := by
simp [Complex.isometryOfOrthonormal, ← v.sum_repr_symm]
#align complex.isometry_of_orthonormal_apply Complex.isometryOfOrthonormal_apply
+-/
open FiniteDimensional
@@ -682,6 +793,7 @@ section
variable (a b : OrthonormalBasis ι 𝕜 E)
+#print OrthonormalBasis.toMatrix_orthonormalBasis_mem_unitary /-
/-- The change-of-basis matrix between two orthonormal bases `a`, `b` is a unitary matrix. -/
theorem OrthonormalBasis.toMatrix_orthonormalBasis_mem_unitary :
a.toBasis.toMatrix b ∈ Matrix.unitaryGroup ι 𝕜 :=
@@ -692,7 +804,9 @@ theorem OrthonormalBasis.toMatrix_orthonormalBasis_mem_unitary :
rw [orthonormal_iff_ite.mp b.orthonormal i j]
rfl
#align orthonormal_basis.to_matrix_orthonormal_basis_mem_unitary OrthonormalBasis.toMatrix_orthonormalBasis_mem_unitary
+-/
+#print OrthonormalBasis.det_to_matrix_orthonormalBasis /-
/-- The determinant of the change-of-basis matrix between two orthonormal bases `a`, `b` has
unit length. -/
@[simp]
@@ -704,6 +818,7 @@ theorem OrthonormalBasis.det_to_matrix_orthonormalBasis : ‖a.toBasis.det b‖
norm_cast at this
rwa [← sqrt_norm_sq_eq_norm, sqrt_eq_one]
#align orthonormal_basis.det_to_matrix_orthonormal_basis OrthonormalBasis.det_to_matrix_orthonormalBasis
+-/
end
@@ -711,12 +826,15 @@ section Real
variable (a b : OrthonormalBasis ι ℝ F)
+#print OrthonormalBasis.toMatrix_orthonormalBasis_mem_orthogonal /-
/-- The change-of-basis matrix between two orthonormal bases `a`, `b` is an orthogonal matrix. -/
theorem OrthonormalBasis.toMatrix_orthonormalBasis_mem_orthogonal :
a.toBasis.toMatrix b ∈ Matrix.orthogonalGroup ι ℝ :=
a.toMatrix_orthonormalBasis_mem_unitary b
#align orthonormal_basis.to_matrix_orthonormal_basis_mem_orthogonal OrthonormalBasis.toMatrix_orthonormalBasis_mem_orthogonal
+-/
+#print OrthonormalBasis.det_to_matrix_orthonormalBasis_real /-
/-- The determinant of the change-of-basis matrix between two orthonormal bases `a`, `b` is ±1. -/
theorem OrthonormalBasis.det_to_matrix_orthonormalBasis_real :
a.toBasis.det b = 1 ∨ a.toBasis.det b = -1 :=
@@ -724,6 +842,7 @@ theorem OrthonormalBasis.det_to_matrix_orthonormalBasis_real :
rw [← sq_eq_one_iff]
simpa [unitary, sq] using Matrix.det_of_mem_unitary (a.to_matrix_orthonormal_basis_mem_unitary b)
#align orthonormal_basis.det_to_matrix_orthonormal_basis_real OrthonormalBasis.det_to_matrix_orthonormalBasis_real
+-/
end Real
@@ -752,6 +871,7 @@ noncomputable def DirectSum.IsInternal.collectedOrthonormalBasis
#align direct_sum.is_internal.collected_orthonormal_basis DirectSum.IsInternal.collectedOrthonormalBasis
-/
+#print DirectSum.IsInternal.collectedOrthonormalBasis_mem /-
theorem DirectSum.IsInternal.collectedOrthonormalBasis_mem [DecidableEq ι]
(h : DirectSum.IsInternal A) {α : ι → Type _} [∀ i, Fintype (α i)]
(hV : OrthogonalFamily 𝕜 (fun i => A i) fun i => (A i).subtypeₗᵢ)
@@ -759,9 +879,11 @@ theorem DirectSum.IsInternal.collectedOrthonormalBasis_mem [DecidableEq ι]
h.collectedOrthonormalBasis hV v a ∈ A a.1 := by
simp [DirectSum.IsInternal.collectedOrthonormalBasis]
#align direct_sum.is_internal.collected_orthonormal_basis_mem DirectSum.IsInternal.collectedOrthonormalBasis_mem
+-/
variable [FiniteDimensional 𝕜 E]
+#print Orthonormal.exists_orthonormalBasis_extension /-
/-- In a finite-dimensional `inner_product_space`, any orthonormal subset can be extended to an
orthonormal basis. -/
theorem Orthonormal.exists_orthonormalBasis_extension (hv : Orthonormal 𝕜 (coe : v → E)) :
@@ -779,7 +901,9 @@ theorem Orthonormal.exists_orthonormalBasis_extension (hv : Orthonormal 𝕜 (co
· simpa using hu₀s
· simp
#align orthonormal.exists_orthonormal_basis_extension Orthonormal.exists_orthonormalBasis_extension
+-/
+#print Orthonormal.exists_orthonormalBasis_extension_of_card_eq /-
theorem Orthonormal.exists_orthonormalBasis_extension_of_card_eq {ι : Type _} [Fintype ι]
(card_ι : finrank 𝕜 E = Fintype.card ι) {v : ι → E} {s : Set ι}
(hv : Orthonormal 𝕜 (s.restrict v)) : ∃ b : OrthonormalBasis ι 𝕜 E, ∀ i ∈ s, b i = v i :=
@@ -801,15 +925,18 @@ theorem Orthonormal.exists_orthonormalBasis_extension_of_card_eq {ι : Type _} [
intro i hi
· simp [hb₀, hg i hi]
#align orthonormal.exists_orthonormal_basis_extension_of_card_eq Orthonormal.exists_orthonormalBasis_extension_of_card_eq
+-/
variable (𝕜 E)
+#print exists_orthonormalBasis /-
/-- A finite-dimensional inner product space admits an orthonormal basis. -/
theorem exists_orthonormalBasis :
∃ (w : Finset E) (b : OrthonormalBasis w 𝕜 E), ⇑b = (coe : w → E) :=
let ⟨w, hw, hw', hw''⟩ := (orthonormal_empty 𝕜 E).exists_orthonormalBasis_extension
⟨w, hw, hw''⟩
#align exists_orthonormal_basis exists_orthonormalBasis
+-/
#print stdOrthonormalBasis /-
/-- A finite-dimensional `inner_product_space` has an orthonormal basis. -/
@@ -821,6 +948,7 @@ irreducible_def stdOrthonormalBasis : OrthonormalBasis (Fin (finrank 𝕜 E))
#align std_orthonormal_basis stdOrthonormalBasis
-/
+#print orthonormalBasis_one_dim /-
/-- An orthonormal basis of `ℝ` is made either of the vector `1`, or of the vector `-1`. -/
theorem orthonormalBasis_one_dim (b : OrthonormalBasis ι ℝ ℝ) :
(⇑b = fun _ => (1 : ℝ)) ∨ ⇑b = fun _ => (-1 : ℝ) :=
@@ -833,6 +961,7 @@ theorem orthonormalBasis_one_dim (b : OrthonormalBasis ι ℝ ℝ) :
rw [eq_const_of_unique b]
refine' this.imp _ _ <;> simp
#align orthonormal_basis_one_dim orthonormalBasis_one_dim
+-/
variable {𝕜 E}
@@ -874,6 +1003,7 @@ irreducible_def DirectSum.IsInternal.subordinateOrthonormalBasisIndex (a : Fin n
#align direct_sum.is_internal.subordinate_orthonormal_basis_index DirectSum.IsInternal.subordinateOrthonormalBasisIndex
-/
+#print DirectSum.IsInternal.subordinateOrthonormalBasis_subordinate /-
/-- The basis constructed in `orthogonal_family.subordinate_orthonormal_basis` is subordinate to
the `orthogonal_family` in question. -/
theorem DirectSum.IsInternal.subordinateOrthonormalBasis_subordinate (a : Fin n)
@@ -884,6 +1014,7 @@ theorem DirectSum.IsInternal.subordinateOrthonormalBasis_subordinate (a : Fin n)
hV.collected_orthonormal_basis_mem hV' (fun i => stdOrthonormalBasis 𝕜 (V i))
((hV.sigma_orthonormal_basis_index_equiv hn hV').symm a)
#align direct_sum.is_internal.subordinate_orthonormal_basis_subordinate DirectSum.IsInternal.subordinateOrthonormalBasis_subordinate
+-/
end SubordinateOrthonormalBasis
@@ -891,6 +1022,7 @@ end FiniteDimensional
attribute [local instance] fact_finite_dimensional_of_finrank_eq_succ
+#print OrthonormalBasis.fromOrthogonalSpanSingleton /-
/-- Given a natural number `n` one less than the `finrank` of a finite-dimensional inner product
space, there exists an isometry from the orthogonal complement of a nonzero singleton to
`euclidean_space 𝕜 (fin n)`. -/
@@ -898,6 +1030,7 @@ def OrthonormalBasis.fromOrthogonalSpanSingleton (n : ℕ) [Fact (finrank 𝕜 E
(hv : v ≠ 0) : OrthonormalBasis (Fin n) 𝕜 (𝕜 ∙ v)ᗮ :=
(stdOrthonormalBasis _ _).reindex <| finCongr <| finrank_orthogonal_span_singleton hv
#align orthonormal_basis.from_orthogonal_span_singleton OrthonormalBasis.fromOrthogonalSpanSingleton
+-/
section LinearIsometry
@@ -967,6 +1100,7 @@ noncomputable def LinearIsometry.extend (L : S →ₗᵢ[𝕜] V) : V →ₗᵢ[
#align linear_isometry.extend LinearIsometry.extend
-/
+#print LinearIsometry.extend_apply /-
theorem LinearIsometry.extend_apply (L : S →ₗᵢ[𝕜] V) (s : S) : L.extend s = L s :=
by
haveI : CompleteSpace S := FiniteDimensional.complete 𝕜 S
@@ -980,6 +1114,7 @@ theorem LinearIsometry.extend_apply (L : S →ₗᵢ[𝕜] V) (s : S) : L.extend
orthogonalProjection_mem_subspace_orthogonalComplement_eq_zero, Submodule.orthogonal_orthogonal,
Submodule.coe_mem]
#align linear_isometry.extend_apply LinearIsometry.extend_apply
+-/
end LinearIsometry
@@ -1002,28 +1137,33 @@ def toEuclideanLin : Matrix m n 𝕜 ≃ₗ[𝕜] EuclideanSpace 𝕜 n →ₗ[
#align matrix.to_euclidean_lin Matrix.toEuclideanLin
-/
+#print Matrix.toEuclideanLin_piLp_equiv_symm /-
@[simp]
theorem toEuclideanLin_piLp_equiv_symm (A : Matrix m n 𝕜) (x : n → 𝕜) :
A.toEuclideanLin ((PiLp.equiv _ _).symm x) = (PiLp.equiv _ _).symm (A.toLin' x) :=
rfl
#align matrix.to_euclidean_lin_pi_Lp_equiv_symm Matrix.toEuclideanLin_piLp_equiv_symm
+-/
+#print Matrix.piLp_equiv_toEuclideanLin /-
@[simp]
theorem piLp_equiv_toEuclideanLin (A : Matrix m n 𝕜) (x : EuclideanSpace 𝕜 n) :
PiLp.equiv _ _ (A.toEuclideanLin x) = A.toLin' (PiLp.equiv _ _ x) :=
rfl
#align matrix.pi_Lp_equiv_to_euclidean_lin Matrix.piLp_equiv_toEuclideanLin
+-/
+#print Matrix.toEuclideanLin_eq_toLin /-
-- `matrix.to_euclidean_lin` is the same as `matrix.to_lin` applied to `pi_Lp.basis_fun`,
theorem toEuclideanLin_eq_toLin :
(toEuclideanLin : Matrix m n 𝕜 ≃ₗ[𝕜] _) =
Matrix.toLin (PiLp.basisFun _ _ _) (PiLp.basisFun _ _ _) :=
rfl
#align matrix.to_euclidean_lin_eq_to_lin Matrix.toEuclideanLin_eq_toLin
+-/
end Matrix
--- mathport name: «expr⟪ , ⟫ₑ»
local notation "⟪" x ", " y "⟫ₑ" => @inner 𝕜 _ _ ((PiLp.equiv 2 _).symm x) ((PiLp.equiv 2 _).symm y)
#print inner_matrix_row_row /-
@@ -1035,11 +1175,13 @@ theorem inner_matrix_row_row [Fintype n] (A B : Matrix m n 𝕜) (i j : m) :
#align inner_matrix_row_row inner_matrix_row_row
-/
+#print inner_matrix_col_col /-
/-- The inner product of a column of `A` and a column of `B` is an entry of `Aᴴ ⬝ B`. -/
theorem inner_matrix_col_col [Fintype m] (A B : Matrix m n 𝕜) (i j : n) :
⟪Aᵀ i, Bᵀ j⟫ₑ = (Aᴴ ⬝ B) i j :=
rfl
#align inner_matrix_col_col inner_matrix_col_col
+-/
end Matrix
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3e83f0fa4391c8740f7d773a7a9b74e311ae2a3
@@ -101,10 +101,10 @@ instance PiLp.innerProductSpace {ι : Type _} [Fintype ι] (f : ι → Type _)
rintro z -
apply inner_conj_symm
add_left x y z :=
- show (∑ i, inner (x i + y i) (z i)) = (∑ i, inner (x i) (z i)) + ∑ i, inner (y i) (z i) by
+ show ∑ i, inner (x i + y i) (z i) = ∑ i, inner (x i) (z i) + ∑ i, inner (y i) (z i) by
simp only [inner_add_left, Finset.sum_add_distrib]
smul_left x y r :=
- show (∑ i : ι, inner (r • x i) (y i)) = conj r * ∑ i, inner (x i) (y i) by
+ show ∑ i : ι, inner (r • x i) (y i) = conj r * ∑ i, inner (x i) (y i) by
simp only [Finset.mul_sum, inner_smul_left]
#align pi_Lp.inner_product_space PiLp.innerProductSpace
@@ -428,16 +428,16 @@ protected theorem coe_toBasis_repr_apply (b : OrthonormalBasis ι 𝕜 E) (x : E
LinearIsometryEquiv.coe_toLinearEquiv]
#align orthonormal_basis.coe_to_basis_repr_apply OrthonormalBasis.coe_toBasis_repr_apply
-protected theorem sum_repr (b : OrthonormalBasis ι 𝕜 E) (x : E) : (∑ i, b.repr x i • b i) = x := by
+protected theorem sum_repr (b : OrthonormalBasis ι 𝕜 E) (x : E) : ∑ i, b.repr x i • b i = x := by
simp_rw [← b.coe_to_basis_repr_apply, ← b.coe_to_basis]; exact b.to_basis.sum_repr x
#align orthonormal_basis.sum_repr OrthonormalBasis.sum_repr
protected theorem sum_repr_symm (b : OrthonormalBasis ι 𝕜 E) (v : EuclideanSpace 𝕜 ι) :
- (∑ i, v i • b i) = b.repr.symm v := by simpa using (b.to_basis.equiv_fun_symm_apply v).symm
+ ∑ i, v i • b i = b.repr.symm v := by simpa using (b.to_basis.equiv_fun_symm_apply v).symm
#align orthonormal_basis.sum_repr_symm OrthonormalBasis.sum_repr_symm
protected theorem sum_inner_mul_inner (b : OrthonormalBasis ι 𝕜 E) (x y : E) :
- (∑ i, ⟪x, b i⟫ * ⟪b i, y⟫) = ⟪x, y⟫ :=
+ ∑ i, ⟪x, b i⟫ * ⟪b i, y⟫ = ⟪x, y⟫ :=
by
have := congr_arg (innerSL 𝕜 x) (b.sum_repr y)
rw [map_sum] at this
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -517,7 +517,6 @@ theorem Basis.coe_toOrthonormalBasis (v : Basis ι 𝕜 E) (hv : Orthonormal
(v.toOrthonormalBasis hv : ι → E) = ((v.toOrthonormalBasis hv).toBasis : ι → E) := by
classical rw [OrthonormalBasis.coe_toBasis]
_ = (v : ι → E) := by simp
-
#align basis.coe_to_orthonormal_basis Basis.coe_toOrthonormalBasis
variable {v : ι → E}
@@ -926,7 +925,6 @@ noncomputable def LinearIsometry.extend (L : S →ₗᵢ[𝕜] V) : V →ₗᵢ[
simp only [← LS.finrank_add_finrank_orthogonal, add_tsub_cancel_left]
_ = finrank 𝕜 V - finrank 𝕜 S := by simp only [LinearMap.finrank_range_of_inj L.injective]
_ = finrank 𝕜 Sᗮ := by simp only [← S.finrank_add_finrank_orthogonal, add_tsub_cancel_left]
-
exact
(stdOrthonormalBasis 𝕜 Sᗮ).repr.trans
((stdOrthonormalBasis 𝕜 LSᗮ).reindex <| finCongr dim_LS_perp).repr.symm
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -212,11 +212,11 @@ theorem DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply [DecidableE
(hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) (w : PiLp 2 fun i => V i) :
(hV.isometryL2OfOrthogonalFamily hV').symm w = ∑ i, (w i : E) := by
classical
- let e₁ := DirectSum.linearEquivFunOnFintype 𝕜 ι fun i => V i
- let e₂ := LinearEquiv.ofBijective (DirectSum.coeLinearMap V) hV
- suffices ∀ v : ⨁ i, V i, e₂ v = ∑ i, e₁ v i by exact this (e₁.symm w)
- intro v
- simp [e₂, DirectSum.coeLinearMap, DirectSum.toModule, Dfinsupp.sumAddHom_apply]
+ let e₁ := DirectSum.linearEquivFunOnFintype 𝕜 ι fun i => V i
+ let e₂ := LinearEquiv.ofBijective (DirectSum.coeLinearMap V) hV
+ suffices ∀ v : ⨁ i, V i, e₂ v = ∑ i, e₁ v i by exact this (e₁.symm w)
+ intro v
+ simp [e₂, DirectSum.coeLinearMap, DirectSum.toModule, Dfinsupp.sumAddHom_apply]
#align direct_sum.is_internal.isometry_L2_of_orthogonal_family_symm_apply DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply
end
@@ -372,8 +372,8 @@ theorem coe_ofRepr [DecidableEq ι] (e : E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜
protected theorem repr_symm_single [DecidableEq ι] (b : OrthonormalBasis ι 𝕜 E) (i : ι) :
b.repr.symm (EuclideanSpace.single i (1 : 𝕜)) = b i := by
classical
- congr
- simp
+ congr
+ simp
#align orthonormal_basis.repr_symm_single OrthonormalBasis.repr_symm_single
@[simp]
@@ -385,17 +385,17 @@ protected theorem repr_self [DecidableEq ι] (b : OrthonormalBasis ι 𝕜 E) (i
protected theorem repr_apply_apply (b : OrthonormalBasis ι 𝕜 E) (v : E) (i : ι) :
b.repr v i = ⟪b i, v⟫ := by
classical
- rw [← b.repr.inner_map_map (b i) v, b.repr_self i, EuclideanSpace.inner_single_left]
- simp only [one_mul, eq_self_iff_true, map_one]
+ rw [← b.repr.inner_map_map (b i) v, b.repr_self i, EuclideanSpace.inner_single_left]
+ simp only [one_mul, eq_self_iff_true, map_one]
#align orthonormal_basis.repr_apply_apply OrthonormalBasis.repr_apply_apply
@[simp]
protected theorem orthonormal (b : OrthonormalBasis ι 𝕜 E) : Orthonormal 𝕜 b := by
classical
- rw [orthonormal_iff_ite]
- intro i j
- rw [← b.repr.inner_map_map (b i) (b j), b.repr_self i, b.repr_self j,
- EuclideanSpace.inner_single_left, EuclideanSpace.single_apply, map_one, one_mul]
+ rw [orthonormal_iff_ite]
+ intro i j
+ rw [← b.repr.inner_map_map (b i) (b j), b.repr_self i, b.repr_self j,
+ EuclideanSpace.inner_single_left, EuclideanSpace.single_apply, map_one, one_mul]
#align orthonormal_basis.orthonormal OrthonormalBasis.orthonormal
#print OrthonormalBasis.toBasis /-
@@ -411,8 +411,8 @@ protected theorem coe_toBasis (b : OrthonormalBasis ι 𝕜 E) : (⇑b.toBasis :
change ⇑(Basis.ofEquivFun b.repr.to_linear_equiv) = b
ext j
classical
- rw [Basis.coe_ofEquivFun]
- congr
+ rw [Basis.coe_ofEquivFun]
+ congr
#align orthonormal_basis.coe_to_basis OrthonormalBasis.coe_toBasis
@[simp]
@@ -596,11 +596,11 @@ def reindex (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') : OrthonormalBasis
protected theorem reindex_apply (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') (i' : ι') :
(b.reindex e) i' = b (e.symm i') := by
classical
- dsimp [reindex, OrthonormalBasis.hasCoeToFun]
- rw [coe_of_repr]
- dsimp
- rw [← b.repr_symm_single, LinearIsometryEquiv.piLpCongrLeft_symm,
- EuclideanSpace.piLpCongrLeft_single]
+ dsimp [reindex, OrthonormalBasis.hasCoeToFun]
+ rw [coe_of_repr]
+ dsimp
+ rw [← b.repr_symm_single, LinearIsometryEquiv.piLpCongrLeft_symm,
+ EuclideanSpace.piLpCongrLeft_single]
#align orthonormal_basis.reindex_apply OrthonormalBasis.reindex_apply
@[simp]
@@ -702,7 +702,7 @@ theorem OrthonormalBasis.det_to_matrix_orthonormalBasis : ‖a.toBasis.det b‖
have : (norm_sq (a.to_basis.det b) : 𝕜) = 1 := by
simpa [IsROrC.mul_conj] using
(Matrix.det_of_mem_unitary (a.to_matrix_orthonormal_basis_mem_unitary b)).2
- norm_cast at this
+ norm_cast at this
rwa [← sqrt_norm_sq_eq_norm, sqrt_eq_one]
#align orthonormal_basis.det_to_matrix_orthonormal_basis OrthonormalBasis.det_to_matrix_orthonormalBasis
@@ -847,8 +847,8 @@ variable {n : ℕ} (hn : finrank 𝕜 E = n) [DecidableEq ι] {V : ι → Submod
/-- Exhibit a bijection between `fin n` and the index set of a certain basis of an `n`-dimensional
inner product space `E`. This should not be accessed directly, but only via the subsequent API. -/
irreducible_def DirectSum.IsInternal.sigmaOrthonormalBasisIndexEquiv
- (hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) :
- (Σ i, Fin (finrank 𝕜 (V i))) ≃ Fin n :=
+ (hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) :
+ (Σ i, Fin (finrank 𝕜 (V i))) ≃ Fin n :=
let b := hV.collectedOrthonormalBasis hV' fun i => stdOrthonormalBasis 𝕜 (V i)
Fintype.equivFinOfCardEq <| (FiniteDimensional.finrank_eq_card_basis b.toBasis).symm.trans hn
#align direct_sum.is_internal.sigma_orthonormal_basis_index_equiv DirectSum.IsInternal.sigmaOrthonormalBasisIndexEquiv
@@ -858,8 +858,8 @@ irreducible_def DirectSum.IsInternal.sigmaOrthonormalBasisIndexEquiv
/-- An `n`-dimensional `inner_product_space` equipped with a decomposition as an internal direct
sum has an orthonormal basis indexed by `fin n` and subordinate to that direct sum. -/
irreducible_def DirectSum.IsInternal.subordinateOrthonormalBasis
- (hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) :
- OrthonormalBasis (Fin n) 𝕜 E :=
+ (hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) :
+ OrthonormalBasis (Fin n) 𝕜 E :=
(hV.collectedOrthonormalBasis hV' fun i => stdOrthonormalBasis 𝕜 (V i)).reindex
(hV.sigmaOrthonormalBasisIndexEquiv hn hV')
#align direct_sum.is_internal.subordinate_orthonormal_basis DirectSum.IsInternal.subordinateOrthonormalBasis
@@ -870,7 +870,7 @@ irreducible_def DirectSum.IsInternal.subordinateOrthonormalBasis
sum has an orthonormal basis indexed by `fin n` and subordinate to that direct sum. This function
provides the mapping by which it is subordinate. -/
irreducible_def DirectSum.IsInternal.subordinateOrthonormalBasisIndex (a : Fin n)
- (hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) : ι :=
+ (hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) : ι :=
((hV.sigmaOrthonormalBasisIndexEquiv hn hV').symm a).1
#align direct_sum.is_internal.subordinate_orthonormal_basis_index DirectSum.IsInternal.subordinateOrthonormalBasisIndex
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -440,7 +440,7 @@ protected theorem sum_inner_mul_inner (b : OrthonormalBasis ι 𝕜 E) (x y : E)
(∑ i, ⟪x, b i⟫ * ⟪b i, y⟫) = ⟪x, y⟫ :=
by
have := congr_arg (innerSL 𝕜 x) (b.sum_repr y)
- rw [map_sum] at this
+ rw [map_sum] at this
convert this
ext i
rw [SMulHomClass.map_smul, b.repr_apply_apply, mul_comm]
@@ -575,7 +575,7 @@ protected def mkOfOrthogonalEqBot (hon : Orthonormal 𝕜 v) (hsp : (span 𝕜 (
haveI : FiniteDimensional 𝕜 (span 𝕜 (range v)) :=
FiniteDimensional.span_of_finite 𝕜 (finite_range v)
haveI : CompleteSpace (span 𝕜 (range v)) := FiniteDimensional.complete 𝕜 _
- rwa [orthogonal_eq_bot_iff] at hsp)
+ rwa [orthogonal_eq_bot_iff] at hsp )
#align orthonormal_basis.mk_of_orthogonal_eq_bot OrthonormalBasis.mkOfOrthogonalEqBot
@[simp]
@@ -702,7 +702,7 @@ theorem OrthonormalBasis.det_to_matrix_orthonormalBasis : ‖a.toBasis.det b‖
have : (norm_sq (a.to_basis.det b) : 𝕜) = 1 := by
simpa [IsROrC.mul_conj] using
(Matrix.det_of_mem_unitary (a.to_matrix_orthonormal_basis_mem_unitary b)).2
- norm_cast at this
+ norm_cast at this
rwa [← sqrt_norm_sq_eq_norm, sqrt_eq_one]
#align orthonormal_basis.det_to_matrix_orthonormal_basis OrthonormalBasis.det_to_matrix_orthonormalBasis
@@ -746,7 +746,7 @@ orthonormal basis for `M`. -/
noncomputable def DirectSum.IsInternal.collectedOrthonormalBasis
(hV : OrthogonalFamily 𝕜 (fun i => A i) fun i => (A i).subtypeₗᵢ) [DecidableEq ι]
(hV_sum : DirectSum.IsInternal fun i => A i) {α : ι → Type _} [∀ i, Fintype (α i)]
- (v_family : ∀ i, OrthonormalBasis (α i) 𝕜 (A i)) : OrthonormalBasis (Σi, α i) 𝕜 E :=
+ (v_family : ∀ i, OrthonormalBasis (α i) 𝕜 (A i)) : OrthonormalBasis (Σ i, α i) 𝕜 E :=
(hV_sum.collectedBasis fun i => (v_family i).toBasis).toOrthonormalBasis <| by
simpa using
hV.orthonormal_sigma_orthonormal (show ∀ i, Orthonormal 𝕜 (v_family i).toBasis by simp)
@@ -756,7 +756,7 @@ noncomputable def DirectSum.IsInternal.collectedOrthonormalBasis
theorem DirectSum.IsInternal.collectedOrthonormalBasis_mem [DecidableEq ι]
(h : DirectSum.IsInternal A) {α : ι → Type _} [∀ i, Fintype (α i)]
(hV : OrthogonalFamily 𝕜 (fun i => A i) fun i => (A i).subtypeₗᵢ)
- (v : ∀ i, OrthonormalBasis (α i) 𝕜 (A i)) (a : Σi, α i) :
+ (v : ∀ i, OrthonormalBasis (α i) 𝕜 (A i)) (a : Σ i, α i) :
h.collectedOrthonormalBasis hV v a ∈ A a.1 := by
simp [DirectSum.IsInternal.collectedOrthonormalBasis]
#align direct_sum.is_internal.collected_orthonormal_basis_mem DirectSum.IsInternal.collectedOrthonormalBasis_mem
@@ -766,10 +766,10 @@ variable [FiniteDimensional 𝕜 E]
/-- In a finite-dimensional `inner_product_space`, any orthonormal subset can be extended to an
orthonormal basis. -/
theorem Orthonormal.exists_orthonormalBasis_extension (hv : Orthonormal 𝕜 (coe : v → E)) :
- ∃ (u : Finset E)(b : OrthonormalBasis u 𝕜 E), v ⊆ u ∧ ⇑b = coe :=
+ ∃ (u : Finset E) (b : OrthonormalBasis u 𝕜 E), v ⊆ u ∧ ⇑b = coe :=
by
obtain ⟨u₀, hu₀s, hu₀, hu₀_max⟩ := exists_maximal_orthonormal hv
- rw [maximal_orthonormal_iff_orthogonalComplement_eq_bot hu₀] at hu₀_max
+ rw [maximal_orthonormal_iff_orthogonalComplement_eq_bot hu₀] at hu₀_max
have hu₀_finite : u₀.finite := hu₀.linear_independent.finite
let u : Finset E := hu₀_finite.to_finset
let fu : ↥u ≃ ↥u₀ := Equiv.cast (congr_arg coeSort hu₀_finite.coe_to_finset)
@@ -807,7 +807,7 @@ variable (𝕜 E)
/-- A finite-dimensional inner product space admits an orthonormal basis. -/
theorem exists_orthonormalBasis :
- ∃ (w : Finset E)(b : OrthonormalBasis w 𝕜 E), ⇑b = (coe : w → E) :=
+ ∃ (w : Finset E) (b : OrthonormalBasis w 𝕜 E), ⇑b = (coe : w → E) :=
let ⟨w, hw, hw', hw''⟩ := (orthonormal_empty 𝕜 E).exists_orthonormalBasis_extension
⟨w, hw, hw''⟩
#align exists_orthonormal_basis exists_orthonormalBasis
@@ -830,7 +830,7 @@ theorem orthonormalBasis_one_dim (b : OrthonormalBasis ι ℝ ℝ) :
have : b default = 1 ∨ b default = -1 :=
by
have : ‖b default‖ = 1 := b.orthonormal.1 _
- rwa [Real.norm_eq_abs, abs_eq (zero_le_one : (0 : ℝ) ≤ 1)] at this
+ rwa [Real.norm_eq_abs, abs_eq (zero_le_one : (0 : ℝ) ≤ 1)] at this
rw [eq_const_of_unique b]
refine' this.imp _ _ <;> simp
#align orthonormal_basis_one_dim orthonormalBasis_one_dim
@@ -848,7 +848,7 @@ variable {n : ℕ} (hn : finrank 𝕜 E = n) [DecidableEq ι] {V : ι → Submod
inner product space `E`. This should not be accessed directly, but only via the subsequent API. -/
irreducible_def DirectSum.IsInternal.sigmaOrthonormalBasisIndexEquiv
(hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) :
- (Σi, Fin (finrank 𝕜 (V i))) ≃ Fin n :=
+ (Σ i, Fin (finrank 𝕜 (V i))) ≃ Fin n :=
let b := hV.collectedOrthonormalBasis hV' fun i => stdOrthonormalBasis 𝕜 (V i)
Fintype.equivFinOfCardEq <| (FiniteDimensional.finrank_eq_card_basis b.toBasis).symm.trans hn
#align direct_sum.is_internal.sigma_orthonormal_basis_index_equiv DirectSum.IsInternal.sigmaOrthonormalBasisIndexEquiv
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Myers, Sébastien Gouëzel, Heather Macbeth
! This file was ported from Lean 3 source module analysis.inner_product_space.pi_L2
-! leanprover-community/mathlib commit 13bce9a6b6c44f6b4c91ac1c1d2a816e2533d395
+! leanprover-community/mathlib commit f60c6087a7275b72d5db3c5a1d0e19e35a429c0a
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -16,6 +16,9 @@ import Mathbin.LinearAlgebra.UnitaryGroup
/-!
# `L²` inner product space structure on finite products of inner product spaces
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
The `L²` norm on a finite product of inner product spaces is compatible with an inner product
$$
\langle x, y\rangle = \sum \langle x_i, y_i \rangle.
@@ -111,12 +114,14 @@ theorem PiLp.inner_apply {ι : Type _} [Fintype ι] {f : ι → Type _} [∀ i,
rfl
#align pi_Lp.inner_apply PiLp.inner_apply
+#print EuclideanSpace /-
/-- The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
space use `euclidean_space 𝕜 (fin n)`. -/
@[reducible, nolint unused_arguments]
def EuclideanSpace (𝕜 : Type _) [IsROrC 𝕜] (n : Type _) [Fintype n] : Type _ :=
PiLp 2 fun i : n => 𝕜
#align euclidean_space EuclideanSpace
+-/
theorem EuclideanSpace.nnnorm_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
(x : EuclideanSpace 𝕜 n) : ‖x‖₊ = NNReal.sqrt (∑ i, ‖x i‖₊ ^ 2) :=
@@ -153,24 +158,32 @@ instance : FiniteDimensional 𝕜 (EuclideanSpace 𝕜 ι) := by infer_instance
instance : InnerProductSpace 𝕜 (EuclideanSpace 𝕜 ι) := by infer_instance
+#print finrank_euclideanSpace /-
@[simp]
theorem finrank_euclideanSpace :
FiniteDimensional.finrank 𝕜 (EuclideanSpace 𝕜 ι) = Fintype.card ι := by simp
#align finrank_euclidean_space finrank_euclideanSpace
+-/
+#print finrank_euclideanSpace_fin /-
theorem finrank_euclideanSpace_fin {n : ℕ} :
FiniteDimensional.finrank 𝕜 (EuclideanSpace 𝕜 (Fin n)) = n := by simp
#align finrank_euclidean_space_fin finrank_euclideanSpace_fin
+-/
+#print EuclideanSpace.inner_eq_star_dotProduct /-
theorem EuclideanSpace.inner_eq_star_dotProduct (x y : EuclideanSpace 𝕜 ι) :
⟪x, y⟫ = Matrix.dotProduct (star <| PiLp.equiv _ _ x) (PiLp.equiv _ _ y) :=
rfl
#align euclidean_space.inner_eq_star_dot_product EuclideanSpace.inner_eq_star_dotProduct
+-/
+#print EuclideanSpace.inner_piLp_equiv_symm /-
theorem EuclideanSpace.inner_piLp_equiv_symm (x y : ι → 𝕜) :
⟪(PiLp.equiv 2 _).symm x, (PiLp.equiv 2 _).symm y⟫ = Matrix.dotProduct (star x) y :=
rfl
#align euclidean_space.inner_pi_Lp_equiv_symm EuclideanSpace.inner_piLp_equiv_symm
+-/
/-- A finite, mutually orthogonal family of subspaces of `E`, which span `E`, induce an isometry
from `E` to `pi_Lp 2` of the subspaces equipped with the `L2` inner product. -/
@@ -210,6 +223,7 @@ end
variable (ι 𝕜)
+#print EuclideanSpace.equiv /-
-- TODO : This should be generalized to `pi_Lp` with finite dimensional factors.
/-- `pi_Lp.linear_equiv` upgraded to a continuous linear map between `euclidean_space 𝕜 ι`
and `ι → 𝕜`. -/
@@ -217,16 +231,20 @@ and `ι → 𝕜`. -/
def EuclideanSpace.equiv : EuclideanSpace 𝕜 ι ≃L[𝕜] ι → 𝕜 :=
(PiLp.linearEquiv 2 𝕜 fun i : ι => 𝕜).toContinuousLinearEquiv
#align euclidean_space.equiv EuclideanSpace.equiv
+-/
variable {ι 𝕜}
+#print EuclideanSpace.projₗ /-
-- TODO : This should be generalized to `pi_Lp`.
/-- The projection on the `i`-th coordinate of `euclidean_space 𝕜 ι`, as a linear map. -/
@[simps]
def EuclideanSpace.projₗ (i : ι) : EuclideanSpace 𝕜 ι →ₗ[𝕜] 𝕜 :=
(LinearMap.proj i).comp (PiLp.linearEquiv 2 𝕜 fun i : ι => 𝕜 : EuclideanSpace 𝕜 ι →ₗ[𝕜] ι → 𝕜)
#align euclidean_space.projₗ EuclideanSpace.projₗ
+-/
+#print EuclideanSpace.proj /-
-- TODO : This should be generalized to `pi_Lp`.
/-- The projection on the `i`-th coordinate of `euclidean_space 𝕜 ι`,
as a continuous linear map. -/
@@ -234,13 +252,16 @@ as a continuous linear map. -/
def EuclideanSpace.proj (i : ι) : EuclideanSpace 𝕜 ι →L[𝕜] 𝕜 :=
⟨EuclideanSpace.projₗ i, continuous_apply i⟩
#align euclidean_space.proj EuclideanSpace.proj
+-/
+#print EuclideanSpace.single /-
-- TODO : This should be generalized to `pi_Lp`.
/-- The vector given in euclidean space by being `1 : 𝕜` at coordinate `i : ι` and `0 : 𝕜` at
all other coordinates. -/
def EuclideanSpace.single [DecidableEq ι] (i : ι) (a : 𝕜) : EuclideanSpace 𝕜 ι :=
(PiLp.equiv _ _).symm (Pi.single i a)
#align euclidean_space.single EuclideanSpace.single
+-/
@[simp]
theorem PiLp.equiv_single [DecidableEq ι] (i : ι) (a : 𝕜) :
@@ -317,33 +338,35 @@ theorem EuclideanSpace.piLpCongrLeft_single [DecidableEq ι] {ι' : Type _} [Fin
variable (ι 𝕜 E)
+#print OrthonormalBasis /-
/-- An orthonormal basis on E is an identification of `E` with its dimensional-matching
`euclidean_space 𝕜 ι`. -/
structure OrthonormalBasis where ofRepr ::
repr : E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜 ι
#align orthonormal_basis OrthonormalBasis
+-/
variable {ι 𝕜 E}
namespace OrthonormalBasis
instance : Inhabited (OrthonormalBasis ι 𝕜 (EuclideanSpace 𝕜 ι)) :=
- ⟨of_repr (LinearIsometryEquiv.refl 𝕜 (EuclideanSpace 𝕜 ι))⟩
+ ⟨ofRepr (LinearIsometryEquiv.refl 𝕜 (EuclideanSpace 𝕜 ι))⟩
/-- `b i` is the `i`th basis vector. -/
instance : CoeFun (OrthonormalBasis ι 𝕜 E) fun _ => ι → E
where coe b i := by classical exact b.repr.symm (EuclideanSpace.single i (1 : 𝕜))
@[simp]
-theorem coe_of_repr [DecidableEq ι] (e : E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜 ι) :
- ⇑(OrthonormalBasis.of_repr e) = fun i => e.symm (EuclideanSpace.single i (1 : 𝕜)) :=
+theorem coe_ofRepr [DecidableEq ι] (e : E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜 ι) :
+ ⇑(OrthonormalBasis.ofRepr e) = fun i => e.symm (EuclideanSpace.single i (1 : 𝕜)) :=
by
rw [coeFn]
unfold CoeFun.coe
funext
congr
simp only [eq_iff_true_of_subsingleton]
-#align orthonormal_basis.coe_of_repr OrthonormalBasis.coe_of_repr
+#align orthonormal_basis.coe_of_repr OrthonormalBasis.coe_ofRepr
@[simp]
protected theorem repr_symm_single [DecidableEq ι] (b : OrthonormalBasis ι 𝕜 E) (i : ι) :
@@ -375,10 +398,12 @@ protected theorem orthonormal (b : OrthonormalBasis ι 𝕜 E) : Orthonormal
EuclideanSpace.inner_single_left, EuclideanSpace.single_apply, map_one, one_mul]
#align orthonormal_basis.orthonormal OrthonormalBasis.orthonormal
+#print OrthonormalBasis.toBasis /-
/-- The `basis ι 𝕜 E` underlying the `orthonormal_basis` -/
protected def toBasis (b : OrthonormalBasis ι 𝕜 E) : Basis ι 𝕜 E :=
Basis.ofEquivFun b.repr.toLinearEquiv
#align orthonormal_basis.to_basis OrthonormalBasis.toBasis
+-/
@[simp]
protected theorem coe_toBasis (b : OrthonormalBasis ι 𝕜 E) : (⇑b.toBasis : ι → E) = ⇑b :=
@@ -429,11 +454,13 @@ protected theorem orthogonalProjection_eq_sum {U : Submodule 𝕜 E} [CompleteSp
(b.sum_repr (orthogonalProjection U x)).symm
#align orthonormal_basis.orthogonal_projection_eq_sum OrthonormalBasis.orthogonalProjection_eq_sum
+#print OrthonormalBasis.map /-
/-- Mapping an orthonormal basis along a `linear_isometry_equiv`. -/
protected def map {G : Type _} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
(b : OrthonormalBasis ι 𝕜 E) (L : E ≃ₗᵢ[𝕜] G) : OrthonormalBasis ι 𝕜 G
where repr := L.symm.trans b.repr
#align orthonormal_basis.map OrthonormalBasis.map
+-/
@[simp]
protected theorem map_apply {G : Type _} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
@@ -448,9 +475,10 @@ protected theorem toBasis_map {G : Type _} [NormedAddCommGroup G] [InnerProductS
rfl
#align orthonormal_basis.to_basis_map OrthonormalBasis.toBasis_map
+#print Basis.toOrthonormalBasis /-
/-- A basis that is orthonormal is an orthonormal basis. -/
def Basis.toOrthonormalBasis (v : Basis ι 𝕜 E) (hv : Orthonormal 𝕜 v) : OrthonormalBasis ι 𝕜 E :=
- OrthonormalBasis.of_repr <|
+ OrthonormalBasis.ofRepr <|
LinearEquiv.isometryOfInner v.equivFun
(by
intro x y
@@ -462,6 +490,7 @@ def Basis.toOrthonormalBasis (v : Basis ι 𝕜 E) (hv : Orthonormal 𝕜 v) : O
· rw [← v.equiv_fun.symm_apply_apply x, v.equiv_fun_symm_apply]
· rw [← v.equiv_fun.symm_apply_apply y, v.equiv_fun_symm_apply])
#align basis.to_orthonormal_basis Basis.toOrthonormalBasis
+-/
@[simp]
theorem Basis.coe_toOrthonormalBasis_repr (v : Basis ι 𝕜 E) (hv : Orthonormal 𝕜 v) :
@@ -505,6 +534,7 @@ protected theorem coe_mk (hon : Orthonormal 𝕜 v) (hsp : ⊤ ≤ Submodule.spa
classical rw [OrthonormalBasis.mk, _root_.basis.coe_to_orthonormal_basis, Basis.coe_mk]
#align orthonormal_basis.coe_mk OrthonormalBasis.coe_mk
+#print OrthonormalBasis.span /-
/-- Any finite subset of a orthonormal family is an `orthonormal_basis` for its span. -/
protected def span [DecidableEq E] {v' : ι' → E} (h : Orthonormal 𝕜 v') (s : Finset ι') :
OrthonormalBasis s 𝕜 (span 𝕜 (s.image v' : Set E)) :=
@@ -524,6 +554,7 @@ protected def span [DecidableEq E] {v' : ι' → E} (h : Orthonormal 𝕜 v') (s
rfl)
e₀.map φ.symm
#align orthonormal_basis.span OrthonormalBasis.span
+-/
@[simp]
protected theorem span_apply [DecidableEq E] {v' : ι' → E} (h : Orthonormal 𝕜 v') (s : Finset ι')
@@ -555,10 +586,12 @@ protected theorem coe_of_orthogonal_eq_bot_mk (hon : Orthonormal 𝕜 v)
variable [Fintype ι']
+#print OrthonormalBasis.reindex /-
/-- `b.reindex (e : ι ≃ ι')` is an `orthonormal_basis` indexed by `ι'` -/
def reindex (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') : OrthonormalBasis ι' 𝕜 E :=
- OrthonormalBasis.of_repr (b.repr.trans (LinearIsometryEquiv.piLpCongrLeft 2 𝕜 𝕜 e))
+ OrthonormalBasis.ofRepr (b.repr.trans (LinearIsometryEquiv.piLpCongrLeft 2 𝕜 𝕜 e))
#align orthonormal_basis.reindex OrthonormalBasis.reindex
+-/
protected theorem reindex_apply (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι') (i' : ι') :
(b.reindex e) i' = b (e.symm i') := by
@@ -706,6 +739,7 @@ variable {v : Set E}
variable {A : ι → Submodule 𝕜 E}
+#print DirectSum.IsInternal.collectedOrthonormalBasis /-
/-- Given an internal direct sum decomposition of a module `M`, and an orthonormal basis for each
of the components of the direct sum, the disjoint union of these orthonormal bases is an
orthonormal basis for `M`. -/
@@ -717,6 +751,7 @@ noncomputable def DirectSum.IsInternal.collectedOrthonormalBasis
simpa using
hV.orthonormal_sigma_orthonormal (show ∀ i, Orthonormal 𝕜 (v_family i).toBasis by simp)
#align direct_sum.is_internal.collected_orthonormal_basis DirectSum.IsInternal.collectedOrthonormalBasis
+-/
theorem DirectSum.IsInternal.collectedOrthonormalBasis_mem [DecidableEq ι]
(h : DirectSum.IsInternal A) {α : ι → Type _} [∀ i, Fintype (α i)]
@@ -777,6 +812,7 @@ theorem exists_orthonormalBasis :
⟨w, hw, hw''⟩
#align exists_orthonormal_basis exists_orthonormalBasis
+#print stdOrthonormalBasis /-
/-- A finite-dimensional `inner_product_space` has an orthonormal basis. -/
irreducible_def stdOrthonormalBasis : OrthonormalBasis (Fin (finrank 𝕜 E)) 𝕜 E :=
by
@@ -784,6 +820,7 @@ irreducible_def stdOrthonormalBasis : OrthonormalBasis (Fin (finrank 𝕜 E))
rw [finrank_eq_card_basis b.to_basis]
exact b.reindex (Fintype.equivFinOfCardEq rfl)
#align std_orthonormal_basis stdOrthonormalBasis
+-/
/-- An orthonormal basis of `ℝ` is made either of the vector `1`, or of the vector `-1`. -/
theorem orthonormalBasis_one_dim (b : OrthonormalBasis ι ℝ ℝ) :
@@ -806,6 +843,7 @@ open DirectSum
variable {n : ℕ} (hn : finrank 𝕜 E = n) [DecidableEq ι] {V : ι → Submodule 𝕜 E} (hV : IsInternal V)
+#print DirectSum.IsInternal.sigmaOrthonormalBasisIndexEquiv /-
/-- Exhibit a bijection between `fin n` and the index set of a certain basis of an `n`-dimensional
inner product space `E`. This should not be accessed directly, but only via the subsequent API. -/
irreducible_def DirectSum.IsInternal.sigmaOrthonormalBasisIndexEquiv
@@ -814,7 +852,9 @@ irreducible_def DirectSum.IsInternal.sigmaOrthonormalBasisIndexEquiv
let b := hV.collectedOrthonormalBasis hV' fun i => stdOrthonormalBasis 𝕜 (V i)
Fintype.equivFinOfCardEq <| (FiniteDimensional.finrank_eq_card_basis b.toBasis).symm.trans hn
#align direct_sum.is_internal.sigma_orthonormal_basis_index_equiv DirectSum.IsInternal.sigmaOrthonormalBasisIndexEquiv
+-/
+#print DirectSum.IsInternal.subordinateOrthonormalBasis /-
/-- An `n`-dimensional `inner_product_space` equipped with a decomposition as an internal direct
sum has an orthonormal basis indexed by `fin n` and subordinate to that direct sum. -/
irreducible_def DirectSum.IsInternal.subordinateOrthonormalBasis
@@ -823,7 +863,9 @@ irreducible_def DirectSum.IsInternal.subordinateOrthonormalBasis
(hV.collectedOrthonormalBasis hV' fun i => stdOrthonormalBasis 𝕜 (V i)).reindex
(hV.sigmaOrthonormalBasisIndexEquiv hn hV')
#align direct_sum.is_internal.subordinate_orthonormal_basis DirectSum.IsInternal.subordinateOrthonormalBasis
+-/
+#print DirectSum.IsInternal.subordinateOrthonormalBasisIndex /-
/-- An `n`-dimensional `inner_product_space` equipped with a decomposition as an internal direct
sum has an orthonormal basis indexed by `fin n` and subordinate to that direct sum. This function
provides the mapping by which it is subordinate. -/
@@ -831,6 +873,7 @@ irreducible_def DirectSum.IsInternal.subordinateOrthonormalBasisIndex (a : Fin n
(hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) : ι :=
((hV.sigmaOrthonormalBasisIndexEquiv hn hV').symm a).1
#align direct_sum.is_internal.subordinate_orthonormal_basis_index DirectSum.IsInternal.subordinateOrthonormalBasisIndex
+-/
/-- The basis constructed in `orthogonal_family.subordinate_orthonormal_basis` is subordinate to
the `orthogonal_family` in question. -/
@@ -865,6 +908,7 @@ variable {S : Submodule 𝕜 V} {L : S →ₗᵢ[𝕜] V}
open FiniteDimensional
+#print LinearIsometry.extend /-
/-- Let `S` be a subspace of a finite-dimensional complex inner product space `V`. A linear
isometry mapping `S` into `V` can be extended to a full isometry of `V`.
@@ -916,18 +960,20 @@ noncomputable def LinearIsometry.extend (L : S →ₗᵢ[𝕜] V) : V →ₗᵢ[
rw [← sq_eq_sq (norm_nonneg _) (norm_nonneg _), norm_sq_eq_add_norm_sq_projection x S]
simp only [sq, Mx_decomp]
rw [norm_add_sq_eq_norm_sq_add_norm_sq_of_inner_eq_zero (L (p1 x)) (L3 (p2 x)) Mx_orth]
- simp only [LinearIsometry.norm_map, p1, p2, [anonymous], add_left_inj, mul_eq_mul_left_iff,
- norm_eq_zero, true_or_iff, eq_self_iff_true, ContinuousLinearMap.coe_coe, Submodule.coe_norm,
- Submodule.coe_eq_zero]
+ simp only [LinearIsometry.norm_map, p1, p2, ContinuousLinearMap.toLinearMap_eq_coe,
+ add_left_inj, mul_eq_mul_left_iff, norm_eq_zero, true_or_iff, eq_self_iff_true,
+ ContinuousLinearMap.coe_coe, Submodule.coe_norm, Submodule.coe_eq_zero]
exact
{ toLinearMap := M
norm_map' := M_norm_map }
#align linear_isometry.extend LinearIsometry.extend
+-/
theorem LinearIsometry.extend_apply (L : S →ₗᵢ[𝕜] V) (s : S) : L.extend s = L s :=
by
haveI : CompleteSpace S := FiniteDimensional.complete 𝕜 S
- simp only [LinearIsometry.extend, [anonymous], ← LinearIsometry.coe_toLinearMap]
+ simp only [LinearIsometry.extend, ContinuousLinearMap.toLinearMap_eq_coe, ←
+ LinearIsometry.coe_toLinearMap]
simp only [add_right_eq_self, LinearIsometry.coe_toLinearMap,
LinearIsometryEquiv.coe_toLinearIsometry, LinearIsometry.coe_comp, Function.comp_apply,
orthogonalProjection_mem_subspace_eq_self, LinearMap.coe_comp, ContinuousLinearMap.coe_coe,
@@ -949,12 +995,14 @@ namespace Matrix
variable [Fintype m] [Fintype n] [DecidableEq n]
+#print Matrix.toEuclideanLin /-
/-- `matrix.to_lin'` adapted for `euclidean_space 𝕜 _`. -/
def toEuclideanLin : Matrix m n 𝕜 ≃ₗ[𝕜] EuclideanSpace 𝕜 n →ₗ[𝕜] EuclideanSpace 𝕜 m :=
Matrix.toLin' ≪≫ₗ
LinearEquiv.arrowCongr (PiLp.linearEquiv _ 𝕜 fun _ : n => 𝕜).symm
(PiLp.linearEquiv _ 𝕜 fun _ : m => 𝕜).symm
#align matrix.to_euclidean_lin Matrix.toEuclideanLin
+-/
@[simp]
theorem toEuclideanLin_piLp_equiv_symm (A : Matrix m n 𝕜) (x : n → 𝕜) :
@@ -980,12 +1028,14 @@ end Matrix
-- mathport name: «expr⟪ , ⟫ₑ»
local notation "⟪" x ", " y "⟫ₑ" => @inner 𝕜 _ _ ((PiLp.equiv 2 _).symm x) ((PiLp.equiv 2 _).symm y)
+#print inner_matrix_row_row /-
/-- The inner product of a row of `A` and a row of `B` is an entry of `B ⬝ Aᴴ`. -/
theorem inner_matrix_row_row [Fintype n] (A B : Matrix m n 𝕜) (i j : m) :
⟪A i, B j⟫ₑ = (B ⬝ Aᴴ) j i := by
simp_rw [EuclideanSpace.inner_piLp_equiv_symm, Matrix.mul_apply', Matrix.dotProduct_comm,
Matrix.conjTranspose_apply, Pi.star_def]
#align inner_matrix_row_row inner_matrix_row_row
+-/
/-- The inner product of a column of `A` and a column of `B` is an entry of `Aᴴ ⬝ B`. -/
theorem inner_matrix_col_col [Fintype m] (A B : Matrix m n 𝕜) (i j : n) :
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -59,7 +59,7 @@ For consequences in infinite dimension (Hilbert bases, etc.), see the file
open Real Set Filter IsROrC Submodule Function
-open BigOperators uniformity Topology NNReal ENNReal ComplexConjugate DirectSum
+open scoped BigOperators uniformity Topology NNReal ENNReal ComplexConjugate DirectSum
noncomputable section
@@ -941,7 +941,7 @@ end LinearIsometry
section Matrix
-open Matrix
+open scoped Matrix
variable {m n : Type _}
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -403,10 +403,8 @@ protected theorem coe_toBasis_repr_apply (b : OrthonormalBasis ι 𝕜 E) (x : E
LinearIsometryEquiv.coe_toLinearEquiv]
#align orthonormal_basis.coe_to_basis_repr_apply OrthonormalBasis.coe_toBasis_repr_apply
-protected theorem sum_repr (b : OrthonormalBasis ι 𝕜 E) (x : E) : (∑ i, b.repr x i • b i) = x :=
- by
- simp_rw [← b.coe_to_basis_repr_apply, ← b.coe_to_basis]
- exact b.to_basis.sum_repr x
+protected theorem sum_repr (b : OrthonormalBasis ι 𝕜 E) (x : E) : (∑ i, b.repr x i • b i) = x := by
+ simp_rw [← b.coe_to_basis_repr_apply, ← b.coe_to_basis]; exact b.to_basis.sum_repr x
#align orthonormal_basis.sum_repr OrthonormalBasis.sum_repr
protected theorem sum_repr_symm (b : OrthonormalBasis ι 𝕜 E) (v : EuclideanSpace 𝕜 ι) :
@@ -740,10 +738,7 @@ theorem Orthonormal.exists_orthonormalBasis_extension (hv : Orthonormal 𝕜 (co
have hu₀_finite : u₀.finite := hu₀.linear_independent.finite
let u : Finset E := hu₀_finite.to_finset
let fu : ↥u ≃ ↥u₀ := Equiv.cast (congr_arg coeSort hu₀_finite.coe_to_finset)
- have hfu : (coe : u → E) = (coe : u₀ → E) ∘ fu :=
- by
- ext
- simp
+ have hfu : (coe : u → E) = (coe : u₀ → E) ∘ fu := by ext; simp
have hu : Orthonormal 𝕜 (coe : u → E) := by simpa [hfu] using hu₀.comp _ fu.injective
refine' ⟨u, OrthonormalBasis.mkOfOrthogonalEqBot hu _, _, _⟩
· simpa using hu₀_max
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -736,7 +736,7 @@ theorem Orthonormal.exists_orthonormalBasis_extension (hv : Orthonormal 𝕜 (co
∃ (u : Finset E)(b : OrthonormalBasis u 𝕜 E), v ⊆ u ∧ ⇑b = coe :=
by
obtain ⟨u₀, hu₀s, hu₀, hu₀_max⟩ := exists_maximal_orthonormal hv
- rw [maximal_orthonormal_iff_orthogonal_complement_eq_bot hu₀] at hu₀_max
+ rw [maximal_orthonormal_iff_orthogonalComplement_eq_bot hu₀] at hu₀_max
have hu₀_finite : u₀.finite := hu₀.linear_independent.finite
let u : Finset E := hu₀_finite.to_finset
let fu : ↥u ≃ ↥u₀ := Equiv.cast (congr_arg coeSort hu₀_finite.coe_to_finset)
@@ -938,8 +938,8 @@ theorem LinearIsometry.extend_apply (L : S →ₗᵢ[𝕜] V) (s : S) : L.extend
orthogonalProjection_mem_subspace_eq_self, LinearMap.coe_comp, ContinuousLinearMap.coe_coe,
Submodule.coeSubtype, LinearMap.add_apply, Submodule.coe_eq_zero,
LinearIsometryEquiv.map_eq_zero_iff, Submodule.coe_subtypeₗᵢ,
- orthogonalProjection_mem_subspace_orthogonal_complement_eq_zero,
- Submodule.orthogonal_orthogonal, Submodule.coe_mem]
+ orthogonalProjection_mem_subspace_orthogonalComplement_eq_zero, Submodule.orthogonal_orthogonal,
+ Submodule.coe_mem]
#align linear_isometry.extend_apply LinearIsometry.extend_apply
end LinearIsometry
mathlib commit https://github.com/leanprover-community/mathlib/commit/ef95945cd48c932c9e034872bd25c3c220d9c946
@@ -299,14 +299,14 @@ theorem EuclideanSpace.edist_single_same [DecidableEq ι] (i : ι) (a b : 𝕜)
#align euclidean_space.edist_single_same EuclideanSpace.edist_single_same
/-- `euclidean_space.single` forms an orthonormal family. -/
-theorem EuclideanSpace.orthonormalSingle [DecidableEq ι] :
+theorem EuclideanSpace.orthonormal_single [DecidableEq ι] :
Orthonormal 𝕜 fun i : ι => EuclideanSpace.single i (1 : 𝕜) :=
by
simp_rw [orthonormal_iff_ite, EuclideanSpace.inner_single_left, map_one, one_mul,
EuclideanSpace.single_apply]
intro i j
rfl
-#align euclidean_space.orthonormal_single EuclideanSpace.orthonormalSingle
+#align euclidean_space.orthonormal_single EuclideanSpace.orthonormal_single
theorem EuclideanSpace.piLpCongrLeft_single [DecidableEq ι] {ι' : Type _} [Fintype ι']
[DecidableEq ι'] (e : ι' ≃ ι) (i' : ι') (v : 𝕜) :
@@ -515,7 +515,7 @@ protected def span [DecidableEq E] {v' : ι' → E} (h : Orthonormal 𝕜 v') (s
let e₀ : OrthonormalBasis s 𝕜 _ :=
OrthonormalBasis.mk
(by
- convert orthonormalSpan (h.comp (coe : s → ι') Subtype.coe_injective)
+ convert orthonormal_span (h.comp (coe : s → ι') Subtype.coe_injective)
ext
simp [e₀', Basis.span_apply])
e₀'.span_eq.ge
@@ -778,7 +778,7 @@ variable (𝕜 E)
/-- A finite-dimensional inner product space admits an orthonormal basis. -/
theorem exists_orthonormalBasis :
∃ (w : Finset E)(b : OrthonormalBasis w 𝕜 E), ⇑b = (coe : w → E) :=
- let ⟨w, hw, hw', hw''⟩ := (orthonormalEmpty 𝕜 E).exists_orthonormalBasis_extension
+ let ⟨w, hw, hw', hw''⟩ := (orthonormal_empty 𝕜 E).exists_orthonormalBasis_extension
⟨w, hw, hw''⟩
#align exists_orthonormal_basis exists_orthonormalBasis
mathlib commit https://github.com/leanprover-community/mathlib/commit/75e7fca56381d056096ce5d05e938f63a6567828
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Myers, Sébastien Gouëzel, Heather Macbeth
! This file was ported from Lean 3 source module analysis.inner_product_space.pi_L2
-! leanprover-community/mathlib commit 8ff51ea9f2f5875755582577883fc99db1cfab88
+! leanprover-community/mathlib commit 13bce9a6b6c44f6b4c91ac1c1d2a816e2533d395
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -393,11 +393,7 @@ protected theorem coe_toBasis (b : OrthonormalBasis ι 𝕜 E) : (⇑b.toBasis :
@[simp]
protected theorem coe_toBasis_repr (b : OrthonormalBasis ι 𝕜 E) :
b.toBasis.equivFun = b.repr.toLinearEquiv :=
- by
- change (Basis.ofEquivFun b.repr.to_linear_equiv).equivFun = b.repr.to_linear_equiv
- ext (x j)
- simp only [Basis.ofEquivFun_repr_apply, LinearIsometryEquiv.coe_toLinearEquiv,
- Basis.equivFun_apply]
+ Basis.equivFun_ofEquivFun _
#align orthonormal_basis.coe_to_basis_repr OrthonormalBasis.coe_toBasis_repr
@[simp]
mathlib commit https://github.com/leanprover-community/mathlib/commit/c89fe2d59ae06402c3f55f978016d1ada444f57e
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Myers, Sébastien Gouëzel, Heather Macbeth
! This file was ported from Lean 3 source module analysis.inner_product_space.pi_L2
-! leanprover-community/mathlib commit 46b633fd842bef9469441c0209906f6dddd2b4f5
+! leanprover-community/mathlib commit 8ff51ea9f2f5875755582577883fc99db1cfab88
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -268,13 +268,51 @@ theorem EuclideanSpace.inner_single_right [DecidableEq ι] (i : ι) (a : 𝕜) (
⟪v, EuclideanSpace.single i (a : 𝕜)⟫ = a * conj (v i) := by simp [apply_ite conj, mul_comm]
#align euclidean_space.inner_single_right EuclideanSpace.inner_single_right
-theorem EuclideanSpace.piLpCongrLeft_single [DecidableEq ι] {ι' : Type _} [Fintype ι']
- [DecidableEq ι'] (e : ι' ≃ ι) (i' : ι') :
- LinearIsometryEquiv.piLpCongrLeft 2 𝕜 𝕜 e (EuclideanSpace.single i' (1 : 𝕜)) =
- EuclideanSpace.single (e i') (1 : 𝕜) :=
+@[simp]
+theorem EuclideanSpace.norm_single [DecidableEq ι] (i : ι) (a : 𝕜) :
+ ‖EuclideanSpace.single i (a : 𝕜)‖ = ‖a‖ :=
+ (PiLp.norm_equiv_symm_single 2 (fun i => 𝕜) i a : _)
+#align euclidean_space.norm_single EuclideanSpace.norm_single
+
+@[simp]
+theorem EuclideanSpace.nnnorm_single [DecidableEq ι] (i : ι) (a : 𝕜) :
+ ‖EuclideanSpace.single i (a : 𝕜)‖₊ = ‖a‖₊ :=
+ (PiLp.nnnorm_equiv_symm_single 2 (fun i => 𝕜) i a : _)
+#align euclidean_space.nnnorm_single EuclideanSpace.nnnorm_single
+
+@[simp]
+theorem EuclideanSpace.dist_single_same [DecidableEq ι] (i : ι) (a b : 𝕜) :
+ dist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = dist a b :=
+ (PiLp.dist_equiv_symm_single_same 2 (fun i => 𝕜) i a b : _)
+#align euclidean_space.dist_single_same EuclideanSpace.dist_single_same
+
+@[simp]
+theorem EuclideanSpace.nndist_single_same [DecidableEq ι] (i : ι) (a b : 𝕜) :
+ nndist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = nndist a b :=
+ (PiLp.nndist_equiv_symm_single_same 2 (fun i => 𝕜) i a b : _)
+#align euclidean_space.nndist_single_same EuclideanSpace.nndist_single_same
+
+@[simp]
+theorem EuclideanSpace.edist_single_same [DecidableEq ι] (i : ι) (a b : 𝕜) :
+ edist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = edist a b :=
+ (PiLp.edist_equiv_symm_single_same 2 (fun i => 𝕜) i a b : _)
+#align euclidean_space.edist_single_same EuclideanSpace.edist_single_same
+
+/-- `euclidean_space.single` forms an orthonormal family. -/
+theorem EuclideanSpace.orthonormalSingle [DecidableEq ι] :
+ Orthonormal 𝕜 fun i : ι => EuclideanSpace.single i (1 : 𝕜) :=
by
- ext i
- simpa using if_congr e.symm_apply_eq rfl rfl
+ simp_rw [orthonormal_iff_ite, EuclideanSpace.inner_single_left, map_one, one_mul,
+ EuclideanSpace.single_apply]
+ intro i j
+ rfl
+#align euclidean_space.orthonormal_single EuclideanSpace.orthonormalSingle
+
+theorem EuclideanSpace.piLpCongrLeft_single [DecidableEq ι] {ι' : Type _} [Fintype ι']
+ [DecidableEq ι'] (e : ι' ≃ ι) (i' : ι') (v : 𝕜) :
+ LinearIsometryEquiv.piLpCongrLeft 2 𝕜 𝕜 e (EuclideanSpace.single i' v) =
+ EuclideanSpace.single (e i') v :=
+ LinearIsometryEquiv.piLpCongrLeft_single e i' _
#align euclidean_space.pi_Lp_congr_left_single EuclideanSpace.piLpCongrLeft_single
variable (ι 𝕜 E)
mathlib commit https://github.com/leanprover-community/mathlib/commit/2f8347015b12b0864dfaf366ec4909eb70c78740
@@ -481,7 +481,7 @@ protected def span [DecidableEq E] {v' : ι' → E} (h : Orthonormal 𝕜 v') (s
let e₀ : OrthonormalBasis s 𝕜 _ :=
OrthonormalBasis.mk
(by
- convert orthonormal_span (h.comp (coe : s → ι') Subtype.coe_injective)
+ convert orthonormalSpan (h.comp (coe : s → ι') Subtype.coe_injective)
ext
simp [e₀', Basis.span_apply])
e₀'.span_eq.ge
@@ -744,7 +744,7 @@ variable (𝕜 E)
/-- A finite-dimensional inner product space admits an orthonormal basis. -/
theorem exists_orthonormalBasis :
∃ (w : Finset E)(b : OrthonormalBasis w 𝕜 E), ⇑b = (coe : w → E) :=
- let ⟨w, hw, hw', hw''⟩ := (orthonormal_empty 𝕜 E).exists_orthonormalBasis_extension
+ let ⟨w, hw, hw', hw''⟩ := (orthonormalEmpty 𝕜 E).exists_orthonormalBasis_extension
⟨w, hw, hw''⟩
#align exists_orthonormal_basis exists_orthonormalBasis
mathlib commit https://github.com/leanprover-community/mathlib/commit/3cacc945118c8c637d89950af01da78307f59325
@@ -887,9 +887,9 @@ noncomputable def LinearIsometry.extend (L : S →ₗᵢ[𝕜] V) : V →ₗᵢ[
rw [← sq_eq_sq (norm_nonneg _) (norm_nonneg _), norm_sq_eq_add_norm_sq_projection x S]
simp only [sq, Mx_decomp]
rw [norm_add_sq_eq_norm_sq_add_norm_sq_of_inner_eq_zero (L (p1 x)) (L3 (p2 x)) Mx_orth]
- simp only [LinearIsometry.norm_map, p1, p2, ContinuousLinearMap.toLinearMap_eq_coe,
- add_left_inj, mul_eq_mul_left_iff, norm_eq_zero, true_or_iff, eq_self_iff_true,
- ContinuousLinearMap.coe_coe, Submodule.coe_norm, Submodule.coe_eq_zero]
+ simp only [LinearIsometry.norm_map, p1, p2, [anonymous], add_left_inj, mul_eq_mul_left_iff,
+ norm_eq_zero, true_or_iff, eq_self_iff_true, ContinuousLinearMap.coe_coe, Submodule.coe_norm,
+ Submodule.coe_eq_zero]
exact
{ toLinearMap := M
norm_map' := M_norm_map }
@@ -898,8 +898,7 @@ noncomputable def LinearIsometry.extend (L : S →ₗᵢ[𝕜] V) : V →ₗᵢ[
theorem LinearIsometry.extend_apply (L : S →ₗᵢ[𝕜] V) (s : S) : L.extend s = L s :=
by
haveI : CompleteSpace S := FiniteDimensional.complete 𝕜 S
- simp only [LinearIsometry.extend, ContinuousLinearMap.toLinearMap_eq_coe, ←
- LinearIsometry.coe_toLinearMap]
+ simp only [LinearIsometry.extend, [anonymous], ← LinearIsometry.coe_toLinearMap]
simp only [add_right_eq_self, LinearIsometry.coe_toLinearMap,
LinearIsometryEquiv.coe_toLinearIsometry, LinearIsometry.coe_comp, Function.comp_apply,
orthogonalProjection_mem_subspace_eq_self, LinearMap.coe_comp, ContinuousLinearMap.coe_coe,
mathlib commit https://github.com/leanprover-community/mathlib/commit/55d771df074d0dd020139ee1cd4b95521422df9f
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Myers, Sébastien Gouëzel, Heather Macbeth
! This file was ported from Lean 3 source module analysis.inner_product_space.pi_L2
-! leanprover-community/mathlib commit c78cad350eb321c81e1eacf68d14e3d3ba1e17f7
+! leanprover-community/mathlib commit 46b633fd842bef9469441c0209906f6dddd2b4f5
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -65,13 +65,15 @@ noncomputable section
variable {ι : Type _} {ι' : Type _}
-variable {𝕜 : Type _} [IsROrC 𝕜] {E : Type _} [InnerProductSpace 𝕜 E]
+variable {𝕜 : Type _} [IsROrC 𝕜]
-variable {E' : Type _} [InnerProductSpace 𝕜 E']
+variable {E : Type _} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E]
-variable {F : Type _} [InnerProductSpace ℝ F]
+variable {E' : Type _} [NormedAddCommGroup E'] [InnerProductSpace 𝕜 E']
-variable {F' : Type _} [InnerProductSpace ℝ F']
+variable {F : Type _} [NormedAddCommGroup F] [InnerProductSpace ℝ F]
+
+variable {F' : Type _} [NormedAddCommGroup F'] [InnerProductSpace ℝ F']
-- mathport name: «expr⟪ , ⟫»
local notation "⟪" x ", " y "⟫" => @inner 𝕜 _ _ x y
@@ -82,9 +84,9 @@ then `Π i, f i` is an inner product space as well. Since `Π i, f i` is endowed
we use instead `pi_Lp 2 f` for the product space, which is endowed with the `L^2` norm.
-/
instance PiLp.innerProductSpace {ι : Type _} [Fintype ι] (f : ι → Type _)
- [∀ i, InnerProductSpace 𝕜 (f i)] : InnerProductSpace 𝕜 (PiLp 2 f)
+ [∀ i, NormedAddCommGroup (f i)] [∀ i, InnerProductSpace 𝕜 (f i)] :
+ InnerProductSpace 𝕜 (PiLp 2 f)
where
- toNormedAddCommGroup := inferInstance
inner x y := ∑ i, inner (x i) (y i)
norm_sq_eq_inner x := by
simp only [PiLp.norm_sq_eq_of_L2, AddMonoidHom.map_sum, ← norm_sq_eq_inner, one_div]
@@ -104,8 +106,8 @@ instance PiLp.innerProductSpace {ι : Type _} [Fintype ι] (f : ι → Type _)
#align pi_Lp.inner_product_space PiLp.innerProductSpace
@[simp]
-theorem PiLp.inner_apply {ι : Type _} [Fintype ι] {f : ι → Type _} [∀ i, InnerProductSpace 𝕜 (f i)]
- (x y : PiLp 2 f) : ⟪x, y⟫ = ∑ i, ⟪x i, y i⟫ :=
+theorem PiLp.inner_apply {ι : Type _} [Fintype ι] {f : ι → Type _} [∀ i, NormedAddCommGroup (f i)]
+ [∀ i, InnerProductSpace 𝕜 (f i)] (x y : PiLp 2 f) : ⟪x, y⟫ = ∑ i, ⟪x i, y i⟫ :=
rfl
#align pi_Lp.inner_apply PiLp.inner_apply
@@ -179,7 +181,7 @@ def DirectSum.IsInternal.isometryL2OfOrthogonalFamily [DecidableEq ι] {V : ι
by
let e₁ := DirectSum.linearEquivFunOnFintype 𝕜 ι fun i => V i
let e₂ := LinearEquiv.ofBijective (DirectSum.coeLinearMap V) hV
- refine' (e₂.symm.trans e₁).isometryOfInner _
+ refine' LinearEquiv.isometryOfInner (e₂.symm.trans e₁) _
suffices ∀ v w, ⟪v, w⟫ = ⟪e₂ (e₁.symm v), e₂ (e₁.symm w)⟫
by
intro v₀ w₀
@@ -396,19 +398,21 @@ protected theorem orthogonalProjection_eq_sum {U : Submodule 𝕜 E} [CompleteSp
#align orthonormal_basis.orthogonal_projection_eq_sum OrthonormalBasis.orthogonalProjection_eq_sum
/-- Mapping an orthonormal basis along a `linear_isometry_equiv`. -/
-protected def map {G : Type _} [InnerProductSpace 𝕜 G] (b : OrthonormalBasis ι 𝕜 E)
- (L : E ≃ₗᵢ[𝕜] G) : OrthonormalBasis ι 𝕜 G where repr := L.symm.trans b.repr
+protected def map {G : Type _} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
+ (b : OrthonormalBasis ι 𝕜 E) (L : E ≃ₗᵢ[𝕜] G) : OrthonormalBasis ι 𝕜 G
+ where repr := L.symm.trans b.repr
#align orthonormal_basis.map OrthonormalBasis.map
@[simp]
-protected theorem map_apply {G : Type _} [InnerProductSpace 𝕜 G] (b : OrthonormalBasis ι 𝕜 E)
- (L : E ≃ₗᵢ[𝕜] G) (i : ι) : b.map L i = L (b i) :=
+protected theorem map_apply {G : Type _} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
+ (b : OrthonormalBasis ι 𝕜 E) (L : E ≃ₗᵢ[𝕜] G) (i : ι) : b.map L i = L (b i) :=
rfl
#align orthonormal_basis.map_apply OrthonormalBasis.map_apply
@[simp]
-protected theorem toBasis_map {G : Type _} [InnerProductSpace 𝕜 G] (b : OrthonormalBasis ι 𝕜 E)
- (L : E ≃ₗᵢ[𝕜] G) : (b.map L).toBasis = b.toBasis.map L.toLinearEquiv :=
+protected theorem toBasis_map {G : Type _} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
+ (b : OrthonormalBasis ι 𝕜 E) (L : E ≃ₗᵢ[𝕜] G) :
+ (b.map L).toBasis = b.toBasis.map L.toLinearEquiv :=
rfl
#align orthonormal_basis.to_basis_map OrthonormalBasis.toBasis_map
@@ -826,7 +830,7 @@ def OrthonormalBasis.fromOrthogonalSpanSingleton (n : ℕ) [Fact (finrank 𝕜 E
section LinearIsometry
-variable {V : Type _} [InnerProductSpace 𝕜 V] [FiniteDimensional 𝕜 V]
+variable {V : Type _} [NormedAddCommGroup V] [InnerProductSpace 𝕜 V] [FiniteDimensional 𝕜 V]
variable {S : Submodule 𝕜 V} {L : S →ₗᵢ[𝕜] V}
mathlib commit https://github.com/leanprover-community/mathlib/commit/57e09a1296bfb4330ddf6624f1028ba186117d82
@@ -279,7 +279,7 @@ variable (ι 𝕜 E)
/-- An orthonormal basis on E is an identification of `E` with its dimensional-matching
`euclidean_space 𝕜 ι`. -/
-structure OrthonormalBasis where of_repr ::
+structure OrthonormalBasis where ofRepr ::
repr : E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜 ι
#align orthonormal_basis OrthonormalBasis
mathlib commit https://github.com/leanprover-community/mathlib/commit/7ec294687917cbc5c73620b4414ae9b5dd9ae1b4
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Myers, Sébastien Gouëzel, Heather Macbeth
! This file was ported from Lean 3 source module analysis.inner_product_space.pi_L2
-! leanprover-community/mathlib commit 9f0d61b4475e3c3cba6636ab51cdb1f3949d2e1d
+! leanprover-community/mathlib commit c78cad350eb321c81e1eacf68d14e3d3ba1e17f7
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -380,7 +380,7 @@ protected theorem sum_repr_symm (b : OrthonormalBasis ι 𝕜 E) (v : EuclideanS
protected theorem sum_inner_mul_inner (b : OrthonormalBasis ι 𝕜 E) (x y : E) :
(∑ i, ⟪x, b i⟫ * ⟪b i, y⟫) = ⟪x, y⟫ :=
by
- have := congr_arg (@innerSL 𝕜 _ _ _ x) (b.sum_repr y)
+ have := congr_arg (innerSL 𝕜 x) (b.sum_repr y)
rw [map_sum] at this
convert this
ext i
mathlib commit https://github.com/leanprover-community/mathlib/commit/02ba8949f486ebecf93fe7460f1ed0564b5e442c
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Myers, Sébastien Gouëzel, Heather Macbeth
! This file was ported from Lean 3 source module analysis.inner_product_space.pi_L2
-! leanprover-community/mathlib commit 4681620dafca6a7d710f437bd10fb69428ec2209
+! leanprover-community/mathlib commit 9f0d61b4475e3c3cba6636ab51cdb1f3949d2e1d
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -165,6 +165,11 @@ theorem EuclideanSpace.inner_eq_star_dotProduct (x y : EuclideanSpace 𝕜 ι) :
rfl
#align euclidean_space.inner_eq_star_dot_product EuclideanSpace.inner_eq_star_dotProduct
+theorem EuclideanSpace.inner_piLp_equiv_symm (x y : ι → 𝕜) :
+ ⟪(PiLp.equiv 2 _).symm x, (PiLp.equiv 2 _).symm y⟫ = Matrix.dotProduct (star x) y :=
+ rfl
+#align euclidean_space.inner_pi_Lp_equiv_symm EuclideanSpace.inner_piLp_equiv_symm
+
/-- A finite, mutually orthogonal family of subspaces of `E`, which span `E`, induce an isometry
from `E` to `pi_Lp 2` of the subspaces equipped with the `L2` inner product. -/
def DirectSum.IsInternal.isometryL2OfOrthogonalFamily [DecidableEq ι] {V : ι → Submodule 𝕜 E}
@@ -906,23 +911,53 @@ section Matrix
open Matrix
-variable {n m : ℕ}
+variable {m n : Type _}
+
+namespace Matrix
+
+variable [Fintype m] [Fintype n] [DecidableEq n]
+
+/-- `matrix.to_lin'` adapted for `euclidean_space 𝕜 _`. -/
+def toEuclideanLin : Matrix m n 𝕜 ≃ₗ[𝕜] EuclideanSpace 𝕜 n →ₗ[𝕜] EuclideanSpace 𝕜 m :=
+ Matrix.toLin' ≪≫ₗ
+ LinearEquiv.arrowCongr (PiLp.linearEquiv _ 𝕜 fun _ : n => 𝕜).symm
+ (PiLp.linearEquiv _ 𝕜 fun _ : m => 𝕜).symm
+#align matrix.to_euclidean_lin Matrix.toEuclideanLin
+
+@[simp]
+theorem toEuclideanLin_piLp_equiv_symm (A : Matrix m n 𝕜) (x : n → 𝕜) :
+ A.toEuclideanLin ((PiLp.equiv _ _).symm x) = (PiLp.equiv _ _).symm (A.toLin' x) :=
+ rfl
+#align matrix.to_euclidean_lin_pi_Lp_equiv_symm Matrix.toEuclideanLin_piLp_equiv_symm
+
+@[simp]
+theorem piLp_equiv_toEuclideanLin (A : Matrix m n 𝕜) (x : EuclideanSpace 𝕜 n) :
+ PiLp.equiv _ _ (A.toEuclideanLin x) = A.toLin' (PiLp.equiv _ _ x) :=
+ rfl
+#align matrix.pi_Lp_equiv_to_euclidean_lin Matrix.piLp_equiv_toEuclideanLin
--- mathport name: «expr⟪ , ⟫ₘ»
-local notation "⟪" x ", " y "⟫ₘ" => @inner 𝕜 (EuclideanSpace 𝕜 (Fin m)) _ x y
+-- `matrix.to_euclidean_lin` is the same as `matrix.to_lin` applied to `pi_Lp.basis_fun`,
+theorem toEuclideanLin_eq_toLin :
+ (toEuclideanLin : Matrix m n 𝕜 ≃ₗ[𝕜] _) =
+ Matrix.toLin (PiLp.basisFun _ _ _) (PiLp.basisFun _ _ _) :=
+ rfl
+#align matrix.to_euclidean_lin_eq_to_lin Matrix.toEuclideanLin_eq_toLin
+
+end Matrix
--- mathport name: «expr⟪ , ⟫ₙ»
-local notation "⟪" x ", " y "⟫ₙ" => @inner 𝕜 (EuclideanSpace 𝕜 (Fin n)) _ x y
+-- mathport name: «expr⟪ , ⟫ₑ»
+local notation "⟪" x ", " y "⟫ₑ" => @inner 𝕜 _ _ ((PiLp.equiv 2 _).symm x) ((PiLp.equiv 2 _).symm y)
-/-- The inner product of a row of A and a row of B is an entry of B ⬝ Aᴴ. -/
-theorem inner_matrix_row_row (A B : Matrix (Fin n) (Fin m) 𝕜) (i j : Fin n) :
- ⟪A i, B j⟫ₘ = (B ⬝ Aᴴ) j i := by
- simp only [inner, Matrix.mul_apply, starRingEnd_apply, Matrix.conjTranspose_apply, mul_comm]
+/-- The inner product of a row of `A` and a row of `B` is an entry of `B ⬝ Aᴴ`. -/
+theorem inner_matrix_row_row [Fintype n] (A B : Matrix m n 𝕜) (i j : m) :
+ ⟪A i, B j⟫ₑ = (B ⬝ Aᴴ) j i := by
+ simp_rw [EuclideanSpace.inner_piLp_equiv_symm, Matrix.mul_apply', Matrix.dotProduct_comm,
+ Matrix.conjTranspose_apply, Pi.star_def]
#align inner_matrix_row_row inner_matrix_row_row
-/-- The inner product of a column of A and a column of B is an entry of Aᴴ ⬝ B -/
-theorem inner_matrix_col_col (A B : Matrix (Fin n) (Fin m) 𝕜) (i j : Fin m) :
- ⟪Aᵀ i, Bᵀ j⟫ₙ = (Aᴴ ⬝ B) i j :=
+/-- The inner product of a column of `A` and a column of `B` is an entry of `Aᴴ ⬝ B`. -/
+theorem inner_matrix_col_col [Fintype m] (A B : Matrix m n 𝕜) (i j : n) :
+ ⟪Aᵀ i, Bᵀ j⟫ₑ = (Aᴴ ⬝ B) i j :=
rfl
#align inner_matrix_col_col inner_matrix_col_col
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce7e9d53d4bbc38065db3b595cd5bd73c323bc1d
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Myers, Sébastien Gouëzel, Heather Macbeth
! This file was ported from Lean 3 source module analysis.inner_product_space.pi_L2
-! leanprover-community/mathlib commit 3fc0b254310908f70a1a75f01147d52e53e9f8a2
+! leanprover-community/mathlib commit 4681620dafca6a7d710f437bd10fb69428ec2209
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -169,7 +169,7 @@ theorem EuclideanSpace.inner_eq_star_dotProduct (x y : EuclideanSpace 𝕜 ι) :
from `E` to `pi_Lp 2` of the subspaces equipped with the `L2` inner product. -/
def DirectSum.IsInternal.isometryL2OfOrthogonalFamily [DecidableEq ι] {V : ι → Submodule 𝕜 E}
(hV : DirectSum.IsInternal V)
- (hV' : @OrthogonalFamily 𝕜 _ _ _ _ (fun i => V i) _ fun i => (V i).subtypeₗᵢ) :
+ (hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) :
E ≃ₗᵢ[𝕜] PiLp 2 fun i => V i :=
by
let e₁ := DirectSum.linearEquivFunOnFintype 𝕜 ι fun i => V i
@@ -189,8 +189,8 @@ def DirectSum.IsInternal.isometryL2OfOrthogonalFamily [DecidableEq ι] {V : ι
@[simp]
theorem DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply [DecidableEq ι]
{V : ι → Submodule 𝕜 E} (hV : DirectSum.IsInternal V)
- (hV' : @OrthogonalFamily 𝕜 _ _ _ _ (fun i => V i) _ fun i => (V i).subtypeₗᵢ)
- (w : PiLp 2 fun i => V i) : (hV.isometryL2OfOrthogonalFamily hV').symm w = ∑ i, (w i : E) := by
+ (hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) (w : PiLp 2 fun i => V i) :
+ (hV.isometryL2OfOrthogonalFamily hV').symm w = ∑ i, (w i : E) := by
classical
let e₁ := DirectSum.linearEquivFunOnFintype 𝕜 ι fun i => V i
let e₂ := LinearEquiv.ofBijective (DirectSum.coeLinearMap V) hV
@@ -669,7 +669,7 @@ variable {A : ι → Submodule 𝕜 E}
of the components of the direct sum, the disjoint union of these orthonormal bases is an
orthonormal basis for `M`. -/
noncomputable def DirectSum.IsInternal.collectedOrthonormalBasis
- (hV : @OrthogonalFamily 𝕜 _ _ _ _ (fun i => A i) _ fun i => (A i).subtypeₗᵢ) [DecidableEq ι]
+ (hV : OrthogonalFamily 𝕜 (fun i => A i) fun i => (A i).subtypeₗᵢ) [DecidableEq ι]
(hV_sum : DirectSum.IsInternal fun i => A i) {α : ι → Type _} [∀ i, Fintype (α i)]
(v_family : ∀ i, OrthonormalBasis (α i) 𝕜 (A i)) : OrthonormalBasis (Σi, α i) 𝕜 E :=
(hV_sum.collectedBasis fun i => (v_family i).toBasis).toOrthonormalBasis <| by
@@ -679,7 +679,7 @@ noncomputable def DirectSum.IsInternal.collectedOrthonormalBasis
theorem DirectSum.IsInternal.collectedOrthonormalBasis_mem [DecidableEq ι]
(h : DirectSum.IsInternal A) {α : ι → Type _} [∀ i, Fintype (α i)]
- (hV : @OrthogonalFamily 𝕜 _ _ _ _ (fun i => A i) _ fun i => (A i).subtypeₗᵢ)
+ (hV : OrthogonalFamily 𝕜 (fun i => A i) fun i => (A i).subtypeₗᵢ)
(v : ∀ i, OrthonormalBasis (α i) 𝕜 (A i)) (a : Σi, α i) :
h.collectedOrthonormalBasis hV v a ∈ A a.1 := by
simp [DirectSum.IsInternal.collectedOrthonormalBasis]
@@ -771,7 +771,7 @@ variable {n : ℕ} (hn : finrank 𝕜 E = n) [DecidableEq ι] {V : ι → Submod
/-- Exhibit a bijection between `fin n` and the index set of a certain basis of an `n`-dimensional
inner product space `E`. This should not be accessed directly, but only via the subsequent API. -/
irreducible_def DirectSum.IsInternal.sigmaOrthonormalBasisIndexEquiv
- (hV' : @OrthogonalFamily 𝕜 _ _ _ _ (fun i => V i) _ fun i => (V i).subtypeₗᵢ) :
+ (hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) :
(Σi, Fin (finrank 𝕜 (V i))) ≃ Fin n :=
let b := hV.collectedOrthonormalBasis hV' fun i => stdOrthonormalBasis 𝕜 (V i)
Fintype.equivFinOfCardEq <| (FiniteDimensional.finrank_eq_card_basis b.toBasis).symm.trans hn
@@ -780,7 +780,7 @@ irreducible_def DirectSum.IsInternal.sigmaOrthonormalBasisIndexEquiv
/-- An `n`-dimensional `inner_product_space` equipped with a decomposition as an internal direct
sum has an orthonormal basis indexed by `fin n` and subordinate to that direct sum. -/
irreducible_def DirectSum.IsInternal.subordinateOrthonormalBasis
- (hV' : @OrthogonalFamily 𝕜 _ _ _ _ (fun i => V i) _ fun i => (V i).subtypeₗᵢ) :
+ (hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) :
OrthonormalBasis (Fin n) 𝕜 E :=
(hV.collectedOrthonormalBasis hV' fun i => stdOrthonormalBasis 𝕜 (V i)).reindex
(hV.sigmaOrthonormalBasisIndexEquiv hn hV')
@@ -790,14 +790,14 @@ irreducible_def DirectSum.IsInternal.subordinateOrthonormalBasis
sum has an orthonormal basis indexed by `fin n` and subordinate to that direct sum. This function
provides the mapping by which it is subordinate. -/
irreducible_def DirectSum.IsInternal.subordinateOrthonormalBasisIndex (a : Fin n)
- (hV' : @OrthogonalFamily 𝕜 _ _ _ _ (fun i => V i) _ fun i => (V i).subtypeₗᵢ) : ι :=
+ (hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) : ι :=
((hV.sigmaOrthonormalBasisIndexEquiv hn hV').symm a).1
#align direct_sum.is_internal.subordinate_orthonormal_basis_index DirectSum.IsInternal.subordinateOrthonormalBasisIndex
/-- The basis constructed in `orthogonal_family.subordinate_orthonormal_basis` is subordinate to
the `orthogonal_family` in question. -/
theorem DirectSum.IsInternal.subordinateOrthonormalBasis_subordinate (a : Fin n)
- (hV' : @OrthogonalFamily 𝕜 _ _ _ _ (fun i => V i) _ fun i => (V i).subtypeₗᵢ) :
+ (hV' : OrthogonalFamily 𝕜 (fun i => V i) fun i => (V i).subtypeₗᵢ) :
hV.subordinateOrthonormalBasis hn hV' a ∈ V (hV.subordinateOrthonormalBasisIndex hn a hV') := by
simpa only [DirectSum.IsInternal.subordinateOrthonormalBasis, OrthonormalBasis.coe_reindex,
DirectSum.IsInternal.subordinateOrthonormalBasisIndex] using
mathlib commit https://github.com/leanprover-community/mathlib/commit/1a313d8bba1bad05faba71a4a4e9742ab5bd9efd
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Myers, Sébastien Gouëzel, Heather Macbeth
! This file was ported from Lean 3 source module analysis.inner_product_space.pi_L2
-! leanprover-community/mathlib commit 2f4cdce0c2f2f3b8cd58f05d556d03b468e1eb2e
+! leanprover-community/mathlib commit 3fc0b254310908f70a1a75f01147d52e53e9f8a2
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -88,13 +88,13 @@ instance PiLp.innerProductSpace {ι : Type _} [Fintype ι] (f : ι → Type _)
inner x y := ∑ i, inner (x i) (y i)
norm_sq_eq_inner x := by
simp only [PiLp.norm_sq_eq_of_L2, AddMonoidHom.map_sum, ← norm_sq_eq_inner, one_div]
- conj_sym := by
+ conj_symm := by
intro x y
unfold inner
rw [RingHom.map_sum]
apply Finset.sum_congr rfl
rintro z -
- apply inner_conj_sym
+ apply inner_conj_symm
add_left x y z :=
show (∑ i, inner (x i + y i) (z i)) = (∑ i, inner (x i) (z i)) + ∑ i, inner (y i) (z i) by
simp only [inner_add_left, Finset.sum_add_distrib]
mathlib commit https://github.com/leanprover-community/mathlib/commit/2af0836443b4cfb5feda0df0051acdb398304931
@@ -472,7 +472,7 @@ protected def span [DecidableEq E] {v' : ι' → E} (h : Orthonormal 𝕜 v') (s
let e₀ : OrthonormalBasis s 𝕜 _ :=
OrthonormalBasis.mk
(by
- convert orthonormalSpan (h.comp (coe : s → ι') Subtype.coe_injective)
+ convert orthonormal_span (h.comp (coe : s → ι') Subtype.coe_injective)
ext
simp [e₀', Basis.span_apply])
e₀'.span_eq.ge
@@ -735,7 +735,7 @@ variable (𝕜 E)
/-- A finite-dimensional inner product space admits an orthonormal basis. -/
theorem exists_orthonormalBasis :
∃ (w : Finset E)(b : OrthonormalBasis w 𝕜 E), ⇑b = (coe : w → E) :=
- let ⟨w, hw, hw', hw''⟩ := (orthonormalEmpty 𝕜 E).exists_orthonormalBasis_extension
+ let ⟨w, hw, hw', hw''⟩ := (orthonormal_empty 𝕜 E).exists_orthonormalBasis_extension
⟨w, hw, hw''⟩
#align exists_orthonormal_basis exists_orthonormalBasis
mathlib commit https://github.com/leanprover-community/mathlib/commit/eb0cb4511aaef0da2462207b67358a0e1fe1e2ee
@@ -59,7 +59,7 @@ For consequences in infinite dimension (Hilbert bases, etc.), see the file
open Real Set Filter IsROrC Submodule Function
-open BigOperators uniformity Topology NNReal Ennreal ComplexConjugate DirectSum
+open BigOperators uniformity Topology NNReal ENNReal ComplexConjugate DirectSum
noncomputable section
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -1023,6 +1023,20 @@ theorem piLp_equiv_toEuclideanLin (A : Matrix m n 𝕜) (x : EuclideanSpace 𝕜
rfl
#align matrix.pi_Lp_equiv_to_euclidean_lin Matrix.piLp_equiv_toEuclideanLin
+theorem toEuclideanLin_apply (M : Matrix m n 𝕜) (v : EuclideanSpace 𝕜 n) :
+ toEuclideanLin M v = (WithLp.equiv 2 (m → 𝕜)).symm (M *ᵥ (WithLp.equiv 2 (n → 𝕜)) v) :=
+ rfl
+
+@[simp]
+theorem piLp_equiv_toEuclideanLin_apply (M : Matrix m n 𝕜) (v : EuclideanSpace 𝕜 n) :
+ WithLp.equiv 2 (m → 𝕜) (toEuclideanLin M v) = M *ᵥ WithLp.equiv 2 (n → 𝕜) v :=
+ rfl
+
+@[simp]
+theorem toEuclideanLin_apply_piLp_equiv_symm (M : Matrix m n 𝕜) (v : n → 𝕜) :
+ toEuclideanLin M ((WithLp.equiv 2 (n→ 𝕜)).symm v) = (WithLp.equiv 2 (m → 𝕜)).symm (M *ᵥ v) :=
+ rfl
+
-- `Matrix.toEuclideanLin` is the same as `Matrix.toLin` applied to `PiLp.basisFun`,
theorem toEuclideanLin_eq_toLin :
(toEuclideanLin : Matrix m n 𝕜 ≃ₗ[𝕜] _) =
This adds the notation √r
for Real.sqrt r
. The precedence is such that √x⁻¹
is parsed as √(x⁻¹)
; not because this is particularly desirable, but because it's the default and the choice doesn't really matter.
This is extracted from #7907, which adds a more general nth root typeclass.
The idea is to perform all the boring substitutions downstream quickly, so that we can play around with custom elaborators with a much slower rate of code-rot.
This PR also won't rot as quickly, as it does not forbid writing x.sqrt
as that PR does.
While perhaps claiming √
for Real.sqrt
is greedy; it:
NNReal.sqrt
and Nat.sqrt
sqrt
on Float
Co-authored-by: Yury G. Kudryashov <urkud@urkud.name>
@@ -113,12 +113,12 @@ theorem EuclideanSpace.nnnorm_eq {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Finty
#align euclidean_space.nnnorm_eq EuclideanSpace.nnnorm_eq
theorem EuclideanSpace.norm_eq {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Fintype n]
- (x : EuclideanSpace 𝕜 n) : ‖x‖ = Real.sqrt (∑ i, ‖x i‖ ^ 2) := by
+ (x : EuclideanSpace 𝕜 n) : ‖x‖ = √(∑ i, ‖x i‖ ^ 2) := by
simpa only [Real.coe_sqrt, NNReal.coe_sum] using congr_arg ((↑) : ℝ≥0 → ℝ) x.nnnorm_eq
#align euclidean_space.norm_eq EuclideanSpace.norm_eq
theorem EuclideanSpace.dist_eq {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Fintype n]
- (x y : EuclideanSpace 𝕜 n) : dist x y = (∑ i, dist (x i) (y i) ^ 2).sqrt :=
+ (x y : EuclideanSpace 𝕜 n) : dist x y = √(∑ i, dist (x i) (y i) ^ 2) :=
PiLp.dist_eq_of_L2 x y
#align euclidean_space.dist_eq EuclideanSpace.dist_eq
Purely automatic replacement. If this is in any way controversial; I'm happy to just close this PR.
@@ -927,7 +927,7 @@ open FiniteDimensional
/-- Let `S` be a subspace of a finite-dimensional complex inner product space `V`. A linear
isometry mapping `S` into `V` can be extended to a full isometry of `V`.
-TODO: The case when `S` is a finite-dimensional subspace of an infinite-dimensional `V`.-/
+TODO: The case when `S` is a finite-dimensional subspace of an infinite-dimensional `V`. -/
noncomputable def LinearIsometry.extend (L : S →ₗᵢ[𝕜] V) : V →ₗᵢ[𝕜] V := by
-- Build an isometry from Sᗮ to L(S)ᗮ through `EuclideanSpace`
let d := finrank 𝕜 Sᗮ
@@ -929,7 +929,7 @@ isometry mapping `S` into `V` can be extended to a full isometry of `V`.
TODO: The case when `S` is a finite-dimensional subspace of an infinite-dimensional `V`.-/
noncomputable def LinearIsometry.extend (L : S →ₗᵢ[𝕜] V) : V →ₗᵢ[𝕜] V := by
- -- Build an isometry from Sᗮ to L(S)ᗮ through euclidean_space
+ -- Build an isometry from Sᗮ to L(S)ᗮ through `EuclideanSpace`
let d := finrank 𝕜 Sᗮ
let LS := LinearMap.range L.toLinearMap
have E : Sᗮ ≃ₗᵢ[𝕜] LSᗮ := by
IsROrC
to RCLike
(#10819)
IsROrC
contains data, which goes against the expectation that classes prefixed with Is
are prop-valued. People have been complaining about this on and off, so this PR renames IsROrC
to RCLike
.
@@ -55,13 +55,12 @@ For consequences in infinite dimension (Hilbert bases, etc.), see the file
set_option linter.uppercaseLean3 false
-open Real Set Filter IsROrC Submodule Function BigOperators Uniformity Topology NNReal ENNReal
+open Real Set Filter RCLike Submodule Function BigOperators Uniformity Topology NNReal ENNReal
ComplexConjugate DirectSum
noncomputable section
-variable {ι : Type*} {ι' : Type*}
-variable {𝕜 : Type*} [IsROrC 𝕜]
+variable {ι ι' 𝕜 : Type*} [RCLike 𝕜]
variable {E : Type*} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E]
variable {E' : Type*} [NormedAddCommGroup E'] [InnerProductSpace 𝕜 E']
variable {F : Type*} [NormedAddCommGroup F] [InnerProductSpace ℝ F]
@@ -108,27 +107,27 @@ def EuclideanSpace (𝕜 : Type*) (n : Type*) : Type _ :=
PiLp 2 fun _ : n => 𝕜
#align euclidean_space EuclideanSpace
-theorem EuclideanSpace.nnnorm_eq {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n]
+theorem EuclideanSpace.nnnorm_eq {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Fintype n]
(x : EuclideanSpace 𝕜 n) : ‖x‖₊ = NNReal.sqrt (∑ i, ‖x i‖₊ ^ 2) :=
PiLp.nnnorm_eq_of_L2 x
#align euclidean_space.nnnorm_eq EuclideanSpace.nnnorm_eq
-theorem EuclideanSpace.norm_eq {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n]
+theorem EuclideanSpace.norm_eq {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Fintype n]
(x : EuclideanSpace 𝕜 n) : ‖x‖ = Real.sqrt (∑ i, ‖x i‖ ^ 2) := by
simpa only [Real.coe_sqrt, NNReal.coe_sum] using congr_arg ((↑) : ℝ≥0 → ℝ) x.nnnorm_eq
#align euclidean_space.norm_eq EuclideanSpace.norm_eq
-theorem EuclideanSpace.dist_eq {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n]
+theorem EuclideanSpace.dist_eq {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : dist x y = (∑ i, dist (x i) (y i) ^ 2).sqrt :=
PiLp.dist_eq_of_L2 x y
#align euclidean_space.dist_eq EuclideanSpace.dist_eq
-theorem EuclideanSpace.nndist_eq {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n]
+theorem EuclideanSpace.nndist_eq {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : nndist x y = NNReal.sqrt (∑ i, nndist (x i) (y i) ^ 2) :=
PiLp.nndist_eq_of_L2 x y
#align euclidean_space.nndist_eq EuclideanSpace.nndist_eq
-theorem EuclideanSpace.edist_eq {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n]
+theorem EuclideanSpace.edist_eq {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : edist x y = (∑ i, edist (x i) (y i) ^ 2) ^ (1 / 2 : ℝ) :=
PiLp.edist_eq_of_L2 x y
#align euclidean_space.edist_eq EuclideanSpace.edist_eq
@@ -738,7 +737,7 @@ unit length. -/
@[simp]
theorem OrthonormalBasis.det_to_matrix_orthonormalBasis : ‖a.toBasis.det b‖ = 1 := by
have := (Matrix.det_of_mem_unitary (a.toMatrix_orthonormalBasis_mem_unitary b)).2
- rw [star_def, IsROrC.mul_conj] at this
+ rw [star_def, RCLike.mul_conj] at this
norm_cast at this
rwa [pow_eq_one_iff_of_nonneg (norm_nonneg _) two_ne_zero] at this
#align orthonormal_basis.det_to_matrix_orthonormal_basis OrthonormalBasis.det_to_matrix_orthonormalBasis
Fintype
/Finite
(#11428)
Also rename *lpBcf
to *lpBCF
and drop 2 duplicate instances.
@@ -103,8 +103,8 @@ theorem PiLp.inner_apply {ι : Type*} [Fintype ι] {f : ι → Type*} [∀ i, No
/-- The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
space use `EuclideanSpace 𝕜 (Fin n)`. -/
-@[reducible, nolint unusedArguments]
-def EuclideanSpace (𝕜 : Type*) [IsROrC 𝕜] (n : Type*) [Fintype n] : Type _ :=
+@[reducible]
+def EuclideanSpace (𝕜 : Type*) (n : Type*) : Type _ :=
PiLp 2 fun _ : n => 𝕜
#align euclidean_space EuclideanSpace
@@ -151,20 +151,13 @@ theorem EuclideanSpace.sphere_zero_eq {n : Type*} [Fintype n] (r : ℝ) (hr : 0
simp_rw [mem_setOf, mem_sphere_zero_iff_norm, norm_eq, norm_eq_abs, sq_abs,
Real.sqrt_eq_iff_sq_eq this hr, eq_comm]
-variable [Fintype ι]
-
section
--- Porting note: no longer supported
--- attribute [local reducible] PiLp
+#align euclidean_space.finite_dimensional WithLp.instModuleFinite
-instance EuclideanSpace.instFiniteDimensional : FiniteDimensional 𝕜 (EuclideanSpace 𝕜 ι) := by
- infer_instance
-#align euclidean_space.finite_dimensional EuclideanSpace.instFiniteDimensional
+variable [Fintype ι]
-instance EuclideanSpace.instInnerProductSpace : InnerProductSpace 𝕜 (EuclideanSpace 𝕜 ι) := by
- infer_instance
-#align euclidean_space.inner_product_space EuclideanSpace.instInnerProductSpace
+#align euclidean_space.inner_product_space PiLp.innerProductSpace
@[simp]
theorem finrank_euclideanSpace :
@@ -253,71 +246,77 @@ def EuclideanSpace.proj (i : ι) : EuclideanSpace 𝕜 ι →L[𝕜] 𝕜 :=
#align euclidean_space.proj_coe EuclideanSpace.proj_coe
#align euclidean_space.proj_apply EuclideanSpace.proj_apply
+section DecEq
+
+variable [DecidableEq ι]
+
-- TODO : This should be generalized to `PiLp`.
/-- The vector given in euclidean space by being `1 : 𝕜` at coordinate `i : ι` and `0 : 𝕜` at
all other coordinates. -/
-def EuclideanSpace.single [DecidableEq ι] (i : ι) (a : 𝕜) : EuclideanSpace 𝕜 ι :=
+def EuclideanSpace.single (i : ι) (a : 𝕜) : EuclideanSpace 𝕜 ι :=
(WithLp.equiv _ _).symm (Pi.single i a)
#align euclidean_space.single EuclideanSpace.single
@[simp]
-theorem WithLp.equiv_single [DecidableEq ι] (i : ι) (a : 𝕜) :
+theorem WithLp.equiv_single (i : ι) (a : 𝕜) :
WithLp.equiv _ _ (EuclideanSpace.single i a) = Pi.single i a :=
rfl
#align pi_Lp.equiv_single WithLp.equiv_single
@[simp]
-theorem WithLp.equiv_symm_single [DecidableEq ι] (i : ι) (a : 𝕜) :
+theorem WithLp.equiv_symm_single (i : ι) (a : 𝕜) :
(WithLp.equiv _ _).symm (Pi.single i a) = EuclideanSpace.single i a :=
rfl
#align pi_Lp.equiv_symm_single WithLp.equiv_symm_single
@[simp]
-theorem EuclideanSpace.single_apply [DecidableEq ι] (i : ι) (a : 𝕜) (j : ι) :
+theorem EuclideanSpace.single_apply (i : ι) (a : 𝕜) (j : ι) :
(EuclideanSpace.single i a) j = ite (j = i) a 0 := by
rw [EuclideanSpace.single, WithLp.equiv_symm_pi_apply, ← Pi.single_apply i a j]
#align euclidean_space.single_apply EuclideanSpace.single_apply
-theorem EuclideanSpace.inner_single_left [DecidableEq ι] (i : ι) (a : 𝕜) (v : EuclideanSpace 𝕜 ι) :
+variable [Fintype ι]
+
+theorem EuclideanSpace.inner_single_left (i : ι) (a : 𝕜) (v : EuclideanSpace 𝕜 ι) :
⟪EuclideanSpace.single i (a : 𝕜), v⟫ = conj a * v i := by simp [apply_ite conj]
#align euclidean_space.inner_single_left EuclideanSpace.inner_single_left
-theorem EuclideanSpace.inner_single_right [DecidableEq ι] (i : ι) (a : 𝕜) (v : EuclideanSpace 𝕜 ι) :
+theorem EuclideanSpace.inner_single_right (i : ι) (a : 𝕜) (v : EuclideanSpace 𝕜 ι) :
⟪v, EuclideanSpace.single i (a : 𝕜)⟫ = a * conj (v i) := by simp [apply_ite conj, mul_comm]
#align euclidean_space.inner_single_right EuclideanSpace.inner_single_right
@[simp]
-theorem EuclideanSpace.norm_single [DecidableEq ι] (i : ι) (a : 𝕜) :
+theorem EuclideanSpace.norm_single (i : ι) (a : 𝕜) :
‖EuclideanSpace.single i (a : 𝕜)‖ = ‖a‖ :=
PiLp.norm_equiv_symm_single 2 (fun _ => 𝕜) i a
#align euclidean_space.norm_single EuclideanSpace.norm_single
@[simp]
-theorem EuclideanSpace.nnnorm_single [DecidableEq ι] (i : ι) (a : 𝕜) :
+theorem EuclideanSpace.nnnorm_single (i : ι) (a : 𝕜) :
‖EuclideanSpace.single i (a : 𝕜)‖₊ = ‖a‖₊ :=
PiLp.nnnorm_equiv_symm_single 2 (fun _ => 𝕜) i a
#align euclidean_space.nnnorm_single EuclideanSpace.nnnorm_single
@[simp]
-theorem EuclideanSpace.dist_single_same [DecidableEq ι] (i : ι) (a b : 𝕜) :
+theorem EuclideanSpace.dist_single_same (i : ι) (a b : 𝕜) :
dist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = dist a b :=
PiLp.dist_equiv_symm_single_same 2 (fun _ => 𝕜) i a b
#align euclidean_space.dist_single_same EuclideanSpace.dist_single_same
@[simp]
-theorem EuclideanSpace.nndist_single_same [DecidableEq ι] (i : ι) (a b : 𝕜) :
+theorem EuclideanSpace.nndist_single_same (i : ι) (a b : 𝕜) :
nndist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = nndist a b :=
PiLp.nndist_equiv_symm_single_same 2 (fun _ => 𝕜) i a b
#align euclidean_space.nndist_single_same EuclideanSpace.nndist_single_same
@[simp]
-theorem EuclideanSpace.edist_single_same [DecidableEq ι] (i : ι) (a b : 𝕜) :
+theorem EuclideanSpace.edist_single_same (i : ι) (a b : 𝕜) :
edist (EuclideanSpace.single i (a : 𝕜)) (EuclideanSpace.single i (b : 𝕜)) = edist a b :=
PiLp.edist_equiv_symm_single_same 2 (fun _ => 𝕜) i a b
#align euclidean_space.edist_single_same EuclideanSpace.edist_single_same
/-- `EuclideanSpace.single` forms an orthonormal family. -/
-theorem EuclideanSpace.orthonormal_single [DecidableEq ι] :
+theorem EuclideanSpace.orthonormal_single :
Orthonormal 𝕜 fun i : ι => EuclideanSpace.single i (1 : 𝕜) := by
simp_rw [orthonormal_iff_ite, EuclideanSpace.inner_single_left, map_one, one_mul,
EuclideanSpace.single_apply]
@@ -325,18 +324,22 @@ theorem EuclideanSpace.orthonormal_single [DecidableEq ι] :
trivial
#align euclidean_space.orthonormal_single EuclideanSpace.orthonormal_single
-theorem EuclideanSpace.piLpCongrLeft_single [DecidableEq ι] {ι' : Type*} [Fintype ι']
- [DecidableEq ι'] (e : ι' ≃ ι) (i' : ι') (v : 𝕜) :
+theorem EuclideanSpace.piLpCongrLeft_single
+ {ι' : Type*} [Fintype ι'] [DecidableEq ι'] (e : ι' ≃ ι) (i' : ι') (v : 𝕜) :
LinearIsometryEquiv.piLpCongrLeft 2 𝕜 𝕜 e (EuclideanSpace.single i' v) =
EuclideanSpace.single (e i') v :=
LinearIsometryEquiv.piLpCongrLeft_single e i' _
#align euclidean_space.pi_Lp_congr_left_single EuclideanSpace.piLpCongrLeft_single
+end DecEq
+
variable (ι 𝕜 E)
+variable [Fintype ι]
/-- An orthonormal basis on E is an identification of `E` with its dimensional-matching
`EuclideanSpace 𝕜 ι`. -/
structure OrthonormalBasis where ofRepr ::
+ /-- Linear isometry between `E` and `EuclideanSpace 𝕜 ι` representing the orthonormal basis. -/
repr : E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜 ι
#align orthonormal_basis OrthonormalBasis
#align orthonormal_basis.of_repr OrthonormalBasis.ofRepr
Empty lines were removed by executing the following Python script twice
import os
import re
# Loop through each file in the repository
for dir_path, dirs, files in os.walk('.'):
for filename in files:
if filename.endswith('.lean'):
file_path = os.path.join(dir_path, filename)
# Open the file and read its contents
with open(file_path, 'r') as file:
content = file.read()
# Use a regular expression to replace sequences of "variable" lines separated by empty lines
# with sequences without empty lines
modified_content = re.sub(r'(variable.*\n)\n(variable(?! .* in))', r'\1\2', content)
# Write the modified content back to the file
with open(file_path, 'w') as file:
file.write(modified_content)
@@ -61,15 +61,10 @@ open Real Set Filter IsROrC Submodule Function BigOperators Uniformity Topology
noncomputable section
variable {ι : Type*} {ι' : Type*}
-
variable {𝕜 : Type*} [IsROrC 𝕜]
-
variable {E : Type*} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E]
-
variable {E' : Type*} [NormedAddCommGroup E'] [InnerProductSpace 𝕜 E']
-
variable {F : Type*} [NormedAddCommGroup F] [InnerProductSpace ℝ F]
-
variable {F' : Type*} [NormedAddCommGroup F'] [InnerProductSpace ℝ F']
local notation "⟪" x ", " y "⟫" => @inner 𝕜 _ _ x y
@@ -774,7 +769,6 @@ end ToMatrix
section FiniteDimensional
variable {v : Set E}
-
variable {A : ι → Submodule 𝕜 E}
/-- Given an internal direct sum decomposition of a module `M`, and an orthonormal basis for each
@@ -924,7 +918,6 @@ def OrthonormalBasis.fromOrthogonalSpanSingleton (n : ℕ) [Fact (finrank 𝕜 E
section LinearIsometry
variable {V : Type*} [NormedAddCommGroup V] [InnerProductSpace 𝕜 V] [FiniteDimensional 𝕜 V]
-
variable {S : Submodule 𝕜 V} {L : S →ₗᵢ[𝕜] V}
open FiniteDimensional
@@ -221,7 +221,8 @@ theorem DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply [DecidableE
suffices ∀ v : ⨁ i, V i, e₂ v = ∑ i, e₁ v i by exact this (e₁.symm w)
intro v
-- Porting note: added `DFinsupp.lsum`
- simp [DirectSum.coeLinearMap, DirectSum.toModule, DFinsupp.lsum, DFinsupp.sumAddHom_apply]
+ simp [e₁, e₂, DirectSum.coeLinearMap, DirectSum.toModule, DFinsupp.lsum,
+ DFinsupp.sumAddHom_apply]
#align direct_sum.is_internal.isometry_L2_of_orthogonal_family_symm_apply DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply
end
@@ -553,7 +554,7 @@ protected def span [DecidableEq E] {v' : ι' → E} (h : Orthonormal 𝕜 v') (s
OrthonormalBasis.mk
(by
convert orthonormal_span (h.comp ((↑) : s → ι') Subtype.val_injective)
- simp [Basis.span_apply])
+ simp [e₀', Basis.span_apply])
e₀'.span_eq.ge
let φ : span 𝕜 (s.image v' : Set E) ≃ₗᵢ[𝕜] span 𝕜 (range (v' ∘ ((↑) : s → ι'))) :=
LinearIsometryEquiv.ofEq _ _
@@ -809,8 +810,8 @@ theorem Orthonormal.exists_orthonormalBasis_extension (hv : Orthonormal 𝕜 ((
let fu : ↥u ≃ ↥u₀ := hu₀_finite.subtypeEquivToFinset.symm
have hu : Orthonormal 𝕜 ((↑) : u → E) := by simpa using hu₀.comp _ fu.injective
refine' ⟨u, OrthonormalBasis.mkOfOrthogonalEqBot hu _, _, _⟩
- · simpa using hu₀_max
- · simpa using hu₀s
+ · simpa [u] using hu₀_max
+ · simpa [u] using hu₀s
· simp
#align orthonormal.exists_orthonormal_basis_extension Orthonormal.exists_orthonormalBasis_extension
@@ -960,7 +961,7 @@ noncomputable def LinearIsometry.extend (L : S →ₗᵢ[𝕜] V) : V →ₗᵢ[
intro x
-- Apply M to the orthogonal decomposition of x
have Mx_decomp : M x = L (p1 x) + L3 (p2 x) := by
- simp only [LinearMap.add_apply, LinearMap.comp_apply, LinearMap.comp_apply,
+ simp only [M, LinearMap.add_apply, LinearMap.comp_apply, LinearMap.comp_apply,
LinearIsometry.coe_toLinearMap]
-- Mx_decomp is the orthogonal decomposition of M x
have Mx_orth : ⟪L (p1 x), L3 (p2 x)⟫ = 0 := by
@@ -975,7 +976,7 @@ noncomputable def LinearIsometry.extend (L : S →ₗᵢ[𝕜] V) : V →ₗᵢ[
rw [← sq_eq_sq (norm_nonneg _) (norm_nonneg _), norm_sq_eq_add_norm_sq_projection x S]
simp only [sq, Mx_decomp]
rw [norm_add_sq_eq_norm_sq_add_norm_sq_of_inner_eq_zero (L (p1 x)) (L3 (p2 x)) Mx_orth]
- simp only [LinearIsometry.norm_map, _root_.add_left_inj, mul_eq_mul_left_iff,
+ simp only [p1, p2, LinearIsometry.norm_map, _root_.add_left_inj, mul_eq_mul_left_iff,
norm_eq_zero, true_or_iff, eq_self_iff_true, ContinuousLinearMap.coe_coe, Submodule.coe_norm,
Submodule.coe_eq_zero]
exact
@@ -154,7 +154,7 @@ theorem EuclideanSpace.sphere_zero_eq {n : Type*} [Fintype n] (r : ℝ) (hr : 0
ext x
have : (0 : ℝ) ≤ ∑ i, x i ^ 2 := Finset.sum_nonneg fun _ _ => sq_nonneg _
simp_rw [mem_setOf, mem_sphere_zero_iff_norm, norm_eq, norm_eq_abs, sq_abs,
- sqrt_eq_iff_sq_eq this hr, eq_comm]
+ Real.sqrt_eq_iff_sq_eq this hr, eq_comm]
variable [Fintype ι]
Rename lemmas to enable new-style dot notation or drop repeating FiniteDimensional.finiteDimensional_*
.
Restore old names as deprecated aliases.
@@ -915,8 +915,8 @@ space, there exists an isometry from the orthogonal complement of a nonzero sing
`EuclideanSpace 𝕜 (Fin n)`. -/
def OrthonormalBasis.fromOrthogonalSpanSingleton (n : ℕ) [Fact (finrank 𝕜 E = n + 1)] {v : E}
(hv : v ≠ 0) : OrthonormalBasis (Fin n) 𝕜 (𝕜 ∙ v)ᗮ :=
- -- Porting note: was `attribute [local instance] fact_finiteDimensional_of_finrank_eq_succ`
- haveI : FiniteDimensional 𝕜 E := fact_finiteDimensional_of_finrank_eq_succ (K := 𝕜) (V := E) n
+ -- Porting note: was `attribute [local instance] FiniteDimensional.of_fact_finrank_eq_succ`
+ haveI : FiniteDimensional 𝕜 E := .of_fact_finrank_eq_succ (K := 𝕜) (V := E) n
(stdOrthonormalBasis _ _).reindex <| finCongr <| finrank_orthogonal_span_singleton hv
#align orthonormal_basis.from_orthogonal_span_singleton OrthonormalBasis.fromOrthogonalSpanSingleton
FunLike
(#9833)
This follows up from #9785, which renamed FunLike
to DFunLike
, by introducing a new abbreviation FunLike F α β := DFunLike F α (fun _ => β)
, to make the non-dependent use of FunLike
easier.
I searched for the pattern DFunLike.*fun
and DFunLike.*λ
in all files to replace expressions of the form DFunLike F α (fun _ => β)
with FunLike F α β
. I did this everywhere except for extends
clauses for two reasons: it would conflict with #8386, and more importantly extends
must directly refer to a structure with no unfolding of def
s or abbrev
s.
@@ -356,9 +356,9 @@ theorem repr_injective :
cases g
congr
--- Porting note: `CoeFun` → `DFunLike`
+-- Porting note: `CoeFun` → `FunLike`
/-- `b i` is the `i`th basis vector. -/
-instance instDFunLike : DFunLike (OrthonormalBasis ι 𝕜 E) ι fun _ => E where
+instance instFunLike : FunLike (OrthonormalBasis ι 𝕜 E) ι E where
coe b i := by classical exact b.repr.symm (EuclideanSpace.single i (1 : 𝕜))
coe_injective' b b' h := repr_injective <| LinearIsometryEquiv.toLinearEquiv_injective <|
LinearEquiv.symm_bijective.injective <| LinearEquiv.toLinearMap_injective <| by
FunLike
to DFunLike
(#9785)
This prepares for the introduction of a non-dependent synonym of FunLike, which helps a lot with keeping #8386 readable.
This is entirely search-and-replace in 680197f combined with manual fixes in 4145626, e900597 and b8428f8. The commands that generated this change:
sed -i 's/\bFunLike\b/DFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\btoFunLike\b/toDFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/import Mathlib.Data.DFunLike/import Mathlib.Data.FunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\bHom_FunLike\b/Hom_DFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\binstFunLike\b/instDFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\bfunLike\b/instDFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\btoo many metavariables to apply `fun_like.has_coe_to_fun`/too many metavariables to apply `DFunLike.hasCoeToFun`/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>
@@ -356,9 +356,9 @@ theorem repr_injective :
cases g
congr
--- Porting note: `CoeFun` → `FunLike`
+-- Porting note: `CoeFun` → `DFunLike`
/-- `b i` is the `i`th basis vector. -/
-instance instFunLike : FunLike (OrthonormalBasis ι 𝕜 E) ι fun _ => E where
+instance instDFunLike : DFunLike (OrthonormalBasis ι 𝕜 E) ι fun _ => E where
coe b i := by classical exact b.repr.symm (EuclideanSpace.single i (1 : 𝕜))
coe_injective' b b' h := repr_injective <| LinearIsometryEquiv.toLinearEquiv_injective <|
LinearEquiv.symm_bijective.injective <| LinearEquiv.toLinearMap_injective <| by
@@ -380,7 +380,7 @@ instance instFunLike : FunLike (OrthonormalBasis ι 𝕜 E) ι fun _ => E where
theorem coe_ofRepr [DecidableEq ι] (e : E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜 ι) :
⇑(OrthonormalBasis.ofRepr e) = fun i => e.symm (EuclideanSpace.single i (1 : 𝕜)) := by
-- Porting note: simplified with `congr!`
- dsimp only [FunLike.coe]
+ dsimp only [DFunLike.coe]
funext
congr!
#align orthonormal_basis.coe_of_repr OrthonormalBasis.coe_ofRepr
@@ -389,7 +389,7 @@ theorem coe_ofRepr [DecidableEq ι] (e : E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜
protected theorem repr_symm_single [DecidableEq ι] (b : OrthonormalBasis ι 𝕜 E) (i : ι) :
b.repr.symm (EuclideanSpace.single i (1 : 𝕜)) = b i := by
-- Porting note: simplified with `congr!`
- dsimp only [FunLike.coe]
+ dsimp only [DFunLike.coe]
congr!
#align orthonormal_basis.repr_symm_single OrthonormalBasis.repr_symm_single
This adds the (unique) C⋆-norm on matrices Matrix n n 𝕜
with IsROrC 𝕜
within the scope Matrix.L2OpNorm
. This norm coincides with the operator norm induced by the ℓ² norm (i.e., the norm on Matrix m n 𝕜
obtained by pulling back the norm from EuclideanSpace 𝕜 n →L[𝕜] EuclideanSpace 𝕜 m
). Where possible, we state results for rectangular matrices.
@@ -1034,6 +1034,11 @@ theorem toEuclideanLin_eq_toLin :
rfl
#align matrix.to_euclidean_lin_eq_to_lin Matrix.toEuclideanLin_eq_toLin
+open EuclideanSpace in
+lemma toEuclideanLin_eq_toLin_orthonormal :
+ toEuclideanLin = toLin (basisFun n 𝕜).toBasis (basisFun m 𝕜).toBasis :=
+ rfl
+
end Matrix
local notation "⟪" x ", " y "⟫ₑ" =>
@@ -738,11 +738,10 @@ theorem OrthonormalBasis.toMatrix_orthonormalBasis_mem_unitary :
unit length. -/
@[simp]
theorem OrthonormalBasis.det_to_matrix_orthonormalBasis : ‖a.toBasis.det b‖ = 1 := by
- have : (normSq (a.toBasis.det b) : 𝕜) = 1 := by
- simpa [IsROrC.mul_conj] using
- (Matrix.det_of_mem_unitary (a.toMatrix_orthonormalBasis_mem_unitary b)).2
+ have := (Matrix.det_of_mem_unitary (a.toMatrix_orthonormalBasis_mem_unitary b)).2
+ rw [star_def, IsROrC.mul_conj] at this
norm_cast at this
- rwa [← sqrt_normSq_eq_norm, sqrt_eq_one]
+ rwa [pow_eq_one_iff_of_nonneg (norm_nonneg _) two_ne_zero] at this
#align orthonormal_basis.det_to_matrix_orthonormal_basis OrthonormalBasis.det_to_matrix_orthonormalBasis
end
This is just a repackaging of existing lemmas, except that the correct name is already taken by the Set
version, so we fix that too.
From LeanAPAP
@@ -805,7 +805,7 @@ theorem Orthonormal.exists_orthonormalBasis_extension (hv : Orthonormal 𝕜 ((
∃ (u : Finset E) (b : OrthonormalBasis u 𝕜 E), v ⊆ u ∧ ⇑b = ((↑) : u → E) := by
obtain ⟨u₀, hu₀s, hu₀, hu₀_max⟩ := exists_maximal_orthonormal hv
rw [maximal_orthonormal_iff_orthogonalComplement_eq_bot hu₀] at hu₀_max
- have hu₀_finite : u₀.Finite := hu₀.linearIndependent.finite
+ have hu₀_finite : u₀.Finite := hu₀.linearIndependent.setFinite
let u : Finset E := hu₀_finite.toFinset
let fu : ↥u ≃ ↥u₀ := hu₀_finite.subtypeEquivToFinset.symm
have hu : Orthonormal 𝕜 ((↑) : u → E) := by simpa using hu₀.comp _ fu.injective
Filter.map_smul
(#8935)
We use SMulHomClass.map_smul
much more often, even when the Filter
namespace is opened.
@@ -369,7 +369,7 @@ instance instFunLike : FunLike (OrthonormalBasis ι 𝕜 E) ι fun _ => E where
have : k = k • (1 : 𝕜) := by rw [smul_eq_mul, mul_one]
rw [this, Pi.single_smul]
replace h := congr_fun h i
- simp only [LinearEquiv.comp_coe, SMulHomClass.map_smul, LinearEquiv.coe_coe,
+ simp only [LinearEquiv.comp_coe, map_smul, LinearEquiv.coe_coe,
LinearEquiv.trans_apply, WithLp.linearEquiv_symm_apply, WithLp.equiv_symm_single,
LinearIsometryEquiv.coe_toLinearEquiv] at h ⊢
rw [h]
@@ -457,7 +457,7 @@ protected theorem sum_inner_mul_inner (b : OrthonormalBasis ι 𝕜 E) (x y : E)
have := congr_arg (innerSL 𝕜 x) (b.sum_repr y)
rw [map_sum] at this
convert this
- rw [SMulHomClass.map_smul, b.repr_apply_apply, mul_comm]
+ rw [map_smul, b.repr_apply_apply, mul_comm]
simp only [innerSL_apply, smul_eq_mul] -- Porting note: was `rfl`
#align orthonormal_basis.sum_inner_mul_inner OrthonormalBasis.sum_inner_mul_inner
This is the supremum of
along with some minor fixes from failures on nightly-testing as Mathlib master
is merged into it.
Note that some PRs for changes that are already compatible with the current toolchain and will be necessary have already been split out: #8380.
I am hopeful that in future we will be able to progressively merge adaptation PRs into a bump/v4.X.0
branch, so we never end up with a "big merge" like this. However one of these adaptation PRs (#8056) predates my new scheme for combined CI, and it wasn't possible to keep that PR viable in the meantime.
In particular this includes adjustments for the Lean PRs
We can get rid of all the
local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue [lean4#2220](https://github.com/leanprover/lean4/pull/2220)
macros across Mathlib (and in any projects that want to write natural number powers of reals).
Changes the default behaviour of simp
to (config := {decide := false})
. This makes simp
(and consequentially norm_num
) less powerful, but also more consistent, and less likely to blow up in long failures. This requires a variety of changes: changing some previously by simp
or norm_num
to decide
or rfl
, or adding (config := {decide := true})
.
This changed the behaviour of simp
so that simp [f]
will only unfold "fully applied" occurrences of f
. The old behaviour can be recovered with simp (config := { unfoldPartialApp := true })
. We may in future add a syntax for this, e.g. simp [!f]
; please provide feedback! In the meantime, we have made the following changes:
(config := { unfoldPartialApp := true })
in some places, to recover the old behaviour@[eqns]
to manually adjust the equation lemmas for a particular definition, recovering the old behaviour just for that definition. See #8371, where we do this for Function.comp
and Function.flip
.This change in Lean may require further changes down the line (e.g. adding the !f
syntax, and/or upstreaming the special treatment for Function.comp
and Function.flip
, and/or removing this special treatment). Please keep an open and skeptical mind about these changes!
Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Mauricio Collares <mauricio@collares.org>
@@ -53,8 +53,6 @@ For consequences in infinite dimension (Hilbert bases, etc.), see the file
-/
-local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
-
set_option linter.uppercaseLean3 false
open Real Set Filter IsROrC Submodule Function BigOperators Uniformity Topology NNReal ENNReal
@@ -809,9 +809,8 @@ theorem Orthonormal.exists_orthonormalBasis_extension (hv : Orthonormal 𝕜 ((
rw [maximal_orthonormal_iff_orthogonalComplement_eq_bot hu₀] at hu₀_max
have hu₀_finite : u₀.Finite := hu₀.linearIndependent.finite
let u : Finset E := hu₀_finite.toFinset
- let fu : ↥u ≃ ↥u₀ := Equiv.cast (congr_arg (↥) hu₀_finite.coe_toFinset)
- have hfu : ((↑) : u → E) = ((↑) : u₀ → E) ∘ fu := by ext; simp
- have hu : Orthonormal 𝕜 ((↑) : u → E) := by simpa [hfu] using hu₀.comp _ fu.injective
+ let fu : ↥u ≃ ↥u₀ := hu₀_finite.subtypeEquivToFinset.symm
+ have hu : Orthonormal 𝕜 ((↑) : u → E) := by simpa using hu₀.comp _ fu.injective
refine' ⟨u, OrthonormalBasis.mkOfOrthogonalEqBot hu _, _, _⟩
· simpa using hu₀_max
· simpa using hu₀s
We prove the formula for the area of a disc
theorem volume_ball (x : EuclideanSpace ℝ (Fin 2)) (r : ℝ) :
volume (Metric.ball x r) = NNReal.pi * (ENNReal.ofReal r) ^ 2
and deduce from this, the volume of complex balls
theorem volume_ball (a : ℂ) (r : ℝ) :
volume (Metric.ball a r) = NNReal.pi * (ENNReal.ofReal r) ^ 2
Co-authored-by: James Arthur Co-authored-by: Benjamin Davidson Co-authored-by: Andrew Souther
Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -140,6 +140,24 @@ theorem EuclideanSpace.edist_eq {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintyp
PiLp.edist_eq_of_L2 x y
#align euclidean_space.edist_eq EuclideanSpace.edist_eq
+theorem EuclideanSpace.ball_zero_eq {n : Type*} [Fintype n] (r : ℝ) (hr : 0 ≤ r) :
+ Metric.ball (0 : EuclideanSpace ℝ n) r = {x | ∑ i, x i ^ 2 < r ^ 2} := by
+ ext x
+ have : (0 : ℝ) ≤ ∑ i, x i ^ 2 := Finset.sum_nonneg fun _ _ => sq_nonneg _
+ simp_rw [mem_setOf, mem_ball_zero_iff, norm_eq, norm_eq_abs, sq_abs, sqrt_lt this hr]
+
+theorem EuclideanSpace.closedBall_zero_eq {n : Type*} [Fintype n] (r : ℝ) (hr : 0 ≤ r) :
+ Metric.closedBall (0 : EuclideanSpace ℝ n) r = {x | ∑ i, x i ^ 2 ≤ r ^ 2} := by
+ ext
+ simp_rw [mem_setOf, mem_closedBall_zero_iff, norm_eq, norm_eq_abs, sq_abs, sqrt_le_left hr]
+
+theorem EuclideanSpace.sphere_zero_eq {n : Type*} [Fintype n] (r : ℝ) (hr : 0 ≤ r) :
+ Metric.sphere (0 : EuclideanSpace ℝ n) r = {x | ∑ i, x i ^ 2 = r ^ 2} := by
+ ext x
+ have : (0 : ℝ) ≤ ∑ i, x i ^ 2 := Finset.sum_nonneg fun _ _ => sq_nonneg _
+ simp_rw [mem_setOf, mem_sphere_zero_iff_norm, norm_eq, norm_eq_abs, sq_abs,
+ sqrt_eq_iff_sq_eq this hr, eq_comm]
+
variable [Fintype ι]
section
@@ -422,8 +422,9 @@ protected theorem coe_toBasis_repr (b : OrthonormalBasis ι 𝕜 E) :
@[simp]
protected theorem coe_toBasis_repr_apply (b : OrthonormalBasis ι 𝕜 E) (x : E) (i : ι) :
b.toBasis.repr x i = b.repr x i := by
- rw [← Basis.equivFun_apply, OrthonormalBasis.coe_toBasis_repr,
- LinearIsometryEquiv.coe_toLinearEquiv]
+ rw [← Basis.equivFun_apply, OrthonormalBasis.coe_toBasis_repr];
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [LinearIsometryEquiv.coe_toLinearEquiv]
#align orthonormal_basis.coe_to_basis_repr_apply OrthonormalBasis.coe_toBasis_repr_apply
protected theorem sum_repr (b : OrthonormalBasis ι 𝕜 E) (x : E) : ∑ i, b.repr x i • b i = x := by
@@ -422,9 +422,8 @@ protected theorem coe_toBasis_repr (b : OrthonormalBasis ι 𝕜 E) :
@[simp]
protected theorem coe_toBasis_repr_apply (b : OrthonormalBasis ι 𝕜 E) (x : E) (i : ι) :
b.toBasis.repr x i = b.repr x i := by
- rw [← Basis.equivFun_apply, OrthonormalBasis.coe_toBasis_repr];
- -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
- erw [LinearIsometryEquiv.coe_toLinearEquiv]
+ rw [← Basis.equivFun_apply, OrthonormalBasis.coe_toBasis_repr,
+ LinearIsometryEquiv.coe_toLinearEquiv]
#align orthonormal_basis.coe_to_basis_repr_apply OrthonormalBasis.coe_toBasis_repr_apply
protected theorem sum_repr (b : OrthonormalBasis ι 𝕜 E) (x : E) : ∑ i, b.repr x i • b i = x := by
@@ -422,8 +422,9 @@ protected theorem coe_toBasis_repr (b : OrthonormalBasis ι 𝕜 E) :
@[simp]
protected theorem coe_toBasis_repr_apply (b : OrthonormalBasis ι 𝕜 E) (x : E) (i : ι) :
b.toBasis.repr x i = b.repr x i := by
- rw [← Basis.equivFun_apply, OrthonormalBasis.coe_toBasis_repr,
- LinearIsometryEquiv.coe_toLinearEquiv]
+ rw [← Basis.equivFun_apply, OrthonormalBasis.coe_toBasis_repr];
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [LinearIsometryEquiv.coe_toLinearEquiv]
#align orthonormal_basis.coe_to_basis_repr_apply OrthonormalBasis.coe_toBasis_repr_apply
protected theorem sum_repr (b : OrthonormalBasis ι 𝕜 E) (x : E) : ∑ i, b.repr x i • b i = x := by
We prove that the two MeasureSpace
structures on $\mathbb{R}^\iota$, the one coming from its identification with ι→ ℝ
and the one coming from EuclideanSpace ℝ ι
, agree in the sense that the measure equivalence between the two corresponding volumes is measure preserving.
Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -334,10 +334,6 @@ variable {ι 𝕜 E}
namespace OrthonormalBasis
-instance instInhabited : Inhabited (OrthonormalBasis ι 𝕜 (EuclideanSpace 𝕜 ι)) :=
- ⟨ofRepr (LinearIsometryEquiv.refl 𝕜 (EuclideanSpace 𝕜 ι))⟩
-#align orthonormal_basis.inhabited OrthonormalBasis.instInhabited
-
theorem repr_injective :
Injective (repr : OrthonormalBasis ι 𝕜 E → E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜 ι) := fun f g h => by
cases f
@@ -612,6 +608,31 @@ protected theorem repr_reindex (b : OrthonormalBasis ι 𝕜 E) (e : ι ≃ ι')
end OrthonormalBasis
+namespace EuclideanSpace
+
+variable (𝕜 ι)
+
+/-- The basis `Pi.basisFun`, bundled as an orthornormal basis of `EuclideanSpace 𝕜 ι`. -/
+noncomputable def basisFun : OrthonormalBasis ι 𝕜 (EuclideanSpace 𝕜 ι) :=
+ ⟨LinearIsometryEquiv.refl _ _⟩
+
+@[simp]
+theorem basisFun_apply [DecidableEq ι] (i : ι) : basisFun ι 𝕜 i = EuclideanSpace.single i 1 :=
+ PiLp.basisFun_apply _ _ _ _
+
+@[simp]
+theorem basisFun_repr (x : EuclideanSpace 𝕜 ι) (i : ι) : (basisFun ι 𝕜).repr x i = x i := rfl
+
+theorem basisFun_toBasis : (basisFun ι 𝕜).toBasis = PiLp.basisFun _ 𝕜 ι := rfl
+
+end EuclideanSpace
+
+instance OrthonormalBasis.instInhabited : Inhabited (OrthonormalBasis ι 𝕜 (EuclideanSpace 𝕜 ι)) :=
+ ⟨EuclideanSpace.basisFun ι 𝕜⟩
+#align orthonormal_basis.inhabited OrthonormalBasis.instInhabited
+
+section Complex
+
/-- `![1, I]` is an orthonormal basis for `ℂ` considered as a real inner product space. -/
def Complex.orthonormalBasisOneI : OrthonormalBasis (Fin 2) ℝ ℂ :=
Complex.basisOneI.toOrthonormalBasis
@@ -671,6 +692,8 @@ theorem Complex.isometryOfOrthonormal_apply (v : OrthonormalBasis (Fin 2) ℝ F)
simp [← v.sum_repr_symm]
#align complex.isometry_of_orthonormal_apply Complex.isometryOfOrthonormal_apply
+end Complex
+
open FiniteDimensional
/-! ### Matrix representation of an orthonormal basis with respect to another -/
This removes the (PiLp.equiv 2 fun i => α i)
abbreviation, replacing it with its implementation (WithLp.equiv 2 (∀ i, α i))
. The same thing is done for PiLp.linearEquiv
.
@@ -166,12 +166,12 @@ theorem finrank_euclideanSpace_fin {n : ℕ} :
#align finrank_euclidean_space_fin finrank_euclideanSpace_fin
theorem EuclideanSpace.inner_eq_star_dotProduct (x y : EuclideanSpace 𝕜 ι) :
- ⟪x, y⟫ = Matrix.dotProduct (star <| PiLp.equiv _ _ x) (PiLp.equiv _ _ y) :=
+ ⟪x, y⟫ = Matrix.dotProduct (star <| WithLp.equiv _ _ x) (WithLp.equiv _ _ y) :=
rfl
#align euclidean_space.inner_eq_star_dot_product EuclideanSpace.inner_eq_star_dotProduct
theorem EuclideanSpace.inner_piLp_equiv_symm (x y : ι → 𝕜) :
- ⟪(PiLp.equiv 2 _).symm x, (PiLp.equiv 2 _).symm y⟫ = Matrix.dotProduct (star x) y :=
+ ⟪(WithLp.equiv 2 _).symm x, (WithLp.equiv 2 _).symm y⟫ = Matrix.dotProduct (star x) y :=
rfl
#align euclidean_space.inner_pi_Lp_equiv_symm EuclideanSpace.inner_piLp_equiv_symm
@@ -227,7 +227,7 @@ variable {ι 𝕜}
/-- The projection on the `i`-th coordinate of `EuclideanSpace 𝕜 ι`, as a linear map. -/
@[simps!]
def EuclideanSpace.projₗ (i : ι) : EuclideanSpace 𝕜 ι →ₗ[𝕜] 𝕜 :=
- (LinearMap.proj i).comp (PiLp.linearEquiv 2 𝕜 fun _ : ι => 𝕜 : EuclideanSpace 𝕜 ι →ₗ[𝕜] ι → 𝕜)
+ (LinearMap.proj i).comp (WithLp.linearEquiv 2 𝕜 (ι → 𝕜) : EuclideanSpace 𝕜 ι →ₗ[𝕜] ι → 𝕜)
#align euclidean_space.projₗ EuclideanSpace.projₗ
#align euclidean_space.projₗ_apply EuclideanSpace.projₗ_apply
@@ -245,25 +245,25 @@ def EuclideanSpace.proj (i : ι) : EuclideanSpace 𝕜 ι →L[𝕜] 𝕜 :=
/-- The vector given in euclidean space by being `1 : 𝕜` at coordinate `i : ι` and `0 : 𝕜` at
all other coordinates. -/
def EuclideanSpace.single [DecidableEq ι] (i : ι) (a : 𝕜) : EuclideanSpace 𝕜 ι :=
- (PiLp.equiv _ _).symm (Pi.single i a)
+ (WithLp.equiv _ _).symm (Pi.single i a)
#align euclidean_space.single EuclideanSpace.single
@[simp]
-theorem PiLp.equiv_single [DecidableEq ι] (i : ι) (a : 𝕜) :
- PiLp.equiv _ _ (EuclideanSpace.single i a) = Pi.single i a :=
+theorem WithLp.equiv_single [DecidableEq ι] (i : ι) (a : 𝕜) :
+ WithLp.equiv _ _ (EuclideanSpace.single i a) = Pi.single i a :=
rfl
-#align pi_Lp.equiv_single PiLp.equiv_single
+#align pi_Lp.equiv_single WithLp.equiv_single
@[simp]
-theorem PiLp.equiv_symm_single [DecidableEq ι] (i : ι) (a : 𝕜) :
- (PiLp.equiv _ _).symm (Pi.single i a) = EuclideanSpace.single i a :=
+theorem WithLp.equiv_symm_single [DecidableEq ι] (i : ι) (a : 𝕜) :
+ (WithLp.equiv _ _).symm (Pi.single i a) = EuclideanSpace.single i a :=
rfl
-#align pi_Lp.equiv_symm_single PiLp.equiv_symm_single
+#align pi_Lp.equiv_symm_single WithLp.equiv_symm_single
@[simp]
theorem EuclideanSpace.single_apply [DecidableEq ι] (i : ι) (a : 𝕜) (j : ι) :
(EuclideanSpace.single i a) j = ite (j = i) a 0 := by
- rw [EuclideanSpace.single, PiLp.equiv_symm_apply, ← Pi.single_apply i a j]
+ rw [EuclideanSpace.single, WithLp.equiv_symm_pi_apply, ← Pi.single_apply i a j]
#align euclidean_space.single_apply EuclideanSpace.single_apply
theorem EuclideanSpace.inner_single_left [DecidableEq ι] (i : ι) (a : 𝕜) (v : EuclideanSpace 𝕜 ι) :
@@ -351,14 +351,14 @@ instance instFunLike : FunLike (OrthonormalBasis ι 𝕜 E) ι fun _ => E where
coe_injective' b b' h := repr_injective <| LinearIsometryEquiv.toLinearEquiv_injective <|
LinearEquiv.symm_bijective.injective <| LinearEquiv.toLinearMap_injective <| by
classical
- rw [← LinearMap.cancel_right (PiLp.linearEquiv 2 𝕜 (fun _ => 𝕜)).symm.surjective]
+ rw [← LinearMap.cancel_right (WithLp.linearEquiv 2 𝕜 (_ → 𝕜)).symm.surjective]
simp only [LinearIsometryEquiv.toLinearEquiv_symm]
refine LinearMap.pi_ext fun i k => ?_
have : k = k • (1 : 𝕜) := by rw [smul_eq_mul, mul_one]
rw [this, Pi.single_smul]
replace h := congr_fun h i
simp only [LinearEquiv.comp_coe, SMulHomClass.map_smul, LinearEquiv.coe_coe,
- LinearEquiv.trans_apply, WithLp.linearEquiv_symm_apply, PiLp.equiv_symm_single,
+ LinearEquiv.trans_apply, WithLp.linearEquiv_symm_apply, WithLp.equiv_symm_single,
LinearIsometryEquiv.coe_toLinearEquiv] at h ⊢
rw [h]
@@ -972,20 +972,20 @@ variable [Fintype m] [Fintype n] [DecidableEq n]
/-- `Matrix.toLin'` adapted for `EuclideanSpace 𝕜 _`. -/
def toEuclideanLin : Matrix m n 𝕜 ≃ₗ[𝕜] EuclideanSpace 𝕜 n →ₗ[𝕜] EuclideanSpace 𝕜 m :=
Matrix.toLin' ≪≫ₗ
- LinearEquiv.arrowCongr (PiLp.linearEquiv _ 𝕜 fun _ : n => 𝕜).symm
- (PiLp.linearEquiv _ 𝕜 fun _ : m => 𝕜).symm
+ LinearEquiv.arrowCongr (WithLp.linearEquiv _ 𝕜 (n → 𝕜)).symm
+ (WithLp.linearEquiv _ 𝕜 (m → 𝕜)).symm
#align matrix.to_euclidean_lin Matrix.toEuclideanLin
@[simp]
theorem toEuclideanLin_piLp_equiv_symm (A : Matrix m n 𝕜) (x : n → 𝕜) :
- Matrix.toEuclideanLin A ((PiLp.equiv _ _).symm x) =
- (PiLp.equiv _ _).symm (Matrix.toLin' A x) :=
+ Matrix.toEuclideanLin A ((WithLp.equiv _ _).symm x) =
+ (WithLp.equiv _ _).symm (Matrix.toLin' A x) :=
rfl
#align matrix.to_euclidean_lin_pi_Lp_equiv_symm Matrix.toEuclideanLin_piLp_equiv_symm
@[simp]
theorem piLp_equiv_toEuclideanLin (A : Matrix m n 𝕜) (x : EuclideanSpace 𝕜 n) :
- PiLp.equiv _ _ (Matrix.toEuclideanLin A x) = Matrix.toLin' A (PiLp.equiv _ _ x) :=
+ WithLp.equiv _ _ (Matrix.toEuclideanLin A x) = Matrix.toLin' A (WithLp.equiv _ _ x) :=
rfl
#align matrix.pi_Lp_equiv_to_euclidean_lin Matrix.piLp_equiv_toEuclideanLin
@@ -999,7 +999,7 @@ theorem toEuclideanLin_eq_toLin :
end Matrix
local notation "⟪" x ", " y "⟫ₑ" =>
- @inner 𝕜 _ _ (Equiv.symm (PiLp.equiv 2 _) x) (Equiv.symm (PiLp.equiv 2 _) y)
+ @inner 𝕜 _ _ (Equiv.symm (WithLp.equiv 2 _) x) (Equiv.symm (WithLp.equiv 2 _) y)
/-- The inner product of a row of `A` and a row of `B` is an entry of `B * Aᴴ`. -/
theorem inner_matrix_row_row [Fintype n] (A B : Matrix m n 𝕜) (i j : m) :
⬝
notation in favor of HMul
(#6487)
The main difficulty here is that *
has a slightly difference precedence to ⬝
. notably around smul
and neg
.
The other annoyance is that ↑U ⬝ A ⬝ ↑U⁻¹ : Matrix m m 𝔸
now has to be written U.val * A * (U⁻¹).val
in order to typecheck.
A downside of this change to consider: if you have a goal of A * (B * C) = (A * B) * C
, mul_assoc
now gives the illusion of matching, when in fact Matrix.mul_assoc
is needed. Previously the distinct symbol made it easy to avoid this mistake.
On the flipside, there is now no need to rewrite by Matrix.mul_eq_mul
all the time (indeed, the lemma is now removed).
@@ -1001,16 +1001,16 @@ end Matrix
local notation "⟪" x ", " y "⟫ₑ" =>
@inner 𝕜 _ _ (Equiv.symm (PiLp.equiv 2 _) x) (Equiv.symm (PiLp.equiv 2 _) y)
-/-- The inner product of a row of `A` and a row of `B` is an entry of `B ⬝ Aᴴ`. -/
+/-- The inner product of a row of `A` and a row of `B` is an entry of `B * Aᴴ`. -/
theorem inner_matrix_row_row [Fintype n] (A B : Matrix m n 𝕜) (i j : m) :
- ⟪A i, B j⟫ₑ = (B ⬝ Aᴴ) j i := by
+ ⟪A i, B j⟫ₑ = (B * Aᴴ) j i := by
simp_rw [EuclideanSpace.inner_piLp_equiv_symm, Matrix.mul_apply', Matrix.dotProduct_comm,
Matrix.conjTranspose_apply, Pi.star_def]
#align inner_matrix_row_row inner_matrix_row_row
-/-- The inner product of a column of `A` and a column of `B` is an entry of `Aᴴ ⬝ B`. -/
+/-- The inner product of a column of `A` and a column of `B` is an entry of `Aᴴ * B`. -/
theorem inner_matrix_col_col [Fintype m] (A B : Matrix m n 𝕜) (i j : n) :
- ⟪Aᵀ i, Bᵀ j⟫ₑ = (Aᴴ ⬝ B) i j :=
+ ⟪Aᵀ i, Bᵀ j⟫ₑ = (Aᴴ * B) i j :=
rfl
#align inner_matrix_col_col inner_matrix_col_col
@@ -158,7 +158,7 @@ instance EuclideanSpace.instInnerProductSpace : InnerProductSpace 𝕜 (Euclidea
@[simp]
theorem finrank_euclideanSpace :
FiniteDimensional.finrank 𝕜 (EuclideanSpace 𝕜 ι) = Fintype.card ι := by
- simp [EuclideanSpace, PiLp]
+ simp [EuclideanSpace, PiLp, WithLp]
#align finrank_euclidean_space finrank_euclideanSpace
theorem finrank_euclideanSpace_fin {n : ℕ} :
@@ -358,7 +358,7 @@ instance instFunLike : FunLike (OrthonormalBasis ι 𝕜 E) ι fun _ => E where
rw [this, Pi.single_smul]
replace h := congr_fun h i
simp only [LinearEquiv.comp_coe, SMulHomClass.map_smul, LinearEquiv.coe_coe,
- LinearEquiv.trans_apply, PiLp.linearEquiv_symm_apply, PiLp.equiv_symm_single,
+ LinearEquiv.trans_apply, WithLp.linearEquiv_symm_apply, PiLp.equiv_symm_single,
LinearIsometryEquiv.coe_toLinearEquiv] at h ⊢
rw [h]
abbrev
(#6503)
This definition already exists elsewhere more generally, but this spelling is admittedly easier to find.
@@ -212,17 +212,14 @@ end
variable (ι 𝕜)
--- TODO : This should be generalized to `PiLp` with finite dimensional factors.
-/-- `PiLp.linearEquiv` upgraded to a continuous linear map between `EuclideanSpace 𝕜 ι`
-and `ι → 𝕜`. -/
-@[simps! toLinearEquiv_apply apply toLinearEquiv_symm_apply symm_apply]
-def EuclideanSpace.equiv : EuclideanSpace 𝕜 ι ≃L[𝕜] ι → 𝕜 :=
- (PiLp.linearEquiv 2 𝕜 fun _ : ι => 𝕜).toContinuousLinearEquiv
+/-- A shorthand for `PiLp.continuousLinearEquiv`. -/
+abbrev EuclideanSpace.equiv : EuclideanSpace 𝕜 ι ≃L[𝕜] ι → 𝕜 :=
+ PiLp.continuousLinearEquiv 2 𝕜 _
#align euclidean_space.equiv EuclideanSpace.equiv
-#align euclidean_space.equiv_to_linear_equiv_apply EuclideanSpace.equiv_toLinearEquiv_apply
-#align euclidean_space.equiv_apply EuclideanSpace.equiv_apply
-#align euclidean_space.equiv_to_linear_equiv_symm_apply EuclideanSpace.equiv_toLinearEquiv_symm_apply
-#align euclidean_space.equiv_symm_apply EuclideanSpace.equiv_symm_apply
+#noalign euclidean_space.equiv_to_linear_equiv_apply
+#noalign euclidean_space.equiv_apply
+#noalign euclidean_space.equiv_to_linear_equiv_symm_apply
+#noalign euclidean_space.equiv_symm_apply
variable {ι 𝕜}
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -62,17 +62,17 @@ open Real Set Filter IsROrC Submodule Function BigOperators Uniformity Topology
noncomputable section
-variable {ι : Type _} {ι' : Type _}
+variable {ι : Type*} {ι' : Type*}
-variable {𝕜 : Type _} [IsROrC 𝕜]
+variable {𝕜 : Type*} [IsROrC 𝕜]
-variable {E : Type _} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E]
+variable {E : Type*} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E]
-variable {E' : Type _} [NormedAddCommGroup E'] [InnerProductSpace 𝕜 E']
+variable {E' : Type*} [NormedAddCommGroup E'] [InnerProductSpace 𝕜 E']
-variable {F : Type _} [NormedAddCommGroup F] [InnerProductSpace ℝ F]
+variable {F : Type*} [NormedAddCommGroup F] [InnerProductSpace ℝ F]
-variable {F' : Type _} [NormedAddCommGroup F'] [InnerProductSpace ℝ F']
+variable {F' : Type*} [NormedAddCommGroup F'] [InnerProductSpace ℝ F']
local notation "⟪" x ", " y "⟫" => @inner 𝕜 _ _ x y
@@ -81,7 +81,7 @@ local notation "⟪" x ", " y "⟫" => @inner 𝕜 _ _ x y
then `Π i, f i` is an inner product space as well. Since `Π i, f i` is endowed with the sup norm,
we use instead `PiLp 2 f` for the product space, which is endowed with the `L^2` norm.
-/
-instance PiLp.innerProductSpace {ι : Type _} [Fintype ι] (f : ι → Type _)
+instance PiLp.innerProductSpace {ι : Type*} [Fintype ι] (f : ι → Type*)
[∀ i, NormedAddCommGroup (f i)] [∀ i, InnerProductSpace 𝕜 (f i)] :
InnerProductSpace 𝕜 (PiLp 2 f) where
inner x y := ∑ i, inner (x i) (y i)
@@ -103,7 +103,7 @@ instance PiLp.innerProductSpace {ι : Type _} [Fintype ι] (f : ι → Type _)
#align pi_Lp.inner_product_space PiLp.innerProductSpace
@[simp]
-theorem PiLp.inner_apply {ι : Type _} [Fintype ι] {f : ι → Type _} [∀ i, NormedAddCommGroup (f i)]
+theorem PiLp.inner_apply {ι : Type*} [Fintype ι] {f : ι → Type*} [∀ i, NormedAddCommGroup (f i)]
[∀ i, InnerProductSpace 𝕜 (f i)] (x y : PiLp 2 f) : ⟪x, y⟫ = ∑ i, ⟪x i, y i⟫ :=
rfl
#align pi_Lp.inner_apply PiLp.inner_apply
@@ -111,31 +111,31 @@ theorem PiLp.inner_apply {ι : Type _} [Fintype ι] {f : ι → Type _} [∀ i,
/-- The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
space use `EuclideanSpace 𝕜 (Fin n)`. -/
@[reducible, nolint unusedArguments]
-def EuclideanSpace (𝕜 : Type _) [IsROrC 𝕜] (n : Type _) [Fintype n] : Type _ :=
+def EuclideanSpace (𝕜 : Type*) [IsROrC 𝕜] (n : Type*) [Fintype n] : Type _ :=
PiLp 2 fun _ : n => 𝕜
#align euclidean_space EuclideanSpace
-theorem EuclideanSpace.nnnorm_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
+theorem EuclideanSpace.nnnorm_eq {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n]
(x : EuclideanSpace 𝕜 n) : ‖x‖₊ = NNReal.sqrt (∑ i, ‖x i‖₊ ^ 2) :=
PiLp.nnnorm_eq_of_L2 x
#align euclidean_space.nnnorm_eq EuclideanSpace.nnnorm_eq
-theorem EuclideanSpace.norm_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
+theorem EuclideanSpace.norm_eq {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n]
(x : EuclideanSpace 𝕜 n) : ‖x‖ = Real.sqrt (∑ i, ‖x i‖ ^ 2) := by
simpa only [Real.coe_sqrt, NNReal.coe_sum] using congr_arg ((↑) : ℝ≥0 → ℝ) x.nnnorm_eq
#align euclidean_space.norm_eq EuclideanSpace.norm_eq
-theorem EuclideanSpace.dist_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
+theorem EuclideanSpace.dist_eq {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : dist x y = (∑ i, dist (x i) (y i) ^ 2).sqrt :=
PiLp.dist_eq_of_L2 x y
#align euclidean_space.dist_eq EuclideanSpace.dist_eq
-theorem EuclideanSpace.nndist_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
+theorem EuclideanSpace.nndist_eq {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : nndist x y = NNReal.sqrt (∑ i, nndist (x i) (y i) ^ 2) :=
PiLp.nndist_eq_of_L2 x y
#align euclidean_space.nndist_eq EuclideanSpace.nndist_eq
-theorem EuclideanSpace.edist_eq {𝕜 : Type _} [IsROrC 𝕜] {n : Type _} [Fintype n]
+theorem EuclideanSpace.edist_eq {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : edist x y = (∑ i, edist (x i) (y i) ^ 2) ^ (1 / 2 : ℝ) :=
PiLp.edist_eq_of_L2 x y
#align euclidean_space.edist_eq EuclideanSpace.edist_eq
@@ -316,7 +316,7 @@ theorem EuclideanSpace.orthonormal_single [DecidableEq ι] :
trivial
#align euclidean_space.orthonormal_single EuclideanSpace.orthonormal_single
-theorem EuclideanSpace.piLpCongrLeft_single [DecidableEq ι] {ι' : Type _} [Fintype ι']
+theorem EuclideanSpace.piLpCongrLeft_single [DecidableEq ι] {ι' : Type*} [Fintype ι']
[DecidableEq ι'] (e : ι' ≃ ι) (i' : ι') (v : 𝕜) :
LinearIsometryEquiv.piLpCongrLeft 2 𝕜 𝕜 e (EuclideanSpace.single i' v) =
EuclideanSpace.single (e i') v :=
@@ -459,19 +459,19 @@ protected theorem orthogonalProjection_eq_sum {U : Submodule 𝕜 E} [CompleteSp
#align orthonormal_basis.orthogonal_projection_eq_sum OrthonormalBasis.orthogonalProjection_eq_sum
/-- Mapping an orthonormal basis along a `LinearIsometryEquiv`. -/
-protected def map {G : Type _} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
+protected def map {G : Type*} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
(b : OrthonormalBasis ι 𝕜 E) (L : E ≃ₗᵢ[𝕜] G) : OrthonormalBasis ι 𝕜 G where
repr := L.symm.trans b.repr
#align orthonormal_basis.map OrthonormalBasis.map
@[simp]
-protected theorem map_apply {G : Type _} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
+protected theorem map_apply {G : Type*} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
(b : OrthonormalBasis ι 𝕜 E) (L : E ≃ₗᵢ[𝕜] G) (i : ι) : b.map L i = L (b i) :=
rfl
#align orthonormal_basis.map_apply OrthonormalBasis.map_apply
@[simp]
-protected theorem toBasis_map {G : Type _} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
+protected theorem toBasis_map {G : Type*} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
(b : OrthonormalBasis ι 𝕜 E) (L : E ≃ₗᵢ[𝕜] G) :
(b.map L).toBasis = b.toBasis.map L.toLinearEquiv :=
rfl
@@ -745,7 +745,7 @@ of the components of the direct sum, the disjoint union of these orthonormal bas
orthonormal basis for `M`. -/
noncomputable def DirectSum.IsInternal.collectedOrthonormalBasis
(hV : OrthogonalFamily 𝕜 (fun i => A i) fun i => (A i).subtypeₗᵢ) [DecidableEq ι]
- (hV_sum : DirectSum.IsInternal fun i => A i) {α : ι → Type _} [∀ i, Fintype (α i)]
+ (hV_sum : DirectSum.IsInternal fun i => A i) {α : ι → Type*} [∀ i, Fintype (α i)]
(v_family : ∀ i, OrthonormalBasis (α i) 𝕜 (A i)) : OrthonormalBasis (Σi, α i) 𝕜 E :=
(hV_sum.collectedBasis fun i => (v_family i).toBasis).toOrthonormalBasis <| by
simpa using
@@ -753,7 +753,7 @@ noncomputable def DirectSum.IsInternal.collectedOrthonormalBasis
#align direct_sum.is_internal.collected_orthonormal_basis DirectSum.IsInternal.collectedOrthonormalBasis
theorem DirectSum.IsInternal.collectedOrthonormalBasis_mem [DecidableEq ι]
- (h : DirectSum.IsInternal A) {α : ι → Type _} [∀ i, Fintype (α i)]
+ (h : DirectSum.IsInternal A) {α : ι → Type*} [∀ i, Fintype (α i)]
(hV : OrthogonalFamily 𝕜 (fun i => A i) fun i => (A i).subtypeₗᵢ)
(v : ∀ i, OrthonormalBasis (α i) 𝕜 (A i)) (a : Σi, α i) :
h.collectedOrthonormalBasis hV v a ∈ A a.1 := by
@@ -779,7 +779,7 @@ theorem Orthonormal.exists_orthonormalBasis_extension (hv : Orthonormal 𝕜 ((
· simp
#align orthonormal.exists_orthonormal_basis_extension Orthonormal.exists_orthonormalBasis_extension
-theorem Orthonormal.exists_orthonormalBasis_extension_of_card_eq {ι : Type _} [Fintype ι]
+theorem Orthonormal.exists_orthonormalBasis_extension_of_card_eq {ι : Type*} [Fintype ι]
(card_ι : finrank 𝕜 E = Fintype.card ι) {v : ι → E} {s : Set ι}
(hv : Orthonormal 𝕜 (s.restrict v)) : ∃ b : OrthonormalBasis ι 𝕜 E, ∀ i ∈ s, b i = v i := by
have hsv : Injective (s.restrict v) := hv.linearIndependent.injective
@@ -887,7 +887,7 @@ def OrthonormalBasis.fromOrthogonalSpanSingleton (n : ℕ) [Fact (finrank 𝕜 E
section LinearIsometry
-variable {V : Type _} [NormedAddCommGroup V] [InnerProductSpace 𝕜 V] [FiniteDimensional 𝕜 V]
+variable {V : Type*} [NormedAddCommGroup V] [InnerProductSpace 𝕜 V] [FiniteDimensional 𝕜 V]
variable {S : Submodule 𝕜 V} {L : S →ₗᵢ[𝕜] V}
@@ -966,7 +966,7 @@ section Matrix
open Matrix
-variable {m n : Type _}
+variable {m n : Type*}
namespace Matrix
@@ -53,7 +53,7 @@ For consequences in infinite dimension (Hilbert bases, etc.), see the file
-/
-local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue #2220
+local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
set_option linter.uppercaseLean3 false
@@ -2,17 +2,14 @@
Copyright (c) 2020 Joseph Myers. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Myers, Sébastien Gouëzel, Heather Macbeth
-
-! This file was ported from Lean 3 source module analysis.inner_product_space.pi_L2
-! leanprover-community/mathlib commit 13bce9a6b6c44f6b4c91ac1c1d2a816e2533d395
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Analysis.InnerProductSpace.Projection
import Mathlib.Analysis.NormedSpace.PiLp
import Mathlib.LinearAlgebra.FiniteDimensional
import Mathlib.LinearAlgebra.UnitaryGroup
+#align_import analysis.inner_product_space.pi_L2 from "leanprover-community/mathlib"@"13bce9a6b6c44f6b4c91ac1c1d2a816e2533d395"
+
/-!
# `L²` inner product space structure on finite products of inner product spaces
@@ -207,8 +207,8 @@ theorem DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply [DecidableE
let e₂ := LinearEquiv.ofBijective (DirectSum.coeLinearMap V) hV
suffices ∀ v : ⨁ i, V i, e₂ v = ∑ i, e₁ v i by exact this (e₁.symm w)
intro v
- -- Porting note: added `Dfinsupp.lsum`
- simp [DirectSum.coeLinearMap, DirectSum.toModule, Dfinsupp.lsum, Dfinsupp.sumAddHom_apply]
+ -- Porting note: added `DFinsupp.lsum`
+ simp [DirectSum.coeLinearMap, DirectSum.toModule, DFinsupp.lsum, DFinsupp.sumAddHom_apply]
#align direct_sum.is_internal.isometry_L2_of_orthogonal_family_symm_apply DirectSum.IsInternal.isometryL2OfOrthogonalFamily_symm_apply
end
∑'
precedence (#5615)
∑
, ∏
and variants).([^a-zA-Zα-ωΑ-Ω'𝓝ℳ₀𝕂ₛ)]) \(([∑∏][^()∑∏]*,[^()∑∏:]*)\) ([⊂⊆=<≤])
replaced by $1 $2 $3
@@ -436,17 +436,17 @@ protected theorem coe_toBasis_repr_apply (b : OrthonormalBasis ι 𝕜 E) (x : E
LinearIsometryEquiv.coe_toLinearEquiv]
#align orthonormal_basis.coe_to_basis_repr_apply OrthonormalBasis.coe_toBasis_repr_apply
-protected theorem sum_repr (b : OrthonormalBasis ι 𝕜 E) (x : E) : (∑ i, b.repr x i • b i) = x := by
+protected theorem sum_repr (b : OrthonormalBasis ι 𝕜 E) (x : E) : ∑ i, b.repr x i • b i = x := by
simp_rw [← b.coe_toBasis_repr_apply, ← b.coe_toBasis]
exact b.toBasis.sum_repr x
#align orthonormal_basis.sum_repr OrthonormalBasis.sum_repr
protected theorem sum_repr_symm (b : OrthonormalBasis ι 𝕜 E) (v : EuclideanSpace 𝕜 ι) :
- (∑ i, v i • b i) = b.repr.symm v := by simpa using (b.toBasis.equivFun_symm_apply v).symm
+ ∑ i, v i • b i = b.repr.symm v := by simpa using (b.toBasis.equivFun_symm_apply v).symm
#align orthonormal_basis.sum_repr_symm OrthonormalBasis.sum_repr_symm
protected theorem sum_inner_mul_inner (b : OrthonormalBasis ι 𝕜 E) (x y : E) :
- (∑ i, ⟪x, b i⟫ * ⟪b i, y⟫) = ⟪x, y⟫ := by
+ ∑ i, ⟪x, b i⟫ * ⟪b i, y⟫ = ⟪x, y⟫ := by
have := congr_arg (innerSL 𝕜 x) (b.sum_repr y)
rw [map_sum] at this
convert this
ext
(#5258)
Co-authored-by: Xavier Roblot <46200072+xroblot@users.noreply.github.com> Co-authored-by: Joël Riou <joel.riou@universite-paris-saclay.fr> Co-authored-by: Riccardo Brasca <riccardo.brasca@gmail.com> Co-authored-by: Yury G. Kudryashov <urkud@urkud.name> Co-authored-by: Scott Morrison <scott.morrison@anu.edu.au> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Jeremy Tan Jie Rui <reddeloostw@gmail.com> Co-authored-by: Pol'tta / Miyahara Kō <pol_tta@outlook.jp> Co-authored-by: Jason Yuen <jason_yuen2007@hotmail.com> Co-authored-by: Mario Carneiro <di.gama@gmail.com> Co-authored-by: Jireh Loreaux <loreaujy@gmail.com> Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com> Co-authored-by: Kyle Miller <kmill31415@gmail.com> Co-authored-by: Heather Macbeth <25316162+hrmacbeth@users.noreply.github.com> Co-authored-by: Jujian Zhang <jujian.zhang1998@outlook.com> Co-authored-by: Yaël Dillies <yael.dillies@gmail.com>
@@ -694,7 +694,7 @@ variable (a b : OrthonormalBasis ι 𝕜 E)
theorem OrthonormalBasis.toMatrix_orthonormalBasis_mem_unitary :
a.toBasis.toMatrix b ∈ Matrix.unitaryGroup ι 𝕜 := by
rw [Matrix.mem_unitaryGroup_iff']
- ext (i j)
+ ext i j
convert a.repr.inner_map_map (b i) (b j)
rw [orthonormal_iff_ite.mp b.orthonormal i j]
rfl
@@ -537,7 +537,7 @@ protected theorem coe_mk (hon : Orthonormal 𝕜 v) (hsp : ⊤ ≤ Submodule.spa
classical rw [OrthonormalBasis.mk, _root_.Basis.coe_toOrthonormalBasis, Basis.coe_mk]
#align orthonormal_basis.coe_mk OrthonormalBasis.coe_mk
-/-- Any finite subset of a orthonormal family is an `OrthonormalBasis` for its span. -/
+/-- Any finite subset of an orthonormal family is an `OrthonormalBasis` for its span. -/
protected def span [DecidableEq E] {v' : ι' → E} (h : Orthonormal 𝕜 v') (s : Finset ι') :
OrthonormalBasis s 𝕜 (span 𝕜 (s.image v' : Set E)) :=
let e₀' : Basis s 𝕜 _ :=
@@ -28,7 +28,7 @@ between `E` and `EuclideanSpace 𝕜 ι`. Then `stdOrthonormalBasis` shows that
always exists if `E` is finite dimensional. We provide language for converting between a basis
that is orthonormal and an orthonormal basis (e.g. `Basis.toOrthonormalBasis`). We show that
orthonormal bases for each summand in a direct sum of spaces can be combined into an orthonormal
-basis for the the whole sum in `DirectSum.IsInternal.subordinateOrthonormalBasis`. In
+basis for the whole sum in `DirectSum.IsInternal.subordinateOrthonormalBasis`. In
the last section, various properties of matrices are explored.
## Main definitions
@@ -768,7 +768,7 @@ variable [FiniteDimensional 𝕜 E]
/-- In a finite-dimensional `InnerProductSpace`, any orthonormal subset can be extended to an
orthonormal basis. -/
theorem Orthonormal.exists_orthonormalBasis_extension (hv : Orthonormal 𝕜 ((↑) : v → E)) :
- ∃ (u : Finset E)(b : OrthonormalBasis u 𝕜 E), v ⊆ u ∧ ⇑b = ((↑) : u → E) := by
+ ∃ (u : Finset E) (b : OrthonormalBasis u 𝕜 E), v ⊆ u ∧ ⇑b = ((↑) : u → E) := by
obtain ⟨u₀, hu₀s, hu₀, hu₀_max⟩ := exists_maximal_orthonormal hv
rw [maximal_orthonormal_iff_orthogonalComplement_eq_bot hu₀] at hu₀_max
have hu₀_finite : u₀.Finite := hu₀.linearIndependent.finite
@@ -806,7 +806,7 @@ variable (𝕜 E)
/-- A finite-dimensional inner product space admits an orthonormal basis. -/
theorem _root_.exists_orthonormalBasis :
- ∃ (w : Finset E)(b : OrthonormalBasis w 𝕜 E), ⇑b = ((↑) : w → E) :=
+ ∃ (w : Finset E) (b : OrthonormalBasis w 𝕜 E), ⇑b = ((↑) : w → E) :=
let ⟨w, hw, _, hw''⟩ := (orthonormal_empty 𝕜 E).exists_orthonormalBasis_extension
⟨w, hw, hw''⟩
#align exists_orthonormal_basis exists_orthonormalBasis
@@ -38,7 +38,7 @@ the last section, various properties of matrices are explored.
that it is a finite-dimensional inner product space).
- `OrthonormalBasis 𝕜 ι`: defined to be an isometry to Euclidean space from a given
- finite-dimensional innner product space, `E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜 ι`.
+ finite-dimensional inner product space, `E ≃ₗᵢ[𝕜] EuclideanSpace 𝕜 ι`.
- `Basis.toOrthonormalBasis`: constructs an `OrthonormalBasis` for a finite-dimensional
Euclidean space from a `Basis` which is `Orthonormal`.
Some theorems in Analysis.InnerProductSpace.Basic
, such as Orthonormal.inner_right_finsupp
, accidentally gained a new DecidableEq
hypothesis during the port. This removes the hypothesis by using classical!
instead of classical
in their proofs.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Komyyy <pol_tta@outlook.jp>
The unported dependencies are
algebra.order.module
init.core
linear_algebra.free_module.finite.rank
algebra.order.monoid.cancel.defs
algebra.abs
algebra.group_power.lemmas
init.data.list.basic
linear_algebra.free_module.rank
algebra.order.monoid.cancel.basic
init.data.list.default
topology.subset_properties
init.logic
The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file