-- File: optlib/Optlib/Algorithm/LASSO.lean
Theorem statement:
theorem extracted_formal_statement_57 {n m : ℕ+} {b : Fin ↑m → ℝ} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ}
  (x : EuclideanSpace ℝ (Fin ↑n)) :
  let f := fun x => 1 / 2 * A *ᵥ x ⬝ᵥ A *ᵥ x;
  let f' := fun x => Aᵀ *ᵥ A *ᵥ x;
  let g := fun x => (1 / 2) • 2 • Aᵀ *ᵥ A *ᵥ x;
  (∀ (x : EuclideanSpace ℝ (Fin ↑n)), f' x = g x) → HasGradientAt f (g x) x := sorry

Tactic state before:
n m : ℕ+
b : Fin ↑m → ℝ
A : Matrix (Fin ↑m) (Fin ↑n) ℝ
x : EuclideanSpace ℝ (Fin ↑n)
f : EuclideanSpace ℝ (Fin ↑n) → ℝ := fun x => 1 / 2 * A *ᵥ x ⬝ᵥ A *ᵥ x
f' : EuclideanSpace ℝ (Fin ↑n) → Fin ↑n → ℝ := fun x => Aᵀ *ᵥ A *ᵥ x
g : EuclideanSpace ℝ (Fin ↑n) → Fin ↑n → ℝ := fun x => (1 / 2) • 2 • Aᵀ *ᵥ A *ᵥ x
f'eqg : ∀ (x : EuclideanSpace ℝ (Fin ↑n)), f' x = g x
⊢ HasGradientAt f (g x) x

Tactic: apply HasGradientAt.const_mul' (1 / 2) (quadratic_gradient x)

Tactic state after:

Premises used:
HasGradientAt.const_mul' : ∀ {F : Type u_2} [inst : NormedAddCommGroup F] [inst_1 : CompleteSpace F]
  [inst_2 : InnerProductSpace ℝ F] {a' : F} {a : F → ℝ} {x : F} (b : ℝ),
  HasGradientAt a a' x → HasGradientAt (fun y => b * a y) (b • a') x
quadratic_gradient : ∀ {n m : ℕ+} {A : Matrix (Fin ↑m) (Fin ↑n) ℝ} (x : EuclideanSpace ℝ (Fin ↑n)),
  HasGradientAt (fun x => A *ᵥ x ⬝ᵥ A *ᵥ x) (2 • Aᵀ *ᵥ A *ᵥ x) x