CubicPathwidth.T4.SeqH
Source file CubicPathwidth/T4/SeqH.lean of the Lean project (how it is built).
import CubicPathwidth.T4.Defs
/-!
# (E1) for the bootstrap sequence `sigma`: `seqClaim_h : SeqClaim`
Write `u_d = 1 - sigma d`. With `k : ℕ` the basic facts are:
* `seqH_rec`: `(k+7) σ_{k+7} = (k+5) σ_{k+6} + σ_{k+5} + 1` (the defining recurrence);
* `seqH_D`: `(k+6) u_{k+6} + u_{k+5} = 129/32` (conserved deficit);
* `seqH_inv`: `0 < u_{k+5}`, `(k+10) u_{k+5} ≤ (k+13) u_{k+6}`,
`(k+9) u_{k+6} ≤ (k+8) u_{k+5}` (joint induction on `k`);
* `seqH_hdec`: the increments `h_d = σ_d - σ_{d-1}` are nonincreasing for `d ≥ 4`;
* `seqH_runMin`: `runMin sigma d = h_d` for `d ≥ 4`.
-/
namespace CubicPathwidth
namespace T4
lemma seqH_rec (k : ℕ) :
((k : ℝ) + 7) * sigma (k + 7) = ((k : ℝ) + 5) * sigma (k + 6) + sigma (k + 5) + 1 := by
have hk : (k : ℝ) + 7 ≠ 0 := by positivity
have e : sigma (k + 7)
= (((k : ℝ) + 5) * sigma (k + 6) + sigma (k + 5) + 1) / ((k : ℝ) + 7) := rfl
rw [e]
field_simp
lemma seqH_rec_shift (k : ℕ) :
((k : ℝ) + 8) * sigma (k + 8) = ((k : ℝ) + 6) * sigma (k + 7) + sigma (k + 6) + 1 := by
have R := seqH_rec (k + 1)
rw [show k + 1 + 7 = k + 8 by omega, show k + 1 + 6 = k + 7 by omega,
show k + 1 + 5 = k + 6 by omega] at R
push_cast at R
linear_combination R
lemma seqH_D (k : ℕ) :
((k : ℝ) + 6) * (1 - sigma (k + 6)) + (1 - sigma (k + 5)) = 129 / 32 := by
induction k with
| zero => norm_num [sigma]
| succ j ih =>
have h := seqH_rec j
rw [show j + 1 + 6 = j + 7 by omega, show j + 1 + 5 = j + 6 by omega]
push_cast
linear_combination ih - h
lemma seqH_inv (k : ℕ) :
0 < 1 - sigma (k + 5) ∧
((k : ℝ) + 10) * (1 - sigma (k + 5)) ≤ ((k : ℝ) + 13) * (1 - sigma (k + 6)) ∧
((k : ℝ) + 9) * (1 - sigma (k + 6)) ≤ ((k : ℝ) + 8) * (1 - sigma (k + 5)) := by
induction k with
| zero => norm_num [sigma]
| succ j ih =>
obtain ⟨ha, hL, hU⟩ := ih
have F := seqH_rec j
rw [show j + 1 + 5 = j + 6 by omega, show j + 1 + 6 = j + 7 by omega]
push_cast
have hj : (0 : ℝ) ≤ (j : ℝ) := Nat.cast_nonneg j
have hb : 0 < 1 - sigma (j + 6) := by nlinarith [mul_nonneg hj ha.le]
have E2 : ((j : ℝ) + 7) * (((j : ℝ) + 14) * (1 - sigma (j + 7))
- ((j : ℝ) + 11) * (1 - sigma (j + 6)))
= ((j : ℝ) + 14) * (1 - sigma (j + 5)) - (7 - (j : ℝ)) * (1 - sigma (j + 6)) := by
linear_combination (-((j : ℝ) + 14)) * F
have K : 0 ≤ ((j : ℝ) + 14) * (1 - sigma (j + 5)) - (7 - (j : ℝ)) * (1 - sigma (j + 6)) := by
rcases le_total (j : ℝ) 7 with h7 | h7
· have P : 0 ≤ ((j : ℝ) + 9) * (((j : ℝ) + 14) * (1 - sigma (j + 5))
- (7 - (j : ℝ)) * (1 - sigma (j + 6))) := by
nlinarith [mul_nonneg (sub_nonneg.2 h7) (sub_nonneg.2 hU),
mul_nonneg (mul_nonneg hj hj) ha.le, mul_nonneg hj ha.le]
exact (mul_nonneg_iff_of_pos_left (by linarith)).1 P
· nlinarith [mul_nonneg (sub_nonneg.2 h7) hb.le, mul_nonneg hj ha.le]
have E1 : ((j : ℝ) + 7) * (((j : ℝ) + 9) * (1 - sigma (j + 6))
- ((j : ℝ) + 10) * (1 - sigma (j + 7)))
= ((j : ℝ) + 13) * (1 - sigma (j + 6)) - ((j : ℝ) + 10) * (1 - sigma (j + 5)) := by
linear_combination ((j : ℝ) + 10) * F
refine ⟨hb, ?_, ?_⟩
· have P : 0 ≤ ((j : ℝ) + 7) * (((j : ℝ) + 14) * (1 - sigma (j + 7))
- ((j : ℝ) + 11) * (1 - sigma (j + 6))) := by
rw [E2]; exact K
have Q := (mul_nonneg_iff_of_pos_left (by linarith : (0 : ℝ) < (j : ℝ) + 7)).1 P
nlinarith
· have P : 0 ≤ ((j : ℝ) + 7) * (((j : ℝ) + 9) * (1 - sigma (j + 6))
- ((j : ℝ) + 10) * (1 - sigma (j + 7))) := by
rw [E1]; nlinarith
have Q := (mul_nonneg_iff_of_pos_left (by linarith : (0 : ℝ) < (j : ℝ) + 7)).1 P
nlinarith
lemma seqH_U (k : ℕ) :
((k : ℝ) + 10) * (1 - sigma (k + 7)) ≤ ((k : ℝ) + 9) * (1 - sigma (k + 6)) := by
have h := (seqH_inv (k + 1)).2.2
rw [show k + 1 + 6 = k + 7 by omega, show k + 1 + 5 = k + 6 by omega] at h
push_cast at h
nlinarith
lemma seqH_hdec (k : ℕ) :
sigma (k + 8) - sigma (k + 7) ≤ sigma (k + 7) - sigma (k + 6) := by
have R := seqH_rec_shift k
have U := seqH_U k
have key : ((k : ℝ) + 8) * (sigma (k + 8) - sigma (k + 7))
≤ ((k : ℝ) + 8) * (sigma (k + 7) - sigma (k + 6)) := by
nlinarith
exact le_of_mul_le_mul_left key (by positivity)
lemma seqH_hstep (j : ℕ) :
sigma (j + 5) - sigma (j + 4) ≤ sigma (j + 4) - sigma (j + 3) := by
rcases Nat.lt_or_ge j 3 with h | h
· interval_cases j <;> norm_num [sigma]
· obtain ⟨k, rfl⟩ : ∃ k, j = k + 3 := ⟨j - 3, by omega⟩
have H := seqH_hdec k
rw [show k + 3 + 5 = k + 8 by omega, show k + 3 + 4 = k + 7 by omega,
show k + 3 + 3 = k + 6 by omega]
exact H
lemma seqH_runMin (k : ℕ) : runMin sigma (k + 4) = sigma (k + 4) - sigma (k + 3) := by
induction k with
| zero => norm_num [runMin, incr, sigma, min_def]
| succ j ih =>
show min (runMin sigma (j + 4)) (incr sigma (j + 5)) = sigma (j + 5) - sigma (j + 4)
rw [ih]
exact min_eq_right (seqH_hstep j)
lemma seqH_identity (d : ℕ) (hd : 6 ≤ d) :
1 - sigma d = ((d : ℝ) - 1) * runMin sigma d + runMin sigma (d - 1) := by
obtain ⟨k, rfl⟩ : ∃ k, d = k + 6 := ⟨d - 6, by omega⟩
have R1 := seqH_runMin (k + 2)
have R2 := seqH_runMin (k + 1)
rw [show k + 2 + 4 = k + 6 by omega, show k + 2 + 3 = k + 5 by omega] at R1
rw [show k + 1 + 4 = k + 5 by omega, show k + 1 + 3 = k + 4 by omega] at R2
rw [show k + 6 - 1 = k + 5 by omega, R1, R2]
push_cast
rcases k with _ | j
· norm_num [sigma]
· have D1 := seqH_D (j + 1)
have D0 := seqH_D j
rw [show j + 1 + 6 = j + 7 by omega, show j + 1 + 5 = j + 6 by omega] at D1
rw [show j + 1 + 6 = j + 7 by omega, show j + 1 + 5 = j + 6 by omega,
show j + 1 + 4 = j + 5 by omega]
push_cast at D1 ⊢
linear_combination D1 - D0
lemma seqH_mono (d : ℕ) (hd : 3 ≤ d) : sigma (d - 1) ≤ sigma d := by
rcases (show d = 3 ∨ d = 4 ∨ d = 5 ∨ d = 6 ∨ 7 ≤ d by omega) with h | h | h | h | h
· subst h; norm_num [sigma]
· subst h; norm_num [sigma]
· subst h; norm_num [sigma]
· subst h; norm_num [sigma]
· obtain ⟨k, rfl⟩ : ∃ k, d = k + 7 := ⟨d - 7, by omega⟩
rw [show k + 7 - 1 = k + 6 by omega]
have hA := (seqH_inv k).1
have hB := (seqH_inv k).2.1
have E : ((k : ℝ) + 7) * (sigma (k + 7) - sigma (k + 6))
= 2 * (1 - sigma (k + 6)) - (1 - sigma (k + 5)) := by
linear_combination seqH_rec k
have P : 0 ≤ 2 * (1 - sigma (k + 6)) - (1 - sigma (k + 5)) := by
nlinarith [mul_nonneg (Nat.cast_nonneg k : (0 : ℝ) ≤ k) hA.le, (Nat.cast_nonneg k : (0 : ℝ) ≤ k)]
have Q : 0 ≤ ((k : ℝ) + 7) * (sigma (k + 7) - sigma (k + 6)) := by rw [E]; exact P
have Q' := (mul_nonneg_iff_of_pos_left (by positivity : (0 : ℝ) < (k : ℝ) + 7)).1 Q
linarith
lemma seqH_le_one (d : ℕ) : sigma d ≤ 1 := by
rcases Nat.lt_or_ge d 5 with h | h
· interval_cases d <;> norm_num [sigma]
· obtain ⟨k, rfl⟩ : ∃ k, d = k + 5 := ⟨d - 5, by omega⟩
linarith [(seqH_inv k).1]
lemma seqH_tail (j : ℕ) : sigma (j + 11) - sigma (j + 10) ≤ 1 / 32 := by
induction j with
| zero => norm_num [sigma]
| succ i ih =>
have H := seqH_hdec (i + 4)
rw [show i + 4 + 8 = i + 12 by omega, show i + 4 + 7 = i + 11 by omega,
show i + 4 + 6 = i + 10 by omega] at H
rw [show i + 1 + 11 = i + 12 by omega, show i + 1 + 10 = i + 11 by omega]
linarith
lemma seqH_coeff (d : ℕ) : sigma d ≤ thm4Coeff d := by
rcases Nat.lt_or_ge d 11 with h | h
· interval_cases d <;> norm_num [sigma, thm4Coeff]
· obtain ⟨k, rfl⟩ : ∃ k, d = k + 11 := ⟨d - 11, by omega⟩
have hT := seqH_tail k
have hD := seqH_D (k + 5)
rw [show k + 5 + 6 = k + 11 by omega, show k + 5 + 5 = k + 10 by omega] at hD
push_cast at hD
have h1 : ¬ (k + 11 ≤ 2) := by omega
have h2 : ¬ (k + 11 ≤ 6) := by omega
have h3 : ¬ (k + 11 ≤ 10) := by omega
have hc : thm4Coeff (k + 11) = 1 - 4 / ((k : ℝ) + 11 + 1) := by
unfold thm4Coeff
norm_num [h1, h2, h3]
rw [hc]
have key : 4 / ((k : ℝ) + 11 + 1) ≤ 1 - sigma (k + 11) := by
rw [div_le_iff₀ (by positivity)]
nlinarith
linarith
theorem seqClaim_h : SeqClaim := by
refine ⟨⟨⟨by norm_num [sigma], by norm_num [sigma], by norm_num [sigma]⟩,
seqH_mono, seqH_identity, seqH_le_one⟩, seqH_coeff⟩
end T4
end CubicPathwidth
#print axioms CubicPathwidth.T4.seqClaim_h
Back to top