Imports
module
public import Mathlib.Analysis.Calculus.Gradient.Basic
public import Mathlib.Analysis.Calculus.ContDiff.FTaylorSeries
public import Mathlib.LinearAlgebra.QuadraticForm.Basic
public import Mathlib.Analysis.Calculus.FDeriv.Analytic
public import Mathlib.Analysis.Analytic.IteratedFDeriv
public import Mathlib.Analysis.Calculus.FDeriv.Symmetric
public import Mathlib.Analysis.InnerProductSpace.PiL2
The Second Partial Derivatives Test
We prove a version of the second partial derivative test from calculus for
analytic functions f : V → ℝ, where V is a finite-dimensional vector space.
Main results
second_derivative_test:
Suppose f is a real-valued function on a
finite-dimensional inner product space that
has vanishing gradient at x₀, and has a power series on a ball of positive radius
around x₀. If the second Frechét derivative is positive definite at x₀ then
f has local minimum at x₀.
partial derivative test, calculus
@[ expose ] public section
Update a vector of length 2 in coordinate 0.
@[ simp ]
lemma Function.update₀ { α : Type* } { a b c : α } : Function.update ![ a , b ] 0 c = ![ c , b ] := by α : Type u_1 a : α b : α c : α ⊢ update ![ a , b ] 0 c = ![ c , b ]
ext i α : Type u_1 a : α b : α c : α i : Fin ( Nat.succ 0 ) . succ ⊢ update ![ a , b ] 0 c i = ![ c , b ] i ; fin_cases i «0» α : Type u_1 a : α b : α c : α ⊢ update ![ a , b ] 0 c ( (fun i => i ) ⟨ 0 , ⋯ ⟩ ) = ![ c , b ] ( (fun i => i ) ⟨ 0 , ⋯ ⟩ ) «1» α : Type u_1 a : α b : α c : α ⊢ update ![ a , b ] 0 c ( (fun i => i ) ⟨ 1 , ⋯ ⟩ ) = ![ c , b ] ( (fun i => i ) ⟨ 1 , ⋯ ⟩ ) <;> «0» α : Type u_1 a : α b : α c : α ⊢ update ![ a , b ] 0 c ( (fun i => i ) ⟨ 0 , ⋯ ⟩ ) = ![ c , b ] ( (fun i => i ) ⟨ 0 , ⋯ ⟩ ) «1» α : Type u_1 a : α b : α c : α ⊢ update ![ a , b ] 0 c ( (fun i => i ) ⟨ 1 , ⋯ ⟩ ) = ![ c , b ] ( (fun i => i ) ⟨ 1 , ⋯ ⟩ ) simp All goals completed! 🐙
Update a vector of length 2 in coordinate 1.
@[ simp ]
lemma Function.update₁ { α : Type* } { a b c : α } : Function.update ![ a , b ] 1 c = ![ a , c ] := by α : Type u_1 a : α b : α c : α ⊢ update ![ a , b ] 1 c = ![ a , c ]
ext i α : Type u_1 a : α b : α c : α i : Fin ( Nat.succ 0 ) . succ ⊢ update ![ a , b ] 1 c i = ![ a , c ] i ; fin_cases i «0» α : Type u_1 a : α b : α c : α ⊢ update ![ a , b ] 1 c ( (fun i => i ) ⟨ 0 , ⋯ ⟩ ) = ![ a , c ] ( (fun i => i ) ⟨ 0 , ⋯ ⟩ ) «1» α : Type u_1 a : α b : α c : α ⊢ update ![ a , b ] 1 c ( (fun i => i ) ⟨ 1 , ⋯ ⟩ ) = ![ a , c ] ( (fun i => i ) ⟨ 1 , ⋯ ⟩ ) <;> «0» α : Type u_1 a : α b : α c : α ⊢ update ![ a , b ] 1 c ( (fun i => i ) ⟨ 0 , ⋯ ⟩ ) = ![ a , c ] ( (fun i => i ) ⟨ 0 , ⋯ ⟩ ) «1» α : Type u_1 a : α b : α c : α ⊢ update ![ a , b ] 1 c ( (fun i => i ) ⟨ 1 , ⋯ ⟩ ) = ![ a , c ] ( (fun i => i ) ⟨ 1 , ⋯ ⟩ ) simp All goals completed! 🐙
def QuadraticMap.toMultilinearMap { V : Type* } [ AddCommGroup V ] [ Module ℝ V ]
( Q : QuadraticMap ℝ V ℝ ) : MultilinearMap ℝ ( fun _ : Fin 2 => V ) ℝ := {
toFun := fun v => Q . polarBilin ( v 0 ) ( v 1 )
map_update_add' := by V : Type u_1 inst✝¹ : AddCommGroup V inst✝ : Module ℝ V Q : QuadraticMap ℝ V ℝ ⊢ ∀ [ inst : DecidableEq ( Fin 2 ) ] ( m : Fin 2 → V ) ( i : Fin 2 ) ( x y : V ),
( Q . polarBilin ( update m i ( x + y ) 0 ) ) ( update m i ( x + y ) 1 ) =
( Q . polarBilin ( update m i x 0 ) ) ( update m i x 1 ) + ( Q . polarBilin ( update m i y 0 ) ) ( update m i y 1 ) simp All goals completed! 🐙
map_update_smul' := by V : Type u_1 inst✝¹ : AddCommGroup V inst✝ : Module ℝ V Q : QuadraticMap ℝ V ℝ ⊢ ∀ [ inst : DecidableEq ( Fin 2 ) ] ( m : Fin 2 → V ) ( i : Fin 2 ) ( c : ℝ ) ( x : V ),
( Q . polarBilin ( update m i ( c • x ) 0 ) ) ( update m i ( c • x ) 1 ) = c • ( Q . polarBilin ( update m i x 0 ) ) ( update m i x 1 ) simp All goals completed! 🐙 }
The multilinear map associated to a quadratic map is continuous.
theorem QuadraticMap.toMultilinearMap_continuous { V : Type* }
[ NormedAddCommGroup V ] [ NormedSpace ℝ V ]
[ FiniteDimensional ℝ V ] ( Q : QuadraticMap ℝ V ℝ ) : Continuous Q . toMultilinearMap := by V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ ⊢ Continuous ⇑ Q . toMultilinearMap
have h_bilinear : ∃ B : V →ₗ[ ℝ ] V →L[ ℝ ] ℝ , ∀ x y , B x y = Q . toMultilinearMap ![ x , y ] := by
have h_bilinear : ∃ B : V →ₗ[ ℝ ] V →L[ ℝ ] ℝ , ∀ x y , B x y = Q . polarBilin x y := by V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ ⊢ Continuous ⇑ Q . toMultilinearMap V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap
have h_bilinear : ∀ x : V , ∃ Bx : V →L[ ℝ ] ℝ , ∀ y : V , Bx y = Q . polarBilin x y := by V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ ⊢ Continuous ⇑ Q . toMultilinearMap V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∀ ( x : V ), ∃ Bx , ∀ ( y : V ), Bx y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap
intro x V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ x : V ⊢ ∃ Bx , ∀ ( y : V ), Bx y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∀ ( x : V ), ∃ Bx , ∀ ( y : V ), Bx y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap
use ( by V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ x : V ⊢ V →L[ ℝ ] ℝ V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∀ ( x : V ), ∃ Bx , ∀ ( y : V ), Bx y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap
apply ContinuousLinearMap.mk cont V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ x : V ⊢ autoParam ( Continuous ( LinearMap.toAddHom ?toLinearMap ) . toFun ) ContinuousLinearMap.cont._autoParam toLinearMap V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ x : V ⊢ V →ₗ[ ℝ ] ℝ V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∀ ( x : V ), ∃ Bx , ∀ ( y : V ), Bx y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap
swap toLinearMap V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ x : V ⊢ V →ₗ[ ℝ ] ℝ cont V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ x : V ⊢ autoParam ( Continuous ( LinearMap.toAddHom ?toLinearMap ) . toFun ) ContinuousLinearMap.cont._autoParam V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∀ ( x : V ), ∃ Bx , ∀ ( y : V ), Bx y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap
exact Q . polarBilin x cont V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ x : V ⊢ autoParam ( Continuous ( Q . polarBilin x ) . toFun ) ContinuousLinearMap.cont._autoParam V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∀ ( x : V ), ∃ Bx , ∀ ( y : V ), Bx y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap
simp only [ AddHom.toFun_eq_coe , LinearMap.coe_toAddHom ] cont V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ x : V ⊢ autoParam ( Continuous ⇑ ( Q . polarBilin x ) ) ContinuousLinearMap.cont._autoParam V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∀ ( x : V ), ∃ Bx , ∀ ( y : V ), Bx y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap
exact LinearMap.continuous_of_finiteDimensional ( Q . polarBilin x ) All goals completed! 🐙 V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∀ ( x : V ), ∃ Bx , ∀ ( y : V ), Bx y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap
)
intro y h V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ x : V y : V ⊢ { toLinearMap := Q . polarBilin x , cont := ⋯ } y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∀ ( x : V ), ∃ Bx , ∀ ( y : V ), Bx y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap ; rfl V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∀ ( x : V ), ∃ Bx , ∀ ( y : V ), Bx y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∀ ( x : V ), ∃ Bx , ∀ ( y : V ), Bx y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap
choose B hB using h_bilinear V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ B : V → V →L[ ℝ ] ℝ hB : ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap ;
refine ⟨ { toFun := B , map_add' := ? _ , map_smul' := ? _ } , hB ⟩ refine_1 V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ B : V → V →L[ ℝ ] ℝ hB : ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∀ ( x y : V ), B ( x + y ) = B x + B y refine_2 V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ B : V → V →L[ ℝ ] ℝ hB : ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∀ ( m : ℝ ) ( x : V ), B ( m • x ) = ( RingHom.id ℝ ) m • B x V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap <;> refine_1 V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ B : V → V →L[ ℝ ] ℝ hB : ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∀ ( x y : V ), B ( x + y ) = B x + B y refine_2 V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ B : V → V →L[ ℝ ] ℝ hB : ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∀ ( m : ℝ ) ( x : V ), B ( m • x ) = ( RingHom.id ℝ ) m • B x V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap aesop All goals completed! 🐙 V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap ; V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = ( Q . polarBilin x ) y ⊢ ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap
aesop All goals completed! 🐙 V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap ; V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ h_bilinear : ∃ B , ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap
obtain ⟨ B , hB ⟩ := h_bilinear V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ B : V →ₗ[ ℝ ] V →L[ ℝ ] ℝ hB : ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] ⊢ Continuous ⇑ Q . toMultilinearMap ;
have hB_cont : Continuous B := by
exact B . continuous_of_finiteDimensional All goals completed! 🐙 V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ B : V →ₗ[ ℝ ] V →L[ ℝ ] ℝ hB : ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] hB_cont : Continuous ⇑ B ⊢ Continuous ⇑ Q . toMultilinearMap ; V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ B : V →ₗ[ ℝ ] V →L[ ℝ ] ℝ hB : ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] hB_cont : Continuous ⇑ B ⊢ Continuous ⇑ Q . toMultilinearMap
convert hB_cont . comp ( show Continuous fun v : Fin 2 → V => v 0 from continuous_apply 0 ) |>
Continuous.clm_apply <|
show Continuous fun v : Fin 2 → V => v 1 from continuous_apply 1 using 1 V : Type u_1 inst✝² : NormedAddCommGroup V inst✝¹ : NormedSpace ℝ V inst✝ : FiniteDimensional ℝ V Q : QuadraticMap ℝ V ℝ B : V →ₗ[ ℝ ] V →L[ ℝ ] ℝ hB : ∀ ( x y : V ), ( B x ) y = Q . toMultilinearMap ![ x , y ] hB_cont : Continuous ⇑ B ⊢ ⇑ Q . toMultilinearMap = fun x => ( ( ⇑ B ∘ fun v => v 0 ) x ) ( x 1 ) ; aesop All goals completed! 🐙