Theorem: LinearRecurrence.eq_mk_of_is_sol_of_eq_init
File: Mathlib/Algebra/LinearRecurrence.lean

tactic: intro n
state_before: α : Type u_1
inst✝ : CommSemiring α
E : LinearRecurrence α
u : ℕ → α
init : Fin E.order → α
h : IsSolution E u
heq : ∀ (n : Fin E.order), u ↑n = init n
⊢ ∀ (n : ℕ), u n = mkSol E init n

tactic: rw [mkSol]
state_before: α : Type u_1
inst✝ : CommSemiring α
E : LinearRecurrence α
u : ℕ → α
init : Fin E.order → α
h : IsSolution E u
heq : ∀ (n : Fin E.order), u ↑n = init n
n : ℕ
⊢ u n = mkSol E init n

tactic: split_ifs with h'
state_before: α : Type u_1
inst✝ : CommSemiring α
E : LinearRecurrence α
u : ℕ → α
init : Fin E.order → α
h : IsSolution E u
heq : ∀ (n : Fin E.order), u ↑n = init n
n : ℕ
⊢ u n =
    if h : n < E.order then init { val := n, isLt := h }
    else
      ∑ k : Fin E.order,
        let_fun x := (_ : n - E.order + ↑k < n);
        coeffs E k * mkSol E init (n - E.order + ↑k)

tactic: simp only
state_before: case inr
α : Type u_1
inst✝ : CommSemiring α
E : LinearRecurrence α
u : ℕ → α
init : Fin E.order → α
h : IsSolution E u
heq : ∀ (n : Fin E.order), u ↑n = init n
n : ℕ
h' : ¬n < E.order
⊢ u n =
    ∑ k : Fin E.order,
      let_fun x := (_ : n - E.order + ↑k < n);
      coeffs E k * mkSol E init (n - E.order + ↑k)

tactic: rw [← tsub_add_cancel_of_le (le_of_not_lt h'), h (n - E.order)]
state_before: case inr
α : Type u_1
inst✝ : CommSemiring α
E : LinearRecurrence α
u : ℕ → α
init : Fin E.order → α
h : IsSolution E u
heq : ∀ (n : Fin E.order), u ↑n = init n
n : ℕ
h' : ¬n < E.order
⊢ u n = ∑ x : Fin E.order, coeffs E x * mkSol E init (n - E.order + ↑x)

tactic: congr with k
state_before: case inr
α : Type u_1
inst✝ : CommSemiring α
E : LinearRecurrence α
u : ℕ → α
init : Fin E.order → α
h : IsSolution E u
heq : ∀ (n : Fin E.order), u ↑n = init n
n : ℕ
h' : ¬n < E.order
⊢ ∑ i : Fin E.order, coeffs E i * u (n - E.order + ↑i) =
    ∑ x : Fin E.order, coeffs E x * mkSol E init (n - E.order + E.order - E.order + ↑x)

tactic: rw [eq_mk_of_is_sol_of_eq_init h heq (n - E.order + k)]
state_before: case inr.e_f.h
α : Type u_1
inst✝ : CommSemiring α
E : LinearRecurrence α
u : ℕ → α
init : Fin E.order → α
h : IsSolution E u
heq : ∀ (n : Fin E.order), u ↑n = init n
n : ℕ
h' : ¬n < E.order
k : Fin E.order
this : n - E.order + ↑k < n
⊢ coeffs E k * u (n - E.order + ↑k) = coeffs E k * mkSol E init (n - E.order + E.order - E.order + ↑k)

tactic: simp
state_before: case inr.e_f.h
α : Type u_1
inst✝ : CommSemiring α
E : LinearRecurrence α
u : ℕ → α
init : Fin E.order → α
h : IsSolution E u
heq : ∀ (n : Fin E.order), u ↑n = init n
n : ℕ
h' : ¬n < E.order
k : Fin E.order
this : n - E.order + ↑k < n
⊢ coeffs E k * mkSol E (fun n => init n) (n - E.order + ↑k) =
    coeffs E k * mkSol E init (n - E.order + E.order - E.order + ↑k)

tactic: exact_mod_cast heq ⟨n, h'⟩
state_before: case inl
α : Type u_1
inst✝ : CommSemiring α
E : LinearRecurrence α
u : ℕ → α
init : Fin E.order → α
h : IsSolution E u
heq : ∀ (n : Fin E.order), u ↑n = init n
n : ℕ
h' : n < E.order
⊢ u n = init { val := n, isLt := h' }

tactic: rw [add_comm, ← add_tsub_assoc_of_le (not_lt.mp h'), tsub_lt_iff_left]
state_before: α : Type u_1
inst✝ : CommSemiring α
E : LinearRecurrence α
u : ℕ → α
init : Fin E.order → α
h : IsSolution E u
heq : ∀ (n : Fin E.order), u ↑n = init n
n : ℕ
h' : ¬n < E.order
k : Fin E.order
⊢ n - E.order + ↑k < n

tactic: exact add_lt_add_right k.is_lt n
state_before: α : Type u_1
inst✝ : CommSemiring α
E : LinearRecurrence α
u : ℕ → α
init : Fin E.order → α
h : IsSolution E u
heq : ∀ (n : Fin E.order), u ↑n = init n
n : ℕ
h' : ¬n < E.order
k : Fin E.order
⊢ ↑k + n < E.order + n

tactic: convert add_le_add (zero_le (k : ℕ)) (not_lt.mp h')
state_before: α : Type u_1
inst✝ : CommSemiring α
E : LinearRecurrence α
u : ℕ → α
init : Fin E.order → α
h : IsSolution E u
heq : ∀ (n : Fin E.order), u ↑n = init n
n : ℕ
h' : ¬n < E.order
k : Fin E.order
⊢ E.order ≤ ↑k + n

tactic: simp only [zero_add]
state_before: case h.e'_3
α : Type u_1
inst✝ : CommSemiring α
E : LinearRecurrence α
u : ℕ → α
init : Fin E.order → α
h : IsSolution E u
heq : ∀ (n : Fin E.order), u ↑n = init n
n : ℕ
h' : ¬n < E.order
k : Fin E.order
⊢ E.order = 0 + E.order