Theorem: TrivSqZeroExt.snd_pow_of_smul_comm
File: Mathlib/Algebra/TrivSqZeroExt.lean

tactic: simp_rw [snd_pow_eq_sum, this, smul_smul, ← pow_add]
state_before: R : Type u
M : Type v
inst✝⁴ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : DistribMulAction Rᵐᵒᵖ M
inst✝ : SMulCommClass R Rᵐᵒᵖ M
x : tsze R M
n : ℕ
h : op (fst x) • snd x = fst x • snd x
this : ∀ (n : ℕ), op (fst x ^ n) • snd x = fst x ^ n • snd x
⊢ snd (x ^ n) = n • fst x ^ Nat.pred n • snd x

tactic: intro n
state_before: R : Type u
M : Type v
inst✝⁴ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : DistribMulAction Rᵐᵒᵖ M
inst✝ : SMulCommClass R Rᵐᵒᵖ M
x : tsze R M
n : ℕ
h : op (fst x) • snd x = fst x • snd x
⊢ ∀ (n : ℕ), op (fst x ^ n) • snd x = fst x ^ n • snd x

tactic: induction' n with n ih
state_before: R : Type u
M : Type v
inst✝⁴ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : DistribMulAction Rᵐᵒᵖ M
inst✝ : SMulCommClass R Rᵐᵒᵖ M
x : tsze R M
n✝ : ℕ
h : op (fst x) • snd x = fst x • snd x
n : ℕ
⊢ op (fst x ^ n) • snd x = fst x ^ n • snd x

tactic: simp
state_before: case zero
R : Type u
M : Type v
inst✝⁴ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : DistribMulAction Rᵐᵒᵖ M
inst✝ : SMulCommClass R Rᵐᵒᵖ M
x : tsze R M
n : ℕ
h : op (fst x) • snd x = fst x • snd x
⊢ op (fst x ^ Nat.zero) • snd x = fst x ^ Nat.zero • snd x

tactic: rw [pow_succ', MulOpposite.op_mul, mul_smul, mul_smul, ← h,
  smul_comm (_ : R) (op x.fst) x.snd, ih]
state_before: case succ
R : Type u
M : Type v
inst✝⁴ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : DistribMulAction Rᵐᵒᵖ M
inst✝ : SMulCommClass R Rᵐᵒᵖ M
x : tsze R M
n✝ : ℕ
h : op (fst x) • snd x = fst x • snd x
n : ℕ
ih : op (fst x ^ n) • snd x = fst x ^ n • snd x
⊢ op (fst x ^ Nat.succ n) • snd x = fst x ^ Nat.succ n • snd x

tactic: rw [Nat.pred_zero, pow_zero, List.range_zero, zero_smul, List.map_nil, List.sum_nil]
state_before: R : Type u
M : Type v
inst✝⁴ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : DistribMulAction Rᵐᵒᵖ M
inst✝ : SMulCommClass R Rᵐᵒᵖ M
x : tsze R M
n : ℕ
h : op (fst x) • snd x = fst x • snd x
this : ∀ (n : ℕ), op (fst x ^ n) • snd x = fst x ^ n • snd x
⊢ List.sum (List.map (fun i => fst x ^ (Nat.pred 0 - i + i) • snd x) (List.range 0)) = 0 • fst x ^ Nat.pred 0 • snd x

tactic: simp_rw [Nat.pred_succ]
state_before: R : Type u
M : Type v
inst✝⁴ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : DistribMulAction Rᵐᵒᵖ M
inst✝ : SMulCommClass R Rᵐᵒᵖ M
x : tsze R M
n✝ : ℕ
h : op (fst x) • snd x = fst x • snd x
this : ∀ (n : ℕ), op (fst x ^ n) • snd x = fst x ^ n • snd x
n : ℕ
⊢ List.sum (List.map (fun i => fst x ^ (Nat.pred (Nat.succ n) - i + i) • snd x) (List.range (Nat.succ n))) =
    Nat.succ n • fst x ^ Nat.pred (Nat.succ n) • snd x

