Theorem: Finset.sum_pow_of_commute
File: Mathlib/Data/Nat/Choose/Multinomial.lean

Proof steps:
state_before: α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
s : Finset α
hc : (↑s).Pairwise fun i j => Commute (x i) (x j)
⊢ ∀ (n : ℕ), s.sum x ^ n = ∑ k : { x // x ∈ s.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
state_after: case empty
α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
hc : (↑∅).Pairwise fun i j => Commute (x i) (x j)
⊢ ∀ (n : ℕ), ∅.sum x ^ n = ∑ k : { x // x ∈ ∅.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯

case insert
α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
a : α
s : Finset α
ha : a ∉ s
ih :
  ∀ (hc : (↑s).Pairwise fun i j => Commute (x i) (x j)) (n : ℕ),
    s.sum x ^ n = ∑ k : { x // x ∈ s.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
hc : (↑(insert a s)).Pairwise fun i j => Commute (x i) (x j)
⊢ ∀ (n : ℕ),
    (insert a s).sum x ^ n =
      ∑ k : { x // x ∈ (insert a s).sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
tactic: induction' s using Finset.induction with a s ha ih
state_before: case insert
α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
a : α
s : Finset α
ha : a ∉ s
ih :
  ∀ (hc : (↑s).Pairwise fun i j => Commute (x i) (x j)) (n : ℕ),
    s.sum x ^ n = ∑ k : { x // x ∈ s.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
hc : (↑(insert a s)).Pairwise fun i j => Commute (x i) (x j)
⊢ ∀ (n : ℕ),
    (insert a s).sum x ^ n =
      ∑ k : { x // x ∈ (insert a s).sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
state_after: case insert
α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
a : α
s : Finset α
ha : a ∉ s
ih :
  ∀ (hc : (↑s).Pairwise fun i j => Commute (x i) (x j)) (n : ℕ),
    s.sum x ^ n = ∑ k : { x // x ∈ s.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
hc : (↑(insert a s)).Pairwise fun i j => Commute (x i) (x j)
n : ℕ
⊢ (insert a s).sum x ^ n =
    ∑ k : { x // x ∈ (insert a s).sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
tactic: intro n
state_before: case insert
α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
a : α
s : Finset α
ha : a ∉ s
ih :
  ∀ (hc : (↑s).Pairwise fun i j => Commute (x i) (x j)) (n : ℕ),
    s.sum x ^ n = ∑ k : { x // x ∈ s.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
hc : (↑(insert a s)).Pairwise fun i j => Commute (x i) (x j)
n : ℕ
⊢ (insert a s).sum x ^ n =
    ∑ k : { x // x ∈ (insert a s).sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
state_after: case insert
α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
a : α
s : Finset α
ha : a ∉ s
hc : (↑(insert a s)).Pairwise fun i j => Commute (x i) (x j)
n : ℕ
ih : ∀ (n : ℕ), s.sum x ^ n = ∑ k : { x // x ∈ s.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
⊢ (insert a s).sum x ^ n =
    ∑ k : { x // x ∈ (insert a s).sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
tactic: specialize ih (hc.mono <| s.subset_insert a)
state_before: case insert
α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
a : α
s : Finset α
ha : a ∉ s
hc : (↑(insert a s)).Pairwise fun i j => Commute (x i) (x j)
n : ℕ
ih : ∀ (n : ℕ), s.sum x ^ n = ∑ k : { x // x ∈ s.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
⊢ (insert a s).sum x ^ n =
    ∑ k : { x // x ∈ (insert a s).sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
state_after: case insert
α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
a : α
s : Finset α
ha : a ∉ s
hc : (↑(insert a s)).Pairwise fun i j => Commute (x i) (x j)
n : ℕ
ih : ∀ (n : ℕ), s.sum x ^ n = ∑ k : { x // x ∈ s.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
⊢ ∑ i : Fin (n + 1), x a ^ ↑i * (∑ i ∈ s, x i) ^ (n - ↑i) * ↑(n.choose ↑i) =
    ∑ k : { x // x ∈ (insert a s).sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯

α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
a : α
s : Finset α
ha : a ∉ s
hc : (↑(insert a s)).Pairwise fun i j => Commute (x i) (x j)
n : ℕ
ih : ∀ (n : ℕ), s.sum x ^ n = ∑ k : { x // x ∈ s.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
⊢ ∀ i ∈ s, Commute (x a) (x i)
tactic: rw [sum_insert ha, (Commute.sum_right s _ _ _).add_pow, sum_range]
state_before: case insert
α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
a : α
s : Finset α
ha : a ∉ s
hc : (↑(insert a s)).Pairwise fun i j => Commute (x i) (x j)
n : ℕ
ih : ∀ (n : ℕ), s.sum x ^ n = ∑ k : { x // x ∈ s.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
⊢ ∑ i : Fin (n + 1), x a ^ ↑i * (∑ i ∈ s, x i) ^ (n - ↑i) * ↑(n.choose ↑i) =
    ∑ k : { x // x ∈ (insert a s).sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯

α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
a : α
s : Finset α
ha : a ∉ s
hc : (↑(insert a s)).Pairwise fun i j => Commute (x i) (x j)
n : ℕ
ih : ∀ (n : ℕ), s.sum x ^ n = ∑ k : { x // x ∈ s.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
⊢ ∀ i ∈ s, Commute (x a) (x i)
state_after: α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
a : α
s : Finset α
ha : a ∉ s
hc : (↑(insert a s)).Pairwise fun i j => Commute (x i) (x j)
n : ℕ
ih : ∀ (n : ℕ), s.sum x ^ n = ∑ k : { x // x ∈ s.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
⊢ ∀ i ∈ s, Commute (x a) (x i)

case insert
α : Type u_1
R : Type u_2
inst✝² : DecidableEq α
inst✝¹ inst✝ : Semiring R
x : α → R
a : α
s : Finset α
ha : a ∉ s
hc : (↑(insert a s)).Pairwise fun i j => Commute (x i) (x j)
n : ℕ
ih : ∀ (n : ℕ), s.sum x ^ n = ∑ k : { x // x ∈ s.sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
⊢ ∑ i : Fin (n + 1), x a ^ ↑i * (∑ i ∈ s, x i) ^ (n - ↑i) * ↑(n.choose ↑i) =
    ∑ k : { x // x ∈ (insert a s).sym n }, ↑(↑↑k).multinomial * (Multiset.map x ↑↑k).noncommProd ⋯
tactic: swap