Theorem: bernstein.variance
File: Mathlib/Analysis/SpecialFunctions/Bernstein.lean

tactic: have h' : (n : ℝ) ≠ 0 := ne_of_gt h
state_before: n : ℕ
h : 0 < ↑n
x : ↑I
⊢ ∑ k : Fin (n + 1), (↑x - ↑(k/ₙ)) ^ 2 * (bernstein n ↑k) x = ↑x * (1 - ↑x) / ↑n
state_after: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
⊢ ∑ k : Fin (n + 1), (↑x - ↑(k/ₙ)) ^ 2 * (bernstein n ↑k) x = ↑x * (1 - ↑x) / ↑n

tactic: apply_fun fun x : ℝ => x * n using GroupWithZero.mul_right_injective h'
state_before: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
⊢ ∑ k : Fin (n + 1), (↑x - ↑(k/ₙ)) ^ 2 * (bernstein n ↑k) x = ↑x * (1 - ↑x) / ↑n
state_after: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
⊢ (fun x => x * ↑n) (∑ k : Fin (n + 1), (↑x - ↑(k/ₙ)) ^ 2 * (bernstein n ↑k) x) = (fun x => x * ↑n) (↑x * (1 - ↑x) / ↑n)

tactic: apply_fun fun x : ℝ => x * n using GroupWithZero.mul_right_injective h'
state_before: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
⊢ (fun x => x * ↑n) (∑ k : Fin (n + 1), (↑x - ↑(k/ₙ)) ^ 2 * (bernstein n ↑k) x) = (fun x => x * ↑n) (↑x * (1 - ↑x) / ↑n)
state_after: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
⊢ (fun x => x * ↑n) ((fun x => x * ↑n) (∑ k : Fin (n + 1), (↑x - ↑(k/ₙ)) ^ 2 * (bernstein n ↑k) x)) =
    (fun x => x * ↑n) ((fun x => x * ↑n) (↑x * (1 - ↑x) / ↑n))

tactic: dsimp
state_before: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
⊢ (fun x => x * ↑n) ((fun x => x * ↑n) (∑ k : Fin (n + 1), (↑x - ↑(k/ₙ)) ^ 2 * (bernstein n ↑k) x)) =
    (fun x => x * ↑n) ((fun x => x * ↑n) (↑x * (1 - ↑x) / ↑n))
state_after: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
⊢ (∑ k : Fin (n + 1), (↑x - ↑(k/ₙ)) ^ 2 * (bernstein n ↑k) x) * ↑n * ↑n = ↑x * (1 - ↑x) / ↑n * ↑n * ↑n

tactic: conv_lhs => simp only [Finset.sum_mul, z]
state_before: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
⊢ (∑ k : Fin (n + 1), (↑x - ↑(k/ₙ)) ^ 2 * (bernstein n ↑k) x) * ↑n * ↑n = ↑x * (1 - ↑x) / ↑n * ↑n * ↑n
state_after: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n = ↑x * (1 - ↑x) / ↑n * ↑n * ↑n

tactic: conv_rhs => rw [div_mul_cancel₀ _ h']
state_before: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n = ↑x * (1 - ↑x) / ↑n * ↑n * ↑n
state_after: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n = ↑x * (1 - ↑x) * ↑n

tactic: have := bernsteinPolynomial.variance ℝ n
state_before: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n = ↑x * (1 - ↑x) * ↑n
state_after: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ ν ∈ Finset.range (n + 1), (n • Polynomial.X - ↑ν) ^ 2 * bernsteinPolynomial ℝ n ν =
    n • Polynomial.X * (1 - Polynomial.X)
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n = ↑x * (1 - ↑x) * ↑n

tactic: apply_fun fun p => Polynomial.aeval (x : ℝ) p at this
state_before: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ ν ∈ Finset.range (n + 1), (n • Polynomial.X - ↑ν) ^ 2 * bernsteinPolynomial ℝ n ν =
    n • Polynomial.X * (1 - Polynomial.X)
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n = ↑x * (1 - ↑x) * ↑n
state_after: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  (Polynomial.aeval ↑x) (∑ ν ∈ Finset.range (n + 1), (n • Polynomial.X - ↑ν) ^ 2 * bernsteinPolynomial ℝ n ν) =
    (Polynomial.aeval ↑x) (n • Polynomial.X * (1 - Polynomial.X))
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n = ↑x * (1 - ↑x) * ↑n

tactic: simp? [AlgHom.map_sum, Finset.sum_range, ← Polynomial.natCast_mul] at this says
  simp only [nsmul_eq_mul, Finset.sum_range, map_sum, map_mul, map_pow, map_sub, map_natCast,
    Polynomial.aeval_X, Polynomial.coe_aeval_eq_eval, map_one] at this
state_before: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  (Polynomial.aeval ↑x) (∑ ν ∈ Finset.range (n + 1), (n • Polynomial.X - ↑ν) ^ 2 * bernsteinPolynomial ℝ n ν) =
    (Polynomial.aeval ↑x) (n • Polynomial.X * (1 - Polynomial.X))
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n = ↑x * (1 - ↑x) * ↑n
state_after: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n = ↑x * (1 - ↑x) * ↑n

tactic: convert this using 1
state_before: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n = ↑x * (1 - ↑x) * ↑n
state_after: case h.e'_2
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n =
    ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1)

case h.e'_3
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
⊢ ↑x * (1 - ↑x) * ↑n = ↑n * ↑x * (1 - ↑x)

tactic: simp only [nsmul_eq_mul, Finset.sum_range, map_sum, map_mul, map_pow, map_sub, map_natCast,
  Polynomial.aeval_X, Polynomial.coe_aeval_eq_eval, map_one] at this
state_before: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  (Polynomial.aeval ↑x) (∑ ν ∈ Finset.range (n + 1), (n • Polynomial.X - ↑ν) ^ 2 * bernsteinPolynomial ℝ n ν) =
    (Polynomial.aeval ↑x) (n • Polynomial.X * (1 - Polynomial.X))
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n = ↑x * (1 - ↑x) * ↑n
state_after: n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n = ↑x * (1 - ↑x) * ↑n

tactic: congr 1
state_before: case h.e'_2
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
⊢ ∑ i : Fin (n + 1), (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n =
    ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1)
state_after: case h.e'_2.e_f
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
⊢ (fun i => (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n) = fun x_1 =>
    (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1)

tactic: funext k
state_before: case h.e'_2.e_f
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
⊢ (fun i => (↑x - ↑↑i / ↑n) ^ 2 * (bernstein n ↑i) x * ↑n * ↑n) = fun x_1 =>
    (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1)
state_after: case h.e'_2.e_f.h
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
k : Fin (n + 1)
⊢ (↑x - ↑↑k / ↑n) ^ 2 * (bernstein n ↑k) x * ↑n * ↑n =
    (↑n * ↑x - ↑↑k) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑k)

tactic: rw [mul_comm _ (n : ℝ), mul_comm _ (n : ℝ), ← mul_assoc, ← mul_assoc]
state_before: case h.e'_2.e_f.h
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
k : Fin (n + 1)
⊢ (↑x - ↑↑k / ↑n) ^ 2 * (bernstein n ↑k) x * ↑n * ↑n =
    (↑n * ↑x - ↑↑k) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑k)
state_after: case h.e'_2.e_f.h
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
k : Fin (n + 1)
⊢ ↑n * ↑n * (↑x - ↑↑k / ↑n) ^ 2 * (bernstein n ↑k) x =
    (↑n * ↑x - ↑↑k) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑k)

tactic: congr 1
state_before: case h.e'_2.e_f.h
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
k : Fin (n + 1)
⊢ ↑n * ↑n * (↑x - ↑↑k / ↑n) ^ 2 * (bernstein n ↑k) x =
    (↑n * ↑x - ↑↑k) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑k)
state_after: case h.e'_2.e_f.h.e_a
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
k : Fin (n + 1)
⊢ ↑n * ↑n * (↑x - ↑↑k / ↑n) ^ 2 = (↑n * ↑x - ↑↑k) ^ 2

tactic: field_simp [h]
state_before: case h.e'_2.e_f.h.e_a
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
k : Fin (n + 1)
⊢ ↑n * ↑n * (↑x - ↑↑k / ↑n) ^ 2 = (↑n * ↑x - ↑↑k) ^ 2
state_after: case h.e'_2.e_f.h.e_a
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
k : Fin (n + 1)
⊢ ↑n * ↑n * (↑x * ↑n - ↑↑k) ^ 2 = (↑n * ↑x - ↑↑k) ^ 2 * ↑n ^ 2

tactic: ring
state_before: case h.e'_2.e_f.h.e_a
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
k : Fin (n + 1)
⊢ ↑n * ↑n * (↑x * ↑n - ↑↑k) ^ 2 = (↑n * ↑x - ↑↑k) ^ 2 * ↑n ^ 2
state_after: no goals

tactic: ring
state_before: case h.e'_3
n : ℕ
h : 0 < ↑n
x : ↑I
h' : ↑n ≠ 0
this :
  ∑ x_1 : Fin (n + 1), (↑n * ↑x - ↑↑x_1) ^ 2 * Polynomial.eval (↑x) (bernsteinPolynomial ℝ n ↑x_1) = ↑n * ↑x * (1 - ↑x)
⊢ ↑x * (1 - ↑x) * ↑n = ↑n * ↑x * (1 - ↑x)
state_after: no goals