pith. machine review for the scientific record. sign in
lemma

allOnes_testBit_lt

proved
show as:
view math explainer →
module
IndisputableMonolith.Patterns.GrayCycleGeneral
domain
Patterns
line
87 · github
papers citing
none yet

open explainer

Generate a durable explainer page for this declaration.

open lean source

IndisputableMonolith.Patterns.GrayCycleGeneral on GitHub at line 87.

browse module

All declarations in this module, on Recognition.

explainer page

Tracked in the explainer inventory; generation is lazy so crawlers do not trigger LLM jobs.

open explainer

depends on

used by

formal source

  84          simpa using hR.symm
  85  exact Nat.add_right_cancel h
  86
  87private lemma allOnes_testBit_lt : ∀ {t k : Nat}, k < t → (allOnes t).testBit k = true
  88  | 0, _, hk => (Nat.not_lt_zero _ hk).elim
  89  | (t + 1), 0, _ => by
  90      -- `allOnes (t+1) = bit true (allOnes t)`
  91      have hrepr : allOnes (t + 1) = Nat.bit true (allOnes t) := allOnes_succ_eq_bit t
  92      simpa [hrepr] using (Nat.testBit_bit_zero true (allOnes t))
  93  | (t + 1), (k + 1), hk => by
  94      have hk' : k < t := Nat.lt_of_succ_lt_succ hk
  95      have hrepr : allOnes (t + 1) = Nat.bit true (allOnes t) := allOnes_succ_eq_bit t
  96      -- shift the bit index down one using `testBit_bit_succ`
  97      have hshift :
  98          (allOnes (t + 1)).testBit (k + 1) = (allOnes t).testBit k := by
  99        simpa [hrepr] using (Nat.testBit_bit_succ (b := true) (n := allOnes t) (m := k))
 100      -- now finish by IH
 101      simpa [hshift] using (allOnes_testBit_lt (t := t) (k := k) hk')
 102
 103private lemma allOnes_testBit_eq_false_at (t : Nat) : (allOnes t).testBit t = false := by
 104  -- `allOnes t < 2^t`
 105  have hlt : allOnes t < 2 ^ t := by
 106    -- `2^t - 1 < 2^t` since `2^t > 0`
 107    simpa [allOnes] using Nat.sub_lt (pow_pos (by decide : 0 < (2 : Nat)) t) (by decide : 0 < 1)
 108  exact Nat.testBit_eq_false_of_lt hlt
 109
 110theorem brgc_wrap_oneBitDiff {d : Nat} (hdpos : 0 < d) :
 111    OneBitDiff (brgcPath d ⟨2 ^ d - 1, by
 112      exact Nat.sub_lt (pow_pos (by decide : 0 < (2 : Nat)) d) (by decide)⟩) (brgcPath d 0) := by
 113  classical
 114  rcases Nat.exists_eq_succ_of_ne_zero (Nat.ne_of_gt hdpos) with ⟨t, rfl⟩
 115  -- d = t+1, unique differing bit is the last one (value t)
 116  let iLast : Fin (2 ^ (t + 1)) :=
 117    ⟨2 ^ (t + 1) - 1, by