Theorem: GeneralizedContinuedFraction.continuantsAux_eq_continuantsAux_squashGCF_of_le
File: Mathlib/Algebra/ContinuedFractions/ConvergentsEquiv.lean

tactic: clear m
state_before: K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
m : ℕ
⊢ ∀ (n_1 : ℕ),
    (∀ m < n_1, m ≤ n → g.continuantsAux m = (g.squashGCF n).continuantsAux m) →
      n_1 ≤ n → g.continuantsAux n_1 = (g.squashGCF n).continuantsAux n_1
state_after: K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
⊢ ∀ (n_1 : ℕ),
    (∀ m < n_1, m ≤ n → g.continuantsAux m = (g.squashGCF n).continuantsAux m) →
      n_1 ≤ n → g.continuantsAux n_1 = (g.squashGCF n).continuantsAux n_1

tactic: intro m IH m_le_n
state_before: K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
⊢ ∀ (n_1 : ℕ),
    (∀ m < n_1, m ≤ n → g.continuantsAux m = (g.squashGCF n).continuantsAux m) →
      n_1 ≤ n → g.continuantsAux n_1 = (g.squashGCF n).continuantsAux n_1
state_after: K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
m : ℕ
IH : ∀ m_1 < m, m_1 ≤ n → g.continuantsAux m_1 = (g.squashGCF n).continuantsAux m_1
m_le_n : m ≤ n
⊢ g.continuantsAux m = (g.squashGCF n).continuantsAux m

tactic: cases' m with m'
state_before: K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
m : ℕ
IH : ∀ m_1 < m, m_1 ≤ n → g.continuantsAux m_1 = (g.squashGCF n).continuantsAux m_1
m_le_n : m ≤ n
⊢ g.continuantsAux m = (g.squashGCF n).continuantsAux m
state_after: case zero
K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
IH : ∀ m < 0, m ≤ n → g.continuantsAux m = (g.squashGCF n).continuantsAux m
m_le_n : 0 ≤ n
⊢ g.continuantsAux 0 = (g.squashGCF n).continuantsAux 0

case succ
K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
m' : ℕ
IH : ∀ m < m' + 1, m ≤ n → g.continuantsAux m = (g.squashGCF n).continuantsAux m
m_le_n : m' + 1 ≤ n
⊢ g.continuantsAux (m' + 1) = (g.squashGCF n).continuantsAux (m' + 1)

tactic: rfl
state_before: case zero
K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
IH : ∀ m < 0, m ≤ n → g.continuantsAux m = (g.squashGCF n).continuantsAux m
m_le_n : 0 ≤ n
⊢ g.continuantsAux 0 = (g.squashGCF n).continuantsAux 0
state_after: no goals

tactic: cases' n with n'
state_before: case succ
K : Type u_1
n : ℕ
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
m' : ℕ
IH : ∀ m < m' + 1, m ≤ n → g.continuantsAux m = (g.squashGCF n).continuantsAux m
m_le_n : m' + 1 ≤ n
⊢ g.continuantsAux (m' + 1) = (g.squashGCF n).continuantsAux (m' + 1)
state_after: case succ.zero
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
m' : ℕ
IH : ∀ m < m' + 1, m ≤ 0 → g.continuantsAux m = (g.squashGCF 0).continuantsAux m
m_le_n : m' + 1 ≤ 0
⊢ g.continuantsAux (m' + 1) = (g.squashGCF 0).continuantsAux (m' + 1)

case succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
m' n' : ℕ
IH : ∀ m < m' + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m' + 1 ≤ n' + 1
⊢ g.continuantsAux (m' + 1) = (g.squashGCF (n' + 1)).continuantsAux (m' + 1)

tactic: exact (m'.not_succ_le_zero m_le_n).elim
state_before: case succ.zero
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
m' : ℕ
IH : ∀ m < m' + 1, m ≤ 0 → g.continuantsAux m = (g.squashGCF 0).continuantsAux m
m_le_n : m' + 1 ≤ 0
⊢ g.continuantsAux (m' + 1) = (g.squashGCF 0).continuantsAux (m' + 1)
state_after: no goals

tactic: cases' m' with m''
state_before: case succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
m' n' : ℕ
IH : ∀ m < m' + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m' + 1 ≤ n' + 1
⊢ g.continuantsAux (m' + 1) = (g.squashGCF (n' + 1)).continuantsAux (m' + 1)
state_after: case succ.succ.zero
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' : ℕ
IH : ∀ m < 0 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : 0 + 1 ≤ n' + 1
⊢ g.continuantsAux (0 + 1) = (g.squashGCF (n' + 1)).continuantsAux (0 + 1)

case succ.succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' m'' : ℕ
IH : ∀ m < m'' + 1 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m'' + 1 + 1 ≤ n' + 1
⊢ g.continuantsAux (m'' + 1 + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1 + 1)

tactic: rfl
state_before: case succ.succ.zero
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' : ℕ
IH : ∀ m < 0 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : 0 + 1 ≤ n' + 1
⊢ g.continuantsAux (0 + 1) = (g.squashGCF (n' + 1)).continuantsAux (0 + 1)
state_after: no goals

tactic: have m'_lt_n : m'' + 1 < n' + 1 := m_le_n
state_before: case succ.succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' m'' : ℕ
IH : ∀ m < m'' + 1 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m'' + 1 + 1 ≤ n' + 1
⊢ g.continuantsAux (m'' + 1 + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1 + 1)
state_after: case succ.succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' m'' : ℕ
IH : ∀ m < m'' + 1 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m'' + 1 + 1 ≤ n' + 1
m'_lt_n : m'' + 1 < n' + 1
⊢ g.continuantsAux (m'' + 1 + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1 + 1)

tactic: have succ_m''th_conts_aux_eq := IH (m'' + 1) (lt_add_one (m'' + 1)) m'_lt_n.le
state_before: case succ.succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' m'' : ℕ
IH : ∀ m < m'' + 1 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m'' + 1 + 1 ≤ n' + 1
m'_lt_n : m'' + 1 < n' + 1
⊢ g.continuantsAux (m'' + 1 + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1 + 1)
state_after: case succ.succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' m'' : ℕ
IH : ∀ m < m'' + 1 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m'' + 1 + 1 ≤ n' + 1
m'_lt_n : m'' + 1 < n' + 1
succ_m''th_conts_aux_eq : g.continuantsAux (m'' + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1)
⊢ g.continuantsAux (m'' + 1 + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1 + 1)

tactic: have : m'' < m'' + 2 := lt_add_of_pos_right m'' zero_lt_two
state_before: case succ.succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' m'' : ℕ
IH : ∀ m < m'' + 1 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m'' + 1 + 1 ≤ n' + 1
m'_lt_n : m'' + 1 < n' + 1
succ_m''th_conts_aux_eq : g.continuantsAux (m'' + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1)
⊢ g.continuantsAux (m'' + 1 + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1 + 1)
state_after: case succ.succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' m'' : ℕ
IH : ∀ m < m'' + 1 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m'' + 1 + 1 ≤ n' + 1
m'_lt_n : m'' + 1 < n' + 1
succ_m''th_conts_aux_eq : g.continuantsAux (m'' + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1)
this : m'' < m'' + 2
⊢ g.continuantsAux (m'' + 1 + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1 + 1)

tactic: have m''th_conts_aux_eq := IH m'' this (le_trans this.le m_le_n)
state_before: case succ.succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' m'' : ℕ
IH : ∀ m < m'' + 1 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m'' + 1 + 1 ≤ n' + 1
m'_lt_n : m'' + 1 < n' + 1
succ_m''th_conts_aux_eq : g.continuantsAux (m'' + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1)
this : m'' < m'' + 2
⊢ g.continuantsAux (m'' + 1 + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1 + 1)
state_after: case succ.succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' m'' : ℕ
IH : ∀ m < m'' + 1 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m'' + 1 + 1 ≤ n' + 1
m'_lt_n : m'' + 1 < n' + 1
succ_m''th_conts_aux_eq : g.continuantsAux (m'' + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1)
this : m'' < m'' + 2
m''th_conts_aux_eq : g.continuantsAux m'' = (g.squashGCF (n' + 1)).continuantsAux m''
⊢ g.continuantsAux (m'' + 1 + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1 + 1)

tactic: have : (squashGCF g (n' + 1)).s.get? m'' = g.s.get? m'' :=
  squashGCF_nth_of_lt (Nat.succ_lt_succ_iff.mp m'_lt_n)
state_before: case succ.succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' m'' : ℕ
IH : ∀ m < m'' + 1 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m'' + 1 + 1 ≤ n' + 1
m'_lt_n : m'' + 1 < n' + 1
succ_m''th_conts_aux_eq : g.continuantsAux (m'' + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1)
this : m'' < m'' + 2
m''th_conts_aux_eq : g.continuantsAux m'' = (g.squashGCF (n' + 1)).continuantsAux m''
⊢ g.continuantsAux (m'' + 1 + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1 + 1)
state_after: case succ.succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' m'' : ℕ
IH : ∀ m < m'' + 1 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m'' + 1 + 1 ≤ n' + 1
m'_lt_n : m'' + 1 < n' + 1
succ_m''th_conts_aux_eq : g.continuantsAux (m'' + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1)
this✝ : m'' < m'' + 2
m''th_conts_aux_eq : g.continuantsAux m'' = (g.squashGCF (n' + 1)).continuantsAux m''
this : (g.squashGCF (n' + 1)).s.get? m'' = g.s.get? m''
⊢ g.continuantsAux (m'' + 1 + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1 + 1)

tactic: simp [continuantsAux, succ_m''th_conts_aux_eq, m''th_conts_aux_eq, this]
state_before: case succ.succ.succ
K : Type u_1
g : GeneralizedContinuedFraction K
s : Stream'.Seq (Pair K)
inst✝ : DivisionRing K
n' m'' : ℕ
IH : ∀ m < m'' + 1 + 1, m ≤ n' + 1 → g.continuantsAux m = (g.squashGCF (n' + 1)).continuantsAux m
m_le_n : m'' + 1 + 1 ≤ n' + 1
m'_lt_n : m'' + 1 < n' + 1
succ_m''th_conts_aux_eq : g.continuantsAux (m'' + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1)
this✝ : m'' < m'' + 2
m''th_conts_aux_eq : g.continuantsAux m'' = (g.squashGCF (n' + 1)).continuantsAux m''
this : (g.squashGCF (n' + 1)).s.get? m'' = g.s.get? m''
⊢ g.continuantsAux (m'' + 1 + 1) = (g.squashGCF (n' + 1)).continuantsAux (m'' + 1 + 1)
state_after: no goals