~/bend-docscommunity

proofs/math/typed/shrn.bend checks

raw source on the hub · import bend-collections-laws-crypto@1.0.0.0/proofs/math/typed/shrn.bend as Shrn

13 imports
import Base
import ../../../spec/lib/common.bend as C
import ../../../src/math/w64.bend as X
import ../../lib/nat.bend as N
import ../../lib/logic.bend as L
import ../../lib/word.bend as WD
import ../../lib/u32.bend as U
import ../../lib/u32div.bend as UD
import ../../lib/u32half.bend as UH
import ../../lib/u32alg.bend as A
import ../u64/u64div.bend as PD
import ./u32.bend as U32P
import ./width.bend as WW

Definitions

def v source · line 21 · raw

@+x:U32 -> Nat

def hlf_half source · line 25 · raw

@+n:Nat -> {0xa7e654f9780078ca65bf9e187da99d3e/proofs/lib/u32half.hlf(n) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.half(n) : Nat}

halving, as the word library and the spec write it

def high_half source · line 35 · raw

@+p:Nat -> @+n:Nat -> {0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.high(p, 0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.half(n)) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.half(0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.high(p, n)) : Nat}

high(p, half(n)) == half(high(p, n)): both halve p + 1 times

def shrn_high source · line 43 · raw

@+x:U32 -> @+k:Nat -> {v(U32.shrn(x, k)) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.high(k, v(x)) : Nat}

the value of a shift right: high(k, x), for every k

def p2w source · line 53 · raw

@+k:Nat -> @+hk:{Nat.is_lt(k, 32n) == True{} : Bool} -> {0xa7e654f9780078ca65bf9e187da99d3e/src/math/w64.pow2(k) == U32{0xa7e654f9780078ca65bf9e187da99d3e/proofs/lib/word.pw(32n, k)} : U32}

the 2^k table is the word with bit k set

def p2v source · line 121 · raw

@+k:Nat -> @+hk:{Nat.is_lt(k, 32n) == True{} : Bool} -> {v(0xa7e654f9780078ca65bf9e187da99d3e/src/math/w64.pow2(k)) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.pow2(k) : Nat}

def pow2_eq source · line 124 · raw

@+k:Nat -> {0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.pow2(k) == 1n+Nat.sub(0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.pow2(k), 1n) : Nat}

def is_zero_c source · line 127 · raw

@+a:U32 -> @+c:Bool -> @+hc:{U32.is_zero(a) == c : Bool} -> @+n:Nat -> @+hn:{v(a) == n : Nat} -> {c == Nat.is_eq(v(a), 0n) : Bool}

def zero_nat source · line 141 · raw

@+a:U32 -> {U32.is_zero(a) == Nat.is_eq(v(a), 0n) : Bool}

def div_p2 source · line 145 · raw

@+x:U32 -> @+k:Nat -> @+hk:{Nat.is_lt(k, 32n) == True{} : Bool} -> {v(U32.div(x, 0xa7e654f9780078ca65bf9e187da99d3e/src/math/w64.pow2(k))) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.high(k, v(x)) : Nat}

x / 2^k on a word is high(k, x)

def shrn_div source · line 152 · raw

@+x:U32 -> @+k:Nat -> @+hk:{Nat.is_lt(k, 32n) == True{} : Bool} -> {U32.shrn(x, k) == U32.div(x, 0xa7e654f9780078ca65bf9e187da99d3e/src/math/w64.pow2(k)) : U32}

U32.shrn(x, k) is U32.div(x, 2^k) for k < 32

def shr16 source · line 156 · raw

@+x:U32 -> {U32.shrn(x, 16n) == U32.div(x, 65536) : U32}

the 16-bit split of the limb code