-- Mathlib/Analysis/SpecialFunctions/Bernstein.lean
theorem variance {n : ℕ} (h : 0 < (n : ℝ)) (x : I) :
    (∑ k : Fin (n + 1), (x - k/ₙ : ℝ) ^ 2 * bernstein n k x) = (x : ℝ) * (1 - x) / n

Proof state:
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

Result:
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

Proof state:
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

Result:
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)

Proof state:
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

Result:
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)

Proof state:
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)

Tactic:
congr 1

Result:
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)

Proof state:
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

Result:
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

Proof state:
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]

Result:
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

Proof state:
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

Result:
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

Proof state:
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

Result:
no goals

Proof state:
n : ℕ
h : 0 < ↑n
x : ↑I
⊢ ∑ k : Fin (n + 1), (↑x - ↑(k/ₙ)) ^ 2 * (bernstein n ↑k) x = ↑x * (1 - ↑x) / ↑n

Tactic:
have h' : (n : ℝ) ≠ 0 := ne_of_gt h

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

Proof state:
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_left_injective h'

Result:
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)

Proof state:
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]

Result:
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

Proof state:
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_left_injective h'

Result:
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))

Proof state:
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? [map_sum, Finset.sum_range, ← Polynomial.natCast_mul] at this says
  simp only [nsmul_eq_mul, Finset.sum_range, map_sum, Polynomial.coe_aeval_eq_eval,
    Polynomial.eval_mul, Polynomial.eval_pow, Polynomial.eval_sub, Polynomial.eval_natCast,
    Polynomial.eval_X, Polynomial.eval_one] at this

Result:
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

Proof state:
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']

Result:
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