~/bend-docscommunity

proofs/math/random/pcg/impl.bend checks

raw source on the hub · import bend-collections-laws-math@1.0.0.0/proofs/math/random/pcg/impl.bend as Impl

17 imports
import Base
import ../../../../spec/lib/common.bend as C
import ../../../../spec/math/w64.bend as SW
import ../../../../spec/math/random/pcg.bend as SP
import ../../../../src/math/u64.bend as WU
import ../../../../src/math/w64.bend as X
import ../../../../src/math/random/pcg.bend as P
import ../../../lib/lemmas/spec/numeric.bend as S
import ../../../lib/lemmas/proofs/nat_algebra.bend as NA
import ../../../lib/u32alg.bend as A
import ../../typed/width.bend as WW
import ../../typed/w64add.bend as WA
import ../../typed/w64m128.bend as M128
import ../../typed/w64mul.bend as W64M
import ../../typed/w64sh.bend as SH
import ./step.bend as ST
import ../../../../spec/math/random.bend as SR

Definitions

def eqm_of source · line 22 · raw

@+v:Nat -> @+x:Nat -> @+e:{v == 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.low(64n, x) : Nat} -> {0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.low(64n, v) == 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.low(64n, x) : Nat}

def v source · line 27 · raw

@+x:U32 -> Nat

def carry_value source · line 30 · raw

@+c:Bool -> {0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64{0xf86f5f1d9a594d5a5cff999100e01d03/src/math/w64.b32(c), 0}) == 0xf86f5f1d9a594d5a5cff999100e01d03/proofs/lib/lemmas/spec/numeric.bit_value(c) : Nat}

def fT source · line 34 · raw

@+hi:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> @+lo:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> @+ml:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> @+mh:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> {0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.low(64n, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/w64.add(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/w64.mul(hi, ml), 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/w64.mul(lo, mh)))) == 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.low(64n, Nat.add(Nat.mul(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(hi), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(ml)), Nat.mul(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(lo), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(mh)))) : Nat}

the cross products mod 2^64

def fS source · line 42 · raw

@+a:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> @+b:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> {0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.low(64n, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/w64.add(a, b))) == 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.low(64n, Nat.add(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(a), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(b))) : Nat}

a sum mod 2^64

def fV source · line 46 · raw

@+a:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> @+cb:Bool -> {0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/w64.add(a, 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64{0xf86f5f1d9a594d5a5cff999100e01d03/src/math/w64.b32(cb), 0})) == 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.low(64n, Nat.add(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(a), 0xf86f5f1d9a594d5a5cff999100e01d03/proofs/lib/lemmas/spec/numeric.bit_value(cb))) : Nat}

adding the carry

def step_pair source · line 53 · raw

@+mh:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> @+ml:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> @+ih:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> @+il:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> @+hi:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> @+lo:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> @pr:Pair(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64, 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64) -> @+h1:{Nat.add(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/w64.pfst(pr)), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.shift(64n, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/w64.psnd(pr)))) == Nat.mul(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(lo), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(ml)) : Nat} -> {0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/random.value128(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/random/pcg.step_mul(mh, ml, ih, il, hi, lo, pr)) == 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.low(Nat.add(64n, 64n), Nat.add(Nat.mul(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/random.value128(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/random/pcg.P{hi, lo}), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/random.value128(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/random/pcg.P{mh, ml})), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/random.value128(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/random/pcg.P{ih, il}))) : Nat}

one step for any product pair (l, h) with l + 2^64 h == lo * ml (the pair is abstract here, so the checker never unfolds the 128-bit product)

def m128 source · line 65 · raw

@+a:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> @+b:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/u64.U64 -> {Nat.add(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/w64.pfst(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/w64.mul128(a, b))), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.shift(64n, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/w64.psnd(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/w64.mul128(a, b))))) == Nat.mul(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(a), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/w64.value(b)) : Nat}