Theorem: finFunctionFinEquiv_apply_val
File: Mathlib/Algebra/BigOperators/Fin.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
m n : ℕ
⊢ Fintype.card (Fin n → Fin m) = Fintype.card (Fin (m ^ n))
state_after: no goals
tactic: simp_rw [Fintype.card_fun, Fintype.card_fin]
state_before: α : Type u_1
β : Type u_2
m n : ℕ
f : Fin n → Fin m
⊢ ∑ i : Fin n, ↑(f i) * m ^ ↑i < m ^ n
state_after: case zero
α : Type u_1
β : Type u_2
m : ℕ
f : Fin 0 → Fin m
⊢ ∑ i : Fin 0, ↑(f i) * m ^ ↑i < m ^ 0

case succ
α : Type u_1
β : Type u_2
m n : ℕ
ih : ∀ (f : Fin n → Fin m), ∑ i : Fin n, ↑(f i) * m ^ ↑i < m ^ n
f : Fin (n + 1) → Fin m
⊢ ∑ i : Fin (n + 1), ↑(f i) * m ^ ↑i < m ^ (n + 1)
tactic: induction' n with n ih
state_before: case succ
α : Type u_1
β : Type u_2
m n : ℕ
ih : ∀ (f : Fin n → Fin m), ∑ i : Fin n, ↑(f i) * m ^ ↑i < m ^ n
f : Fin (n + 1) → Fin m
⊢ ∑ i : Fin (n + 1), ↑(f i) * m ^ ↑i < m ^ (n + 1)
state_after: case succ.zero
α : Type u_1
β : Type u_2
n : ℕ
ih : ∀ (f : Fin n → Fin 0), ∑ i : Fin n, ↑(f i) * 0 ^ ↑i < 0 ^ n
f : Fin (n + 1) → Fin 0
⊢ ∑ i : Fin (n + 1), ↑(f i) * 0 ^ ↑i < 0 ^ (n + 1)

case succ.succ
α : Type u_1
β : Type u_2
n n✝ : ℕ
ih : ∀ (f : Fin n → Fin (n✝ + 1)), ∑ i : Fin n, ↑(f i) * (n✝ + 1) ^ ↑i < (n✝ + 1) ^ n
f : Fin (n + 1) → Fin (n✝ + 1)
⊢ ∑ i : Fin (n + 1), ↑(f i) * (n✝ + 1) ^ ↑i < (n✝ + 1) ^ (n + 1)
tactic: cases m
state_before: case succ.succ
α : Type u_1
β : Type u_2
n n✝ : ℕ
ih : ∀ (f : Fin n → Fin (n✝ + 1)), ∑ i : Fin n, ↑(f i) * (n✝ + 1) ^ ↑i < (n✝ + 1) ^ n
f : Fin (n + 1) → Fin (n✝ + 1)
⊢ ∑ i : Fin (n + 1), ↑(f i) * (n✝ + 1) ^ ↑i < (n✝ + 1) ^ (n + 1)
state_after: case succ.succ
α : Type u_1
β : Type u_2
n n✝ : ℕ
ih : ∀ (f : Fin n → Fin (n✝ + 1)), ∑ i : Fin n, ↑(f i) * (n✝ + 1) ^ ↑i < (n✝ + 1) ^ n
f : Fin (n + 1) → Fin (n✝ + 1)
⊢ ∑ x : Fin n, ↑(f x.castSucc) * (n✝ + 1) ^ ↑x + ↑(f (Fin.last n)) * (n✝ + 1) ^ n < (n✝ + 1) ^ (n + 1)
tactic: simp_rw [Fin.sum_univ_castSucc, Fin.coe_castSucc, Fin.val_last]
state_before: case succ.succ
α : Type u_1
β : Type u_2
n n✝ : ℕ
ih : ∀ (f : Fin n → Fin (n✝ + 1)), ∑ i : Fin n, ↑(f i) * (n✝ + 1) ^ ↑i < (n✝ + 1) ^ n
f : Fin (n + 1) → Fin (n✝ + 1)
⊢ ∑ x : Fin n, ↑(f x.castSucc) * (n✝ + 1) ^ ↑x + ↑(f (Fin.last n)) * (n✝ + 1) ^ n < (n✝ + 1) ^ (n + 1)
state_after: case succ.succ
α : Type u_1
β : Type u_2
n n✝ : ℕ
ih : ∀ (f : Fin n → Fin (n✝ + 1)), ∑ i : Fin n, ↑(f i) * (n✝ + 1) ^ ↑i < (n✝ + 1) ^ n
f : Fin (n + 1) → Fin (n✝ + 1)
⊢ (n✝ + 1) ^ n + n✝ * (n✝ + 1) ^ n = (n✝ + 1) ^ (n + 1)
tactic: refine (Nat.add_lt_add_of_lt_of_le (ih _) <| Nat.mul_le_mul_right _ (Fin.is_le _)).trans_eq ?_
state_before: case succ.succ
α : Type u_1
β : Type u_2
n n✝ : ℕ
ih : ∀ (f : Fin n → Fin (n✝ + 1)), ∑ i : Fin n, ↑(f i) * (n✝ + 1) ^ ↑i < (n✝ + 1) ^ n
f : Fin (n + 1) → Fin (n✝ + 1)
⊢ (n✝ + 1) ^ n + n✝ * (n✝ + 1) ^ n = (n✝ + 1) ^ (n + 1)
state_after: no goals
tactic: rw [← one_add_mul (_ : ℕ), add_comm, pow_succ']
state_before: α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ n)
b : Fin n
⊢ ↑a / m ^ ↑b % m < m
state_after: case zero
α : Type u_1
β : Type u_2
m : ℕ
a : Fin (m ^ 0)
b : Fin 0
⊢ ↑a / m ^ ↑b % m < m

case succ
α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ (n + 1))
b : Fin (n + 1)
⊢ ↑a / m ^ ↑b % m < m
tactic: cases' n with n
state_before: case succ
α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ (n + 1))
b : Fin (n + 1)
⊢ ↑a / m ^ ↑b % m < m
state_after: case succ.zero
α : Type u_1
β : Type u_2
n : ℕ
b : Fin (n + 1)
a : Fin (0 ^ (n + 1))
⊢ ↑a / 0 ^ ↑b % 0 < 0

case succ.succ
α : Type u_1
β : Type u_2
n : ℕ
b : Fin (n + 1)
m : ℕ
a : Fin ((m + 1) ^ (n + 1))
⊢ ↑a / (m + 1) ^ ↑b % (m + 1) < m + 1
tactic: cases' m with m
state_before: α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ n)
⊢ (fun f => ⟨∑ i : Fin n, ↑(f i) * m ^ ↑i, ⋯⟩) ((fun a b => ⟨↑a / m ^ ↑b % m, ⋯⟩) a) = a
state_after: α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ n)
⊢ ⟨∑ i : Fin n, ↑a / m ^ ↑i % m * m ^ ↑i, ⋯⟩ = a
tactic: dsimp
state_before: α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ n)
⊢ ⟨∑ i : Fin n, ↑a / m ^ ↑i % m * m ^ ↑i, ⋯⟩ = a
state_after: case zero
α : Type u_1
β : Type u_2
m : ℕ
a : Fin (m ^ 0)
⊢ ⟨∑ i : Fin 0, ↑a / m ^ ↑i % m * m ^ ↑i, ⋯⟩ = a

case succ
α : Type u_1
β : Type u_2
m n : ℕ
ih : ∀ (a : Fin (m ^ n)), ⟨∑ i : Fin n, ↑a / m ^ ↑i % m * m ^ ↑i, ⋯⟩ = a
a : Fin (m ^ (n + 1))
⊢ ⟨∑ i : Fin (n + 1), ↑a / m ^ ↑i % m * m ^ ↑i, ⋯⟩ = a
tactic: induction' n with n ih
state_before: case succ
α : Type u_1
β : Type u_2
m n : ℕ
ih : ∀ (a : Fin (m ^ n)), ⟨∑ i : Fin n, ↑a / m ^ ↑i % m * m ^ ↑i, ⋯⟩ = a
a : Fin (m ^ (n + 1))
⊢ ⟨∑ i : Fin (n + 1), ↑a / m ^ ↑i % m * m ^ ↑i, ⋯⟩ = a
state_after: case succ
α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ (n + 1))
ih : ∀ i < m ^ n, ∑ x : Fin n, i / m ^ ↑x % m * m ^ ↑x = i
⊢ ⟨∑ i : Fin (n + 1), ↑a / m ^ ↑i % m * m ^ ↑i, ⋯⟩ = a
tactic: simp_rw [Fin.forall_iff, Fin.ext_iff] at ih
state_before: case succ
α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ (n + 1))
ih : ∀ i < m ^ n, ∑ x : Fin n, i / m ^ ↑x % m * m ^ ↑x = i
⊢ ⟨∑ i : Fin (n + 1), ↑a / m ^ ↑i % m * m ^ ↑i, ⋯⟩ = a
state_after: case succ.h
α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ (n + 1))
ih : ∀ i < m ^ n, ∑ x : Fin n, i / m ^ ↑x % m * m ^ ↑x = i
⊢ ↑⟨∑ i : Fin (n + 1), ↑a / m ^ ↑i % m * m ^ ↑i, ⋯⟩ = ↑a
tactic: ext
state_before: case succ.h
α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ (n + 1))
ih : ∀ i < m ^ n, ∑ x : Fin n, i / m ^ ↑x % m * m ^ ↑x = i
⊢ ↑⟨∑ i : Fin (n + 1), ↑a / m ^ ↑i % m * m ^ ↑i, ⋯⟩ = ↑a
state_after: case succ.h
α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ (n + 1))
ih : ∀ i < m ^ n, ∑ x : Fin n, i / m ^ ↑x % m * m ^ ↑x = i
⊢ ↑a % m + m * ∑ i : Fin n, ↑a / m / m ^ ↑i % m * m ^ ↑i = ↑a
tactic: simp_rw [Fin.sum_univ_succ, Fin.val_zero, Fin.val_succ, pow_zero, Nat.div_one,
        mul_one, pow_succ', ← Nat.div_div_eq_div_mul, mul_left_comm _ m, ← mul_sum]
state_before: case succ.h
α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ (n + 1))
ih : ∀ i < m ^ n, ∑ x : Fin n, i / m ^ ↑x % m * m ^ ↑x = i
⊢ ↑a % m + m * ∑ i : Fin n, ↑a / m / m ^ ↑i % m * m ^ ↑i = ↑a
state_after: α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ (n + 1))
ih : ∀ i < m ^ n, ∑ x : Fin n, i / m ^ ↑x % m * m ^ ↑x = i
⊢ ↑a < m * m ^ n
tactic: rw [ih _ (Nat.div_lt_of_lt_mul ?_), Nat.mod_add_div]
state_before: α : Type u_1
β : Type u_2
m n : ℕ
a : Fin (m ^ (n + 1))
ih : ∀ i < m ^ n, ∑ x : Fin n, i / m ^ ↑x % m * m ^ ↑x = i
⊢ ↑a < m * m ^ n
state_after: no goals
tactic: exact a.is_lt.trans_eq (pow_succ' _ _)