tactic: refine' (List.sum_eq_card_nsmul _ (x.fst ^ n • x.snd) _).trans _
state_before: R : Type u
M : Type v
inst✝⁴ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : DistribMulAction Rᵐᵒᵖ M
inst✝ : SMulCommClass R Rᵐᵒᵖ M
x : tsze R M
n✝ : ℕ
h : op (fst x) • snd x = fst x • snd x
this : ∀ (n : ℕ), op (fst x ^ n) • snd x = fst x ^ n • snd x
n : ℕ
⊢ List.sum (List.map (fun i => fst x ^ (n - i + i) • snd x) (List.range (Nat.succ n))) = Nat.succ n • fst x ^ n • snd x

tactic: rintro m hm
state_before: case refine'_1
R : Type u
M : Type v
inst✝⁴ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : DistribMulAction Rᵐᵒᵖ M
inst✝ : SMulCommClass R Rᵐᵒᵖ M
x : tsze R M
n✝ : ℕ
h : op (fst x) • snd x = fst x • snd x
this : ∀ (n : ℕ), op (fst x ^ n) • snd x = fst x ^ n • snd x
n : ℕ
⊢ ∀ (x_1 : M), x_1 ∈ List.map (fun i => fst x ^ (n - i + i) • snd x) (List.range (Nat.succ n)) → x_1 = fst x ^ n • snd x

tactic: simp_rw [List.mem_map, List.mem_range] at hm
state_before: case refine'_1
R : Type u
M : Type v
inst✝⁴ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : DistribMulAction Rᵐᵒᵖ M
inst✝ : SMulCommClass R Rᵐᵒᵖ M
x : tsze R M
n✝ : ℕ
h : op (fst x) • snd x = fst x • snd x
this : ∀ (n : ℕ), op (fst x ^ n) • snd x = fst x ^ n • snd x
n : ℕ
m : M
hm : m ∈ List.map (fun i => fst x ^ (n - i + i) • snd x) (List.range (Nat.succ n))
⊢ m = fst x ^ n • snd x

tactic: obtain ⟨i, hi, rfl⟩ := hm
state_before: case refine'_1
R : Type u
M : Type v
inst✝⁴ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : DistribMulAction Rᵐᵒᵖ M
inst✝ : SMulCommClass R Rᵐᵒᵖ M
x : tsze R M
n✝ : ℕ
h : op (fst x) • snd x = fst x • snd x
this : ∀ (n : ℕ), op (fst x ^ n) • snd x = fst x ^ n • snd x
n : ℕ
m : M
hm : ∃ a, a < Nat.succ n ∧ fst x ^ (n - a + a) • snd x = m
⊢ m = fst x ^ n • snd x

tactic: rw [tsub_add_cancel_of_le (Nat.lt_succ_iff.mp hi)]
state_before: case refine'_1.intro.intro
R : Type u
M : Type v
inst✝⁴ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : DistribMulAction Rᵐᵒᵖ M
inst✝ : SMulCommClass R Rᵐᵒᵖ M
x : tsze R M
n✝ : ℕ
h : op (fst x) • snd x = fst x • snd x
this : ∀ (n : ℕ), op (fst x ^ n) • snd x = fst x ^ n • snd x
n i : ℕ
hi : i < Nat.succ n
⊢ fst x ^ (n - i + i) • snd x = fst x ^ n • snd x

tactic: rw [List.length_map, List.length_range]
state_before: case refine'_2
R : Type u
M : Type v
inst✝⁴ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : DistribMulAction Rᵐᵒᵖ M
inst✝ : SMulCommClass R Rᵐᵒᵖ M
x : tsze R M
n✝ : ℕ
h : op (fst x) • snd x = fst x • snd x
this : ∀ (n : ℕ), op (fst x ^ n) • snd x = fst x ^ n • snd x
n : ℕ
⊢ List.length (List.map (fun i => fst x ^ (n - i + i) • snd x) (List.range (Nat.succ n))) • fst x ^ n • snd x =
    Nat.succ n • fst x ^ n • snd x