Analysis II (Tao, 2022) -- Chapter 06 -- Section 01

section Chap06section Section01

Definition 6.1 (Row vectors): for a natural number Unknown identifier `n`n, an Unknown identifier `n`n-dimensional row vector over : Type is represented as a failed to synthesize OfNat (Type ?u.609587) 1 numerals are polymorphic in Lean, but the numeral `1` cannot be used in a context where the expected type is Type ?u.609587 due to the absence of the instance above Hint: Additional diagnostic information may be available using the `set_option diagnostics true` command.sorry × sorry : Type (max u_1 u_2)1 × Unknown identifier `n`n matrix; vector addition, scalar multiplication, the zero vector, and additive inverses are the inherited pointwise operations.

abbrev RowVector (n : ) : Type := Matrix (Fin 1) (Fin n)

Helper for Lemma 6.1: additive-group identities for vectors Fin sorry : TypeFin Unknown identifier `n`n .

lemma helperForLemma_6_1_additiveGroupIdentities (n : ) : x y z : Fin n , x + y = y + x (x + y) + z = x + (y + z) x + 0 = x 0 + x = x x + (-x) = 0 (-x) + x = 0 := by intro x y z constructor · simpa using add_comm x y constructor · simpa using add_assoc x y z constructor · try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa using add_zero x constructor · try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa using zero_add x constructor · try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa using add_neg_cancel x · try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa using neg_add_cancel x

Helper for Lemma 6.1: scalar associativity and scalar unit on Fin sorry : TypeFin Unknown identifier `n`n .

lemma helperForLemma_6_1_scalarAssociativityUnit (n : ) : x : Fin n , c d : , (c * d) x = c (d x) (1 : ) x = x := by intro x c d constructor · simpa using mul_smul c d x · try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa using one_smul x

Helper for Lemma 6.1: scalar distributivity identities on Fin sorry : TypeFin Unknown identifier `n`n .

lemma helperForLemma_6_1_scalarDistributivity (n : ) : x y : Fin n , c d : , c (x + y) = c x + c y (c + d) x = c x + d x := by intro x y c d constructor · try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa using smul_add c x y · simpa using add_smul c d x

Lemma 6.1: ^ sorry : Type^Unknown identifier `n`n is a vector space over : Type; for all and , vector addition is commutative and associative, 0 : 0 is an additive identity, -sorry : -Unknown identifier `x`x is an additive inverse, scalar multiplication is associative, distributes over vector and scalar addition, and 1 : 1 acts as the identity scalar.

lemma rowVector_real_vector_space_identities (n : ) : x y z : Fin n , c d : , x + y = y + x (x + y) + z = x + (y + z) x + 0 = x 0 + x = x x + (-x) = 0 (-x) + x = 0 (c * d) x = c (d x) c (x + y) = c x + c y (c + d) x = c x + d x (1 : ) x = x := by intro x y z c d have hAdd := helperForLemma_6_1_additiveGroupIdentities n x y z have hAssocUnit := helperForLemma_6_1_scalarAssociativityUnit n x c d have hDistrib := helperForLemma_6_1_scalarDistributivity n x y c d rcases hAdd with hxy, hxyz, hx0, h0x, hxneg, hnegx rcases hAssocUnit with hsmulAssoc, hsmulOne rcases hDistrib with hsmulAdd, haddSmul constructor · exact hxy constructor · exact hxyz constructor · exact hx0 constructor · exact h0x constructor · exact hxneg constructor · exact hnegx constructor · exact hsmulAssoc constructor · exact hsmulAdd constructor · exact haddSmul · exact hsmulOne

An Unknown identifier `n`n-dimensional column vector over : Type, represented as an Unknown identifier `n`sorry × sorry : Type (max u_1 u_2)n × failed to synthesize OfNat (Type ?u.612468) 1 numerals are polymorphic in Lean, but the numeral `1` cannot be used in a context where the expected type is Type ?u.612468 due to the absence of the instance above Hint: Additional diagnostic information may be available using the `set_option diagnostics true` command.1 matrix.

abbrev ColumnVector (n : ) : Type := Matrix (Fin n) (Fin 1)

Definition 6.2 (Transpose): for and a row vector , its transpose is the Unknown identifier `n`sorry × sorry : Type (max u_1 u_2)n × failed to synthesize OfNat (Type ?u.613549) 1 numerals are polymorphic in Lean, but the numeral `1` cannot be used in a context where the expected type is Type ?u.613549 due to the absence of the instance above Hint: Additional diagnostic information may be available using the `set_option diagnostics true` command.1 column vector with the same coordinates. Equivalently, an Unknown identifier `n`n-dimensional column vector is a vector of the form for some row vector Unknown identifier `x`x.

def rowVectorTranspose {n : } (x : RowVector n) : ColumnVector n := Matrix.transpose x

Every Unknown identifier `n`n-dimensional column vector is the transpose of a row vector.

lemma columnVector_exists_as_transpose (n : ) (y : ColumnVector n) : x : RowVector n, rowVectorTranspose x = y := by refine Matrix.transpose y, ?_ try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa [rowVectorTranspose] using Matrix.transpose_transpose y

Definition 6.3 (Standard basis vectors of ^ sorry : Type^Unknown identifier `n`n): for , the standard basis row vector Unknown identifier `e_j`e_j has entries if Unknown identifier `i`sorry = sorry : Propi = Unknown identifier `j`j and otherwise.

def standardBasisRowVector (n : ) (j : Fin n) : RowVector n := fun _ i => if i = j then 1 else 0

Every row vector in ^ sorry : Type^Unknown identifier `n`n is the sum of its coordinates times the standard basis row vectors.

theorem rowVector_eq_sum_standardBasisRowVector (n : ) (x : RowVector n) : x = j : Fin n, (x 0 j) standardBasisRowVector n j := by ext r i fin_cases r simp [Matrix.sum_apply, standardBasisRowVector]

The transpose of a row vector is the corresponding linear combination of the transposed standard basis vectors.

theorem rowVectorTranspose_eq_sum_standardBasisTranspose (n : ) (x : RowVector n) : rowVectorTranspose x = j : Fin n, (x 0 j) rowVectorTranspose (standardBasisRowVector n j) := by simpa [rowVectorTranspose, Matrix.transpose_sum] using congrArg Matrix.transpose (rowVector_eq_sum_standardBasisRowVector n x)

Definition 6.4 (Linear transformation): a function is linear iff for all and , (i) Unknown identifier `T`sorry = sorry + sorry : PropT (x + y) = Unknown identifier `T`T x + Unknown identifier `T`T y and (ii) Unknown identifier `T`sorry = sorry sorry : PropT (c x) = Unknown identifier `c`c Unknown identifier `T`T x.

def IsLinearTransformation {n m : } (T : (Fin n ) (Fin m )) : Prop := ( x y : Fin n , T (x + y) = T x + T y) (c : ) (x : Fin n ), T (c x) = c T x

Definition 6.5 (Matrices): for positive natural numbers , an Unknown identifier `m`sorry × sorry : Type (max u_1 u_2)m × Unknown identifier `n`n matrix over a set Unknown identifier `S`S is a family Unknown identifier `A`sorry = sorry : PropA = (Unknown identifier `a`a i j) of elements of Unknown identifier `S`S indexed by and . A failed to synthesize OfNat (Type ?u.618428) 1 numerals are polymorphic in Lean, but the numeral `1` cannot be used in a context where the expected type is Type ?u.618428 due to the absence of the instance above Hint: Additional diagnostic information may be available using the `set_option diagnostics true` command.sorry × sorry : Type (max u_1 u_2)1 × Unknown identifier `n`n matrix is an Unknown identifier `n`n-dimensional row vector, and an Unknown identifier `n`sorry × sorry : Type (max u_1 u_2)n × failed to synthesize OfNat (Type ?u.619513) 1 numerals are polymorphic in Lean, but the numeral `1` cannot be used in a context where the expected type is Type ?u.619513 due to the absence of the instance above Hint: Additional diagnostic information may be available using the `set_option diagnostics true` command.1 matrix is an Unknown identifier `n`n-dimensional column vector.

abbrev MatrixOver (S : Type*) (m n : ℕ+) := Matrix (Fin m) (Fin n) S

Definition 6.6 (Matrix product): for , if Unknown identifier `A`A is an Unknown identifier `m`sorry × sorry : Type (max u_1 u_2)m × Unknown identifier `n`n matrix and Unknown identifier `B`B is an Unknown identifier `n`sorry × sorry : Type (max u_1 u_2)n × Unknown identifier `p`p matrix (over : Type), then matrixProduct sorry sorry : Matrix (Fin ?m.1) (Fin ?m.3) matrixProduct Unknown identifier `A`A Unknown identifier `B`B is the Unknown identifier `m`sorry × sorry : Type (max u_1 u_2)m × Unknown identifier `p`p matrix with entries matrixProduct sorry sorry sorry sorry = j, sorry * sorry : Prop(matrixProduct Unknown identifier `A`A Unknown identifier `B`B) Unknown identifier `i`i Unknown identifier `k`k = j : Fin Unknown identifier `n`n, Unknown identifier `A`A i j * Unknown identifier `B`B j k. In particular, when Unknown identifier `p`sorry = 1 : Propp = 1, this gives matrix-column-vector multiplication .

abbrev matrixProduct {m n p : } (A : Matrix (Fin m) (Fin n) ) (B : Matrix (Fin n) (Fin p) ) : Matrix (Fin m) (Fin p) := A * B

Helper for Lemma 6.2: convert IsLinearTransformation {n m : } (T : (Fin n ) Fin m ) : PropIsLinearTransformation to a mathlib LinearMap.{u_14, u_15, u_16, u_17} {R : Type u_14} {S : Type u_15} [Semiring R] [Semiring S] (σ : R →+* S) (M : Type u_16) (M₂ : Type u_17) [AddCommMonoid M] [AddCommMonoid M₂] [Module R M] [Module S M₂] : Type (max u_16 u_17)LinearMap.

def helperForLemma_6_2_linearMapFromIsLinearTransformation {n m : } (T : (Fin n ) (Fin m )) (hT : IsLinearTransformation T) : (Fin n ) →ₗ[] (Fin m ) := { toFun := T map_add' := hT.1 map_smul' := hT.2 }

Helper for Lemma 6.2: the matrix from LinearMap.toMatrix'.{u_1, u_4, u_5} {R : Type u_1} [CommSemiring R] {m : Type u_4} {n : Type u_5} [DecidableEq n] [Fintype n] : ((n R) →ₗ[R] m R) ≃ₗ[R] Matrix m n RLinearMap.toMatrix' represents Unknown identifier `T`T.

lemma helperForLemma_6_2_matrixCandidateRepresentsT {n m : } (T : (Fin n ) (Fin m )) (hT : IsLinearTransformation T) : x : Fin n , T x = Matrix.mulVec (LinearMap.toMatrix' (helperForLemma_6_2_linearMapFromIsLinearTransformation T hT)) x := by intro x have hMulVec : Matrix.mulVec (LinearMap.toMatrix' (helperForLemma_6_2_linearMapFromIsLinearTransformation T hT)) x = helperForLemma_6_2_linearMapFromIsLinearTransformation T hT x := by try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa using (LinearMap.toMatrix'_mulVec (helperForLemma_6_2_linearMapFromIsLinearTransformation T hT) x) calc T x = helperForLemma_6_2_linearMapFromIsLinearTransformation T hT x := rfl _ = Matrix.mulVec (LinearMap.toMatrix' (helperForLemma_6_2_linearMapFromIsLinearTransformation T hT)) x := by try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa using hMulVec.symm

Helper for Lemma 6.2: a representing matrix yields the corresponding Matrix.toLin'.{u_1, u_4, u_5} {R : Type u_1} [CommSemiring R] {m : Type u_4} {n : Type u_5} [DecidableEq n] [Fintype n] : Matrix m n R ≃ₗ[R] (n R) →ₗ[R] m RMatrix.toLin' equality.

lemma helperForLemma_6_2_toLin_eq_of_representsT {n m : } (T : (Fin n ) (Fin m )) (hT : IsLinearTransformation T) (B : Matrix (Fin m) (Fin n) ) (hB : x : Fin n , T x = Matrix.mulVec B x) : Matrix.toLin' B = helperForLemma_6_2_linearMapFromIsLinearTransformation T hT := by apply LinearMap.ext intro x calc (Matrix.toLin' B) x = Matrix.mulVec B x := by simp [Matrix.toLin'_apply] _ = T x := by exact (hB x).symm _ = helperForLemma_6_2_linearMapFromIsLinearTransformation T hT x := rfl

Helper for Lemma 6.2: matrix representation of Unknown identifier `T`T is unique.

lemma helperForLemma_6_2_representation_unique {n m : } (T : (Fin n ) (Fin m )) (hT : IsLinearTransformation T) (B : Matrix (Fin m) (Fin n) ) (hB : x : Fin n , T x = Matrix.mulVec B x) : B = LinearMap.toMatrix' (helperForLemma_6_2_linearMapFromIsLinearTransformation T hT) := by have hToLinB : Matrix.toLin' B = helperForLemma_6_2_linearMapFromIsLinearTransformation T hT := helperForLemma_6_2_toLin_eq_of_representsT T hT B hB have hToLinA : Matrix.toLin' (LinearMap.toMatrix' (helperForLemma_6_2_linearMapFromIsLinearTransformation T hT)) = helperForLemma_6_2_linearMapFromIsLinearTransformation T hT := by try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa using (Matrix.toLin'_toMatrix' (helperForLemma_6_2_linearMapFromIsLinearTransformation T hT)) have hEqToLin : Matrix.toLin' B = Matrix.toLin' (LinearMap.toMatrix' (helperForLemma_6_2_linearMapFromIsLinearTransformation T hT)) := by calc Matrix.toLin' B = helperForLemma_6_2_linearMapFromIsLinearTransformation T hT := hToLinB _ = Matrix.toLin' (LinearMap.toMatrix' (helperForLemma_6_2_linearMapFromIsLinearTransformation T hT)) := by exact hToLinA.symm exact (Matrix.toLin').injective hEqToLin

Lemma 6.2: if is a linear transformation, then there exists a unique matrix such that Unknown identifier `T`sorry = sorry : PropT x = Unknown identifier `A`A x for every .

theorem linearTransformation_existsUnique_matrixRepresentation {n m : } (T : (Fin n ) (Fin m )) (hT : IsLinearTransformation T) : ∃! A : Matrix (Fin m) (Fin n) , x : Fin n , T x = Matrix.mulVec A x := by refine LinearMap.toMatrix' (helperForLemma_6_2_linearMapFromIsLinearTransformation T hT), ?_, ?_ · exact helperForLemma_6_2_matrixCandidateRepresentsT T hT · intro B hB exact helperForLemma_6_2_representation_unique T hT B hB

Lemma 6.3: for matrices Unknown identifier `A`A and Unknown identifier `B`B over the same field, if Unknown identifier `L_M`L_M denotes left-multiplication by Unknown identifier `M`M on compatible column vectors, then as linear maps Unknown identifier `𝔽`sorry ^ sorry sorry ^ sorry : Sort (imax u_1 u_3)𝔽^Unknown identifier `p`p Unknown identifier `𝔽`𝔽^Unknown identifier `m`m.

theorem leftMultiplication_comp_eq_leftMultiplication_mul {𝔽 : Type*} [Field 𝔽] {m n p : } (A : Matrix (Fin m) (Fin n) 𝔽) (B : Matrix (Fin n) (Fin p) 𝔽) : (Matrix.mulVecLin A).comp (Matrix.mulVecLin B) = Matrix.mulVecLin (A * B) := by try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa using (Matrix.mulVecLin_mul A B).symm

Helper for Proposition 6.1: scaling by a fixed scalar preserves addition on Fin sorry : TypeFin Unknown identifier `n`n .

lemma helperForProposition_6_1_fixedScalar_add (n : ) (a : ) (x y : Fin n ) : a (x + y) = a x + a y := by try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa using smul_add a x y

Helper for Proposition 6.1: scaling by a fixed scalar commutes with an external scalar multiplication on Fin sorry : TypeFin Unknown identifier `n`n .

lemma helperForProposition_6_1_fixedScalar_smul (n : ) (a c : ) (x : Fin n ) : a (c x) = c (a x) := by calc a (c x) = (a * c) x := by try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa [smul_smul] _ = (c * a) x := by rw [mul_comm] _ = c (a x) := by try 'simp' instead of 'simpa' Note: This linter can be disabled with `set_option linter.unnecessarySimpa false`simpa [smul_smul]

Helper for Proposition 6.1: for any dimension Unknown identifier `n`n and scalar Unknown identifier `a`a, the map is linear.

lemma helperForProposition_6_1_fixedScalar_isLinear (n : ) (a : ) : IsLinearTransformation (fun x : Fin n => a x) := by constructor · intro x y exact helperForProposition_6_1_fixedScalar_add n a x y · intro c x exact helperForProposition_6_1_fixedScalar_smul n a c x

Proposition 6.1: the map defined by is a linear transformation.

theorem t1_isLinearTransformation : IsLinearTransformation (fun x : Fin 3 => (5 : ) x) := by simpa using helperForProposition_6_1_fixedScalar_isLinear 3 (5 : )

Helper for Proposition 6.2: the rotation map preserves vector addition on .

lemma helperForProposition_6_2_rotate_add (x y : Fin 2 ) : (fun z : Fin 2 => ![-z 1, z 0]) (x + y) = (fun z : Fin 2 => ![-z 1, z 0]) x + (fun z : Fin 2 => ![-z 1, z 0]) y := by ext i fin_cases i <;> simp [add_comm, This simp argument is unused: add_left_comm Hint: Omit it from the simp argument list. simp [add_comm, a̵d̵d̵_̵l̵e̵f̵t̵_̵c̵o̵m̵m̵,̵ ̵add_assoc] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false`add_left_comm, This simp argument is unused: add_assoc Hint: Omit it from the simp argument list. simp [add_comm, add_left_comm,̵ ̵a̵d̵d̵_̵a̵s̵s̵o̵c̵] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false`add_assoc]

Helper for Proposition 6.2: the rotation map commutes with scalar multiplication on .

lemma helperForProposition_6_2_rotate_smul (c : ) (x : Fin 2 ) : (fun z : Fin 2 => ![-z 1, z 0]) (c x) = c (fun z : Fin 2 => ![-z 1, z 0]) x := by ext i fin_cases i <;> simp

Proposition 6.2: let be the map that rotates each vector about the origin by angle Unknown identifier `π`sorry / 2 : π/2 counterclockwise, i.e. . Then Unknown identifier `T₂`T₂ is a linear transformation.

theorem t2_rotatePiOverTwo_isLinearTransformation : IsLinearTransformation (fun x : Fin 2 => ![-x 1, x 0]) := by constructor · intro x y exact helperForProposition_6_2_rotate_add x y · intro c x exact helperForProposition_6_2_rotate_smul c x

Helper for Proposition 6.3: dropping the third coordinate preserves vector addition on .

lemma helperForProposition_6_3_dropThird_add (x y : Fin 3 ) : (fun z : Fin 3 => ![z 0, z 1]) (x + y) = (fun z : Fin 3 => ![z 0, z 1]) x + (fun z : Fin 3 => ![z 0, z 1]) y := by ext i fin_cases i <;> simp

Helper for Proposition 6.3: dropping the third coordinate commutes with scalar multiplication on .

lemma helperForProposition_6_3_dropThird_smul (c : ) (x : Fin 3 ) : (fun z : Fin 3 => ![z 0, z 1]) (c x) = c (fun z : Fin 3 => ![z 0, z 1]) x := by ext i fin_cases i <;> simp

Proposition 6.3: define by . Then Unknown identifier `T₃`T₃ is a linear transformation, i.e. for all and , Unknown identifier `T₃`sorry = sorry + sorry : PropT₃ (u + v) = Unknown identifier `T₃`T₃ u + Unknown identifier `T₃`T₃ v and Unknown identifier `T₃`sorry = sorry sorry : PropT₃ (c u) = Unknown identifier `c`c Unknown identifier `T₃`T₃ u.

theorem t3_dropThirdCoordinate_isLinearTransformation : IsLinearTransformation (fun x : Fin 3 => ![x 0, x 1]) := by constructor · intro x y exact helperForProposition_6_3_dropThird_add x y · intro c x exact helperForProposition_6_3_dropThird_smul c x

Helper for Proposition 6.4: the embedding map preserves vector addition on .

lemma helperForProposition_6_4_embed_add (x y : Fin 2 ) : (fun z : Fin 2 => ![z 0, z 1, 0]) (x + y) = (fun z : Fin 2 => ![z 0, z 1, 0]) x + (fun z : Fin 2 => ![z 0, z 1, 0]) y := by ext i fin_cases i <;> simp

Helper for Proposition 6.4: the embedding map commutes with scalar multiplication on .

lemma helperForProposition_6_4_embed_smul (c : ) (x : Fin 2 ) : (fun z : Fin 2 => ![z 0, z 1, 0]) (c x) = c (fun z : Fin 2 => ![z 0, z 1, 0]) x := by ext i fin_cases i <;> simp

Helper for Proposition 6.4: the embedding map is linear.

lemma helperForProposition_6_4_embed_isLinear : IsLinearTransformation (fun x : Fin 2 => ![x 0, x 1, 0]) := by constructor · intro x y exact helperForProposition_6_4_embed_add x y · intro c x exact helperForProposition_6_4_embed_smul c x

Proposition 6.4: define by . Then Unknown identifier `T₄`T₄ is a linear transformation, i.e. for all and , Unknown identifier `T₄`sorry = sorry + sorry : PropT₄ (u + v) = Unknown identifier `T₄`T₄ u + Unknown identifier `T₄`T₄ v and Unknown identifier `T₄`sorry = sorry sorry : PropT₄ (c u) = Unknown identifier `c`c Unknown identifier `T₄`T₄ u.

theorem t4_embedInThreeSpace_isLinearTransformation : IsLinearTransformation (fun x : Fin 2 => ![x 0, x 1, 0]) := by simpa using helperForProposition_6_4_embed_isLinear

Helper for Proposition 6.5: the identity map on Fin sorry : TypeFin Unknown identifier `n`n preserves addition.

lemma helperForProposition_6_5_identity_add (n : ) (x y : Fin n ) : (fun z : Fin n => z) (x + y) = (fun z : Fin n => z) x + (fun z : Fin n => z) y := by rfl

Helper for Proposition 6.5: the identity map on Fin sorry : TypeFin Unknown identifier `n`n commutes with scalar multiplication.

lemma helperForProposition_6_5_identity_smul (n : ) (c : ) (x : Fin n ) : (fun z : Fin n => z) (c x) = c (fun z : Fin n => z) x := by rfl

Helper for Proposition 6.5: for each Unknown identifier `n`n, the identity map on Fin sorry : TypeFin Unknown identifier `n`n is linear.

lemma helperForProposition_6_5_identity_isLinear (n : ) : IsLinearTransformation (fun x : Fin n => x) := by constructor · intro x y exact helperForProposition_6_5_identity_add n x y · intro c x exact helperForProposition_6_5_identity_smul n c x

Proposition 6.5: for each , the map defined by Unknown identifier `I_n`sorry = sorry : PropI_n x = Unknown identifier `x`x for all Unknown identifier `x`x is a linear transformation.

theorem identityMap_isLinearTransformation (n : ) : IsLinearTransformation (fun x : Fin n => x) := by simpa using helperForProposition_6_5_identity_isLinear n

Proposition 6.6: if and are linear transformations, then their composition Unknown identifier `TS`TS, defined by sorry = sorry : Prop(Unknown identifier `TS`TS) x = Unknown identifier `T`T (S x) for all , is also a linear transformation.

theorem composition_isLinearTransformation {p n m : } (T : (Fin n ) (Fin m )) (S : (Fin p ) (Fin n )) (hT : IsLinearTransformation T) (hS : IsLinearTransformation S) : IsLinearTransformation (fun x : Fin p => T (S x)) := by constructor · intro x y calc T (S (x + y)) = T (S x + S y) := by rw [hS.1 x y] _ = T (S x) + T (S y) := by rw [hT.1 (S x) (S y)] · intro c x calc T (S (c x)) = T (c S x) := by rw [hS.2 c x] _ = c T (S x) := by rw [hT.2 c (S x)]

Helper for Proposition 6.7: the operator norm of Unknown identifier `T`T bounds sorry : Unknown identifier `T`T x by LinearMap.toContinuousLinearMap sorry * sorry : LinearMap.toContinuousLinearMap Unknown identifier `T`T * Unknown identifier `x`x.

lemma helperForProposition_6_7_bound_by_opNorm {n m : } (T : EuclideanSpace (Fin n) →ₗ[] EuclideanSpace (Fin m)) (x : EuclideanSpace (Fin n)) : T x LinearMap.toContinuousLinearMap T * x := by simpa using (LinearMap.toContinuousLinearMap T).le_opNorm x

Helper for Proposition 6.7: replacing the operator norm by LinearMap.toContinuousLinearMap sorry + 1 : LinearMap.toContinuousLinearMap Unknown identifier `T`T + 1 preserves the bound.

lemma helperForProposition_6_7_bound_by_opNormPlusOne {n m : } (T : EuclideanSpace (Fin n) →ₗ[] EuclideanSpace (Fin m)) (x : EuclideanSpace (Fin n)) : T x (LinearMap.toContinuousLinearMap T + 1) * x := by have hBound : T x LinearMap.toContinuousLinearMap T * x := helperForProposition_6_7_bound_by_opNorm T x have hCoeff : LinearMap.toContinuousLinearMap T LinearMap.toContinuousLinearMap T + 1 := by exact le_add_of_nonneg_right zero_le_one have hNormNonneg : 0 x := norm_nonneg x have hMul : LinearMap.toContinuousLinearMap T * x (LinearMap.toContinuousLinearMap T + 1) * x := by exact mul_le_mul_of_nonneg_right hCoeff hNormNonneg exact le_trans hBound hMul

Helper for Proposition 6.7: the constant LinearMap.toContinuousLinearMap sorry + 1 : LinearMap.toContinuousLinearMap Unknown identifier `T`T + 1 is strictly positive.

lemma helperForProposition_6_7_positive_constant {n m : } (T : EuclideanSpace (Fin n) →ₗ[] EuclideanSpace (Fin m)) : 0 < LinearMap.toContinuousLinearMap T + 1 := by exact add_pos_of_nonneg_of_pos (norm_nonneg (LinearMap.toContinuousLinearMap T)) zero_lt_one

Helper for Proposition 6.7: every linear map between these finite-dimensional Euclidean spaces is continuous.

lemma helperForProposition_6_7_continuous_apply {n m : } (T : EuclideanSpace (Fin n) →ₗ[] EuclideanSpace (Fin m)) : Continuous (fun x : EuclideanSpace (Fin n) => T x) := by simpa using T.continuous_of_finiteDimensional

Proposition 6.7: if is a linear transformation, then there exists a constant Unknown identifier `M`sorry > 0 : PropM > 0 such that sorry sorry * sorry : PropUnknown identifier `T`T x Unknown identifier `M`M * Unknown identifier `x`x for all . Consequently, Unknown identifier `T`T is continuous on ^ sorry : Type^Unknown identifier `n`n.

theorem linearTransformation_exists_pos_bound_and_continuous {n m : } (T : EuclideanSpace (Fin n) →ₗ[] EuclideanSpace (Fin m)) : M > 0, ( x : EuclideanSpace (Fin n), T x M * x) Continuous (fun x : EuclideanSpace (Fin n) => T x) := by refine LinearMap.toContinuousLinearMap T + 1, helperForProposition_6_7_positive_constant T, ?_ constructor · intro x exact helperForProposition_6_7_bound_by_opNormPlusOne T x · exact helperForProposition_6_7_continuous_apply T
end Section01end Chap06