~/bend-docscommunity

proofs/lib/lemmas/proofs/division_candidate.bend checks

raw source on the hub · import bend-collections-laws-math@1.0.0.0/proofs/lib/lemmas/proofs/division_candidate.bend as Division_candidate

7 imports
import Base
import ./word_comparison.bend as Comparison
import ../src/wide.bend as W
import ../spec/numeric.bend as S
import ./word_multiplication.bend as Mul
import ./word_shift.bend as Shift
import ./numeric.bend as N

Definitions

def times_two source · line 9 · raw

@a:Nat -> {Nat.mul(a, 2n) == Nat.double(a) : Nat}

def doubling source · line 16 · raw

@+r:U32 -> {U32.mul(r, 2) == U32{0xf86f5f1d9a594d5a5cff999100e01d03/proofs/lib/lemmas/spec/numeric.from_nat(32n, Nat.double(U32.to_nat(r)))} : U32}

The actual U32 multiplication in wide.digit computes low bits of 2*r.

def shift_value source · line 19 · raw

@r:U32 -> {U32.shl(r) == U32{0xf86f5f1d9a594d5a5cff999100e01d03/proofs/lib/lemmas/spec/numeric.from_nat(32n, Nat.double(U32.to_nat(r)))} : U32}

def multiplication_is_shift source · line 24 · raw

@+r:U32 -> {U32.mul(r, 2) == U32.shl(r) : U32}

def digit source · line 29 · raw

@+p:Nat -> @+bit:Bool -> @+q:Word(p) -> @+r:U32 -> {0xf86f5f1d9a594d5a5cff999100e01d03/proofs/lib/lemmas/src/wide.digit(p, bit, 0xf86f5f1d9a594d5a5cff999100e01d03/proofs/lib/lemmas/src/wide.Div{q, r}) == 0xf86f5f1d9a594d5a5cff999100e01d03/proofs/lib/lemmas/src/wide.digit_compare(p, q, U32.add(U32.shl(r), 0xf86f5f1d9a594d5a5cff999100e01d03/proofs/lib/lemmas/src/wide.bit_u32(bit))) : 0xf86f5f1d9a594d5a5cff999100e01d03/proofs/lib/lemmas/src/wide.Division<1n+p>}

Link directly to the recurrence used by actual div_million. This equation is still modular; the reachable remainder range must be discharged separately.