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

Proof steps:
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: have h' : (n : ℝ) ≠ 0 := ne_of_gt 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: 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) ((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: dsimp
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_lhs => simp only [Finset.sum_mul, z]
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: 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
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: have := bernsteinPolynomial.variance ℝ n
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: apply_fun fun p => Polynomial.aeval (x : ℝ) p 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: 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 :
  ∑ 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: convert this using 1