~/bend-docscommunity

proofs/math/natural/bits.bend checks

raw source on the hub · import bend-collections-laws-containers@1.0.0.0/proofs/math/natural/bits.bend as Bits

7 imports
import Base
import ../../lib/nat.bend as N
import ../../lib/logic.bend as L
import ../../../spec/lib/common.bend as SC
import ../../lib/lemmas/proofs/nat_algebra.bend as A
import ../../../src/math/natural.bend as M
import ./arith.bend as R

Definitions

def half_eq source · line 17 · raw

@+n:Nat -> {n == Nat.add(Nat.double(Nat.div(n, 2n)), Nat.mod(n, 2n)) : Nat}

n == 2 (n / 2) + n mod 2

def add_succ_nle source · line 22 · raw

@+a:Nat -> @+b:Nat -> {Nat.is_le(Nat.add(a, 1n+b), a) == False{} : Bool}

a + (1 + b) <= a is false

def half_lt source · line 30 · raw

@+np:Nat -> {Nat.is_lt(Nat.div(1n+np, 2n), 1n+np) == True{} : Bool}

n / 2 < n for n > 0

def half_rem source · line 38 · raw

@+n:Nat -> {Nat.is_lt(Nat.mod(n, 2n), 2n) == True{} : Bool}

n mod 2 <= 1

def go_acc source · line 43 · raw

@fuel:Nat -> @+n:Nat -> @+k:Nat -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.bit_length_go(fuel, n, 1n+k) == 1n+0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.bit_length_go(fuel, n, k) : Nat}

def go_zero source · line 52 · raw

@+fuel:Nat -> @+k:Nat -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.bit_length_go(fuel, 0n, k) == k : Nat}

def half_fuel source · line 60 · raw

@+np:Nat -> @+f:Nat -> @+hf:{Nat.is_le(np, f) == True{} : Bool} -> {Nat.is_le(Nat.div(1n+np, 2n), f) == True{} : Bool}

the halved argument stays within the fuel

def half_bound source · line 64 · raw

@+np:Nat -> {Nat.is_lt(1n+np, Nat.double(1n+Nat.div(1n+np, 2n))) == True{} : Bool}

2 h + r < 2 (1 + h) for r < 2

def lt_go source · line 70 · raw

@fuel:Nat -> @+n:Nat -> @+hf:{Nat.is_le(n, fuel) == True{} : Bool} -> {Nat.is_lt(n, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/lib/common.pow2(0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.bit_length_go(fuel, n, 0n))) == True{} : Bool}

def bit_length_lt source · line 86 · raw

@+n:Nat -> {Nat.is_lt(n, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/lib/common.pow2(0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.bit_length(n))) == True{} : Bool}

n < 2^bit_length(n) (Mathlib Nat.lt_size_self)

def le_step source · line 90 · raw

@+np:Nat -> @+h:Nat -> @+x:Nat -> @+e:{1n+np == Nat.add(Nat.double(h), Nat.mod(1n+np, 2n)) : Nat} -> @+ih:{Nat.is_le(0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/lib/common.pow2(x), Nat.max(1n, Nat.double(h))) == True{} : Bool} -> {Nat.is_le(0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/lib/common.pow2(x), 1n+np) == True{} : Bool}

the lower bound, as 2^L <= max(1, 2 n)

def le_go source · line 97 · raw

@fuel:Nat -> @+n:Nat -> @+hf:{Nat.is_le(n, fuel) == True{} : Bool} -> {Nat.is_le(0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/lib/common.pow2(0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.bit_length_go(fuel, n, 0n)), Nat.max(1n, Nat.double(n))) == True{} : Bool}

def bit_length_le source · line 113 · raw

@+np:Nat -> {Nat.is_le(0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/lib/common.pow2(0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.bit_length(1n+np)), Nat.double(1n+np)) == True{} : Bool}

2^bit_length(n) <= 2 n for n > 0, i.e. 2^(bit_length(n) - 1) <= n (Mathlib Nat.size_le)

def bit_length_zero source · line 116 · raw

{0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.bit_length(0n) == 0n : Nat}