proofs/math/typed/natfuel.bend checks
raw source on the hub · import bend-collections-laws-math@1.0.0.0/proofs/math/typed/natfuel.bend as Natfuel
16 imports
import Base import ../../../spec/lib/common.bend as C import ../../../src/math/natural.bend as M import ../../lib/nat.bend as N import ../../lib/logic.bend as L import ../../lib/lemmas/proofs/nat_algebra.bend as NA import ../natural/arith.bend as NR import ./u32.bend as U32P import ../../lib/arith.bend as AR2 import ../natural/bits.bend as BT import ../natural/inverse.bend as IV import ../../lib/u32half.bend as UH import ../../../spec/math/natural.bend as S import ../natural/fact.bend as FA import ../natural/roots.bend as RT import ../natural/modpow.bend as MP
Definitions
def true_ne_false source · line 25 · raw
@+h:{True{} == False{} : Bool} -> Empty
def ends source · line 31 · raw
@f:Nat -> @+a:Nat -> @+b:Nat -> Bool
the Nat loop reaches b == 0 within f steps
def ends_zero source · line 42 · raw
@+f:Nat -> @+a:Nat -> {ends(f, a, 0n) == True{} : Bool}
def gz source · line 50 · raw
@+f:Nat -> @+a:Nat -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.gcd_go(f, a, 0n) == a : Nat}two fuels that both reach the end give the same gcd
def gcd_fuel source · line 57 · raw
@+f1:Nat -> @+f2:Nat -> @+a:Nat -> @+b:Nat -> @+h1:{ends(f1, a, b) == True{} : Bool} -> @+h2:{ends(f2, a, b) == True{} : Bool} -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.gcd_go(f1, a, b) == 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.gcd_go(f2, a, b) : Nat}
def ends_self source · line 71 · raw
@+f:Nat -> @+a:Nat -> @+b:Nat -> @+h:{Nat.is_le(b, f) == True{} : Bool} -> {ends(f, a, b) == True{} : Bool}b <= f is enough: b drops every step
def mod_le_sub source · line 81 · raw
@+b:Nat -> @+rp:Nat -> @+h:{Nat.is_le(1n+rp, b) == True{} : Bool} -> {Nat.is_le(Nat.add(Nat.mod(b, 1n+rp), 1n+rp), b) == True{} : Bool}b mod r + r <= b for 0 < r <= b (the quotient is at least 1)
def halve2 source · line 93 · raw
@+b:Nat -> @+r1:Nat -> @+r2:Nat -> @+k:Nat -> @+hb:{Nat.is_lt(b, Nat.double(k)) == True{} : Bool} -> @+h21:{Nat.is_lt(r2, r1) == True{} : Bool} -> @+hs:{Nat.is_le(Nat.add(r2, r1), b) == True{} : Bool} -> {Nat.is_lt(r2, k) == True{} : Bool}two remainders later the divisor has at least halved
def halve source · line 99 · raw
@+k:Nat -> @+f:Nat -> @+a:Nat -> @+b:Nat -> @+r:Nat -> @+hr:{Nat.mod(a, b) == r : Nat} -> @+hb:{Nat.is_lt(b, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(k)) == True{} : Bool} -> @+hf:{Nat.is_le(1n+Nat.double(k), f) == True{} : Bool} -> {ends(f, a, b) == True{} : Bool}Knuth: b < 2^k and 2k + 1 <= f reach the end (r is a mod b, given)
def gcd_140 source · line 124 · raw
@+k:Nat -> @+a:Nat -> @+b:Nat -> @+hk:{Nat.is_le(1n+Nat.double(k), 140n) == True{} : Bool} -> @+hb:{Nat.is_lt(b, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(k)) == True{} : Bool} -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.gcd_go(140n, a, b) == 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.gcd(a, b) : Nat}140 steps are enough for Euclid on values below 2^k, 2k + 1 <= 140
def bends source · line 129 · raw
@f:Nat -> @+n:Nat -> Bool
def bends_zero source · line 140 · raw
@+f:Nat -> {bends(f, 0n) == True{} : Bool}
def half_below source · line 148 · raw
@+n:Nat -> @+p:Nat -> @+h:{Nat.is_lt(n, Nat.double(p)) == True{} : Bool} -> {Nat.is_lt(Nat.div(n, 2n), p) == True{} : Bool}div(n, 2) < p when n < 2p
def bends_bound source · line 154 · raw
@+j:Nat -> @+f:Nat -> @+n:Nat -> @+hn:{Nat.is_lt(n, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(j)) == True{} : Bool} -> @+hf:{Nat.is_le(j, f) == True{} : Bool} -> {bends(f, n) == True{} : Bool}n < 2^j and j <= f: f halvings reach 0
def bends_self source · line 166 · raw
@+f:Nat -> @+n:Nat -> @+h:{Nat.is_le(n, f) == True{} : Bool} -> {bends(f, n) == True{} : Bool}n <= f is enough (n drops every step)
def bl_zero source · line 175 · raw
@+f:Nat -> @+k:Nat -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.bit_length_go(f, 0n, k) == k : Nat}
def bl_fuel source · line 182 · raw
@+f1:Nat -> @+f2:Nat -> @+n:Nat -> @+k:Nat -> @+h1:{bends(f1, n) == True{} : Bool} -> @+h2:{bends(f2, n) == True{} : Bool} -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.bit_length_go(f1, n, k) == 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.bit_length_go(f2, n, k) : Nat}
def bl_140 source · line 194 · raw
@+j:Nat -> @+n:Nat -> @+hj:{Nat.is_le(j, 140n) == True{} : Bool} -> @+hn:{Nat.is_lt(n, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(j)) == True{} : Bool} -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.bit_length_go(140n, n, 0n) == 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.bit_length(n) : Nat}140 steps suffice for bit_length below 2^j, j <= 140
def pm_zero source · line 197 · raw
@+f:Nat -> @+m:Nat -> @+base:Nat -> @+acc:Nat -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.pow_mod_go(f, m, 0n, base, acc) == acc : Nat}
def pm_fuel source · line 204 · raw
@+f1:Nat -> @+f2:Nat -> @+m:Nat -> @+e:Nat -> @+base:Nat -> @+acc:Nat -> @+h1:{bends(f1, e) == True{} : Bool} -> @+h2:{bends(f2, e) == True{} : Bool} -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.pow_mod_go(f1, m, e, base, acc) == 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.pow_mod_go(f2, m, e, base, acc) : Nat}
def pm_140 source · line 215 · raw
@+j:Nat -> @+m:Nat -> @+e:Nat -> @+base:Nat -> @+acc:Nat -> @+hj:{Nat.is_le(j, 140n) == True{} : Bool} -> @+he:{Nat.is_lt(e, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(j)) == True{} : Bool} -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.pow_mod_go(140n, m, e, base, acc) == 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.pow_mod_go(e, m, e, base, acc) : Nat}
def iv_zero source · line 220 · raw
@+f:Nat -> @+m:Nat -> @+r0:Nat -> @+s0:Nat -> @+s1:Nat -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.inv_go(f, m, r0, s0, 0n, s1) == 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.BZ{r0, s0} : 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.Bezout}
def inv_fuel source · line 227 · raw
@+f1:Nat -> @+f2:Nat -> @+m:Nat -> @+r0:Nat -> @+s0:Nat -> @+r1:Nat -> @+s1:Nat -> @+h1:{ends(f1, r0, r1) == True{} : Bool} -> @+h2:{ends(f2, r0, r1) == True{} : Bool} -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.inv_go(f1, m, r0, s0, r1, s1) == 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.inv_go(f2, m, r0, s0, r1, s1) : 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.Bezout}
def inv_140 source · line 241 · raw
@+k:Nat -> @+mp:Nat -> @+a:Nat -> @+hk:{Nat.is_le(1n+Nat.double(k), 140n) == True{} : Bool} -> @+hm:{Nat.is_lt(1n+mp, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(k)) == True{} : Bool} -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.inv_go(140n, 1n+mp, 1n+mp, 0n, Nat.mod(a, 1n+mp), 1n) == 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.inv_go(1n+mp, 1n+mp, 1n+mp, 0n, Nat.mod(a, 1n+mp), 1n) : 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.Bezout}fuel 140 against the reference fuel m, for m < 2^k, 2k+1 <= 140
def mod_small source · line 247 · raw
@+mp:Nat -> @+d:Nat -> @+h:{Nat.is_lt(d, 1n+mp) == True{} : Bool} -> {Nat.mod(d, 1n+mp) == d : Nat}
def sm_lt source · line 250 · raw
@+mm:Nat -> @+s:Nat -> @+x:Nat -> @+h:{Nat.is_lt(s, x) == True{} : Bool} -> @+hx:{Nat.is_le(x, mm) == True{} : Bool} -> {Nat.is_lt(Nat.add(s, Nat.sub(mm, x)), mm) == True{} : Bool}
def sm_ge source · line 253 · raw
@+mp:Nat -> @+s:Nat -> @+x:Nat -> @+hxs:{Nat.is_le(x, s) == True{} : Bool} -> @+hs:{Nat.is_lt(s, 1n+mp) == True{} : Bool} -> {Nat.mod(Nat.add(s, Nat.sub(1n+mp, x)), 1n+mp) == Nat.sub(s, x) : Nat}
def ilends source · line 265 · raw
@f:Nat -> @+q:Nat -> @+b:Nat -> @+p:Nat -> @+up:Bool -> Bool
def il_false source · line 276 · raw
@+f:Nat -> @+q:Nat -> @+b:Nat -> @+p:Nat -> {ilends(f, q, b, p, False{}) == True{} : Bool}
def ilz source · line 283 · raw
@+f:Nat -> @+n:Nat -> @+b:Nat -> @+k:Nat -> @+p:Nat -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.ilog_go(f, n, b, k, p, False{}) == k : Nat}
def il_fuel source · line 290 · raw
@+f1:Nat -> @+f2:Nat -> @+n:Nat -> @+b:Nat -> @+k:Nat -> @+p:Nat -> @+up:Bool -> @+h1:{ilends(f1, Nat.div(n, b), b, p, up) == True{} : Bool} -> @+h2:{ilends(f2, Nat.div(n, b), b, p, up) == True{} : Bool} -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.ilog_go(f1, n, b, k, p, up) == 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.ilog_go(f2, n, b, k, p, up) : Nat}
def pow2_pos source · line 303 · raw
@+x:Nat -> {Nat.is_le(1n, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(x)) == True{} : Bool}
def lt_pow2 source · line 310 · raw
@+x:Nat -> {Nat.is_lt(x, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(x)) == True{} : Bool}
def dbl_le_mul source · line 317 · raw
@+p:Nat -> @+bq:Nat -> {Nat.is_le(Nat.double(p), Nat.mul(p, 2n+bq)) == True{} : Bool}
def ilb source · line 325 · raw
@+t:Nat -> @+f:Nat -> @+c:Bool -> @+q:Nat -> @+bq:Nat -> @+s:Nat -> @+p:Nat -> @+K:Nat -> @+hK:{Nat.add(t, s) == K : Nat} -> @+hq:{Nat.is_lt(q, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(K)) == True{} : Bool} -> @+hs:{Nat.is_le(0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(s), p) == True{} : Bool} -> @+ht:{Nat.is_le(t, f) == True{} : Bool} -> @+hc:{c == Nat.is_le(p, q) : Bool} -> {ilends(f, q, 2n+bq, p, c) == True{} : Bool}q < 2^K, 2^s <= p, t + s == K: the loop from p stops within t rounds
def il_140 source · line 341 · raw
@+K:Nat -> @+n:Nat -> @+bq:Nat -> @+hK:{Nat.is_le(K, 140n) == True{} : Bool} -> @+hq:{Nat.is_lt(Nat.div(n, 2n+bq), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(K)) == True{} : Bool} -> {0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.ilog_go(140n, n, 2n+bq, 0n, 1n, Nat.is_le(1n, Nat.div(n, 2n+bq))) == 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.ilog_go(n, n, 2n+bq, 0n, 1n, Nat.is_le(1n, Nat.div(n, 2n+bq))) : Nat}
def fstep source · line 347 · raw
@+y:Nat -> {Nat.is_le(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.factorial(y), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.factorial(1n+y)) == True{} : Bool}
def mul_le_r source · line 352 · raw
@+a:Nat -> @+b:Nat -> @+c:Nat -> @+h:{Nat.is_le(b, c) == True{} : Bool} -> {Nat.is_le(Nat.mul(a, b), Nat.mul(a, c)) == True{} : Bool}
def fmono source · line 357 · raw
@+a:Nat -> @+b:Nat -> @+h:{Nat.is_le(a, b) == True{} : Bool} -> {Nat.is_le(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.factorial(a), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.factorial(b)) == True{} : Bool}
def pf_le source · line 368 · raw
@+k:Nat -> {Nat.is_le(0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(k), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.factorial(1n+k)) == True{} : Bool}
def fbig source · line 378 · raw
@+k:Nat -> @+i:Nat -> @+h:{Nat.is_le(1n+k, i) == True{} : Bool} -> {Nat.is_le(0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(k), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.factorial(i)) == True{} : Bool}1 + k <= i gives 2^k <= i!
def sub_mono_l source · line 383 · raw
@+m:Nat -> @+n:Nat -> @+j:Nat -> @+h:{Nat.is_le(m, n) == True{} : Bool} -> {Nat.is_le(Nat.sub(m, j), Nat.sub(n, j)) == True{} : Bool}
def dmono1 source · line 394 · raw
@+m:Nat -> @+n:Nat -> @+j:Nat -> @+h:{Nat.is_le(m, n) == True{} : Bool} -> {Nat.is_le(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.desc(m, j), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.desc(n, j)) == True{} : Bool}
def dstep source · line 401 · raw
@+n:Nat -> @+s:Nat -> @+h:{Nat.is_lt(s, n) == True{} : Bool} -> {Nat.is_le(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.desc(n, s), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.desc(n, 1n+s)) == True{} : Bool}
def dmono source · line 405 · raw
@+n:Nat -> @+j:Nat -> @+d:Nat -> @+h:{Nat.is_le(Nat.add(j, d), n) == True{} : Bool} -> {Nat.is_le(0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.desc(n, j), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.desc(n, Nat.add(j, d))) == True{} : Bool}
def desc_zero source · line 417 · raw
@+n:Nat -> @+k:Nat -> @+h:{Nat.is_lt(n, k) == True{} : Bool} -> {0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.desc(n, k) == 0n : Nat}
def dbig source · line 421 · raw
@+k:Nat -> @+n:Nat -> @+j:Nat -> @+hj:{Nat.is_le(1n+k, j) == True{} : Bool} -> @+hjn:{Nat.is_le(j, n) == True{} : Bool} -> {Nat.is_le(0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(k), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/natural.desc(n, j)) == True{} : Bool}1 + k <= j <= n gives 2^k <= n.desc(j)
def msn source · line 427 · raw
@bit:Bool -> @+na:Nat -> @+nb:Nat -> Nat
def sqn source · line 434 · raw
@more:Bool -> @+nb:Nat -> Nat
def pw_bit source · line 441 · raw
@+r:Nat -> @+na:Nat -> @+nb:Nat -> @+p2:Nat -> @+hr:{Nat.is_lt(r, 2n) == True{} : Bool} -> {Nat.mul(msn(Nat.is_eq(r, 1n), na, nb), p2) == Nat.mul(na, Nat.mul(p2, Nat.pow(nb, r))) : Nat}
def powstep source · line 450 · raw
@+j:Nat -> @+na:Nat -> @+nb:Nat -> {Nat.mul(msn(Nat.is_eq(Nat.mod(1n+j, 2n), 1n), na, nb), Nat.pow(sqn(Nat.is_lt(1n, 1n+j), nb), Nat.div(1n+j, 2n))) == Nat.mul(na, Nat.pow(nb, 1n+j)) : Nat}
def half_le source · line 465 · raw
@+j:Nat -> {Nat.is_le(Nat.div(1n+j, 2n), j) == True{} : Bool}
def plus1 source · line 469 · raw
@+x:Nat -> {Nat.add(x, 1n) == 1n+x : Nat}
def pow_mono source · line 474 · raw
@+x:Nat -> @+y:Nat -> @+k:Nat -> @+h:{Nat.is_le(x, y) == True{} : Bool} -> {Nat.is_le(Nat.pow(x, k), Nat.pow(y, k)) == True{} : Bool}
def lt_add_cancel source · line 481 · raw
@+d:Nat -> @+x:Nat -> @+y:Nat -> {Nat.is_lt(Nat.add(d, x), Nat.add(d, y)) == Nat.is_lt(x, y) : Bool}
def dle_c source · line 488 · raw
@+q:Nat -> @+p:Nat -> @+h:{Nat.is_le(Nat.double(q), Nat.double(p)) == True{} : Bool} -> @+c:Bool -> @+hc:{Nat.is_lt(p, q) == c : Bool} -> {Nat.is_le(q, p) == True{} : Bool}
def dle source · line 496 · raw
@+q:Nat -> @+p:Nat -> @+h:{Nat.is_le(Nat.double(q), Nat.double(p)) == True{} : Bool} -> {Nat.is_le(q, p) == True{} : Bool}2 q <= 2 p gives q <= p
def w_lo source · line 500 · raw
@+w:Nat -> @+p:Nat -> @+hw:{Nat.is_le(w, Nat.double(p)) == True{} : Bool} -> {Nat.is_le(Nat.div(w, 2n), p) == True{} : Bool}w <= 2 p gives w / 2 <= p
def w_r source · line 506 · raw
@+q:Nat -> @+r:Nat -> @+p:Nat -> @+hr:{Nat.is_lt(r, 2n) == True{} : Bool} -> @+hw:{Nat.is_le(Nat.add(Nat.double(q), r), Nat.double(p)) == True{} : Bool} -> {Nat.is_le(Nat.add(q, r), p) == True{} : Bool}
def w_hi source · line 519 · raw
@+w:Nat -> @+p:Nat -> @+hw:{Nat.is_le(w, Nat.double(p)) == True{} : Bool} -> {Nat.is_le(Nat.sub(w, Nat.div(w, 2n)), p) == True{} : Bool}w <= 2 p gives w - w / 2 <= p
def root_below_c source · line 529 · raw
@+r:Nat -> @+x:Nat -> @+k:Nat -> @+n:Nat -> @+hx:{Nat.is_le(Nat.pow(x, k), n) == True{} : Bool} -> @+hr:{Nat.is_lt(n, Nat.pow(1n+r, k)) == True{} : Bool} -> @+c:Bool -> @+hc:{Nat.is_lt(r, x) == c : Bool} -> {Nat.is_le(x, r) == True{} : Bool}x^k <= n < (1 + r)^k gives x <= r
def root_below source · line 537 · raw
@+r:Nat -> @+x:Nat -> @+k:Nat -> @+n:Nat -> @+hx:{Nat.is_le(Nat.pow(x, k), n) == True{} : Bool} -> @+hr:{Nat.is_lt(n, Nat.pow(1n+r, k)) == True{} : Bool} -> {Nat.is_le(x, r) == True{} : Bool}
def root_above_c source · line 541 · raw
@+r:Nat -> @+x:Nat -> @+k:Nat -> @+n:Nat -> @+hx:{Nat.is_le(Nat.pow(x, k), n) == False{} : Bool} -> @+hr:{Nat.is_le(Nat.pow(r, k), n) == True{} : Bool} -> @+c:Bool -> @+hc:{Nat.is_le(x, r) == c : Bool} -> {Nat.is_lt(r, x) == True{} : Bool}x^k > n >= r^k gives r < x
def root_above source · line 548 · raw
@+r:Nat -> @+x:Nat -> @+k:Nat -> @+n:Nat -> @+hx:{Nat.is_le(Nat.pow(x, k), n) == False{} : Bool} -> @+hr:{Nat.is_le(Nat.pow(r, k), n) == True{} : Bool} -> {Nat.is_lt(r, x) == True{} : Bool}
def bl_le_c source · line 552 · raw
@+K:Nat -> @+bl:Nat -> @+h:{Nat.is_lt(0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(bl), 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(1n+K)) == True{} : Bool} -> @+c:Bool -> @+hc:{Nat.is_le(1n+K, bl) == c : Bool} -> {Nat.is_le(bl, K) == True{} : Bool}n < 2^K gives bit_length(n) <= K
def bl_le_n source · line 559 · raw
@+K:Nat -> @+n:Nat -> @+hn:{Nat.is_lt(n, 0xf86f5f1d9a594d5a5cff999100e01d03/spec/lib/common.pow2(K)) == True{} : Bool} -> {Nat.is_le(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.bit_length(n), K) == True{} : Bool}
def e_lt source · line 569 · raw
@+kp:Nat -> @+bl:Nat -> @+hbl:{Nat.is_le(bl, 32n) == True{} : Bool} -> {Nat.is_lt(1n+Nat.div(bl, 2n+kp), 32n) == True{} : Bool}bl <= 32 gives 1 + bl / (2 + kp) < 32
def e_lt64 source · line 576 · raw
@+kp:Nat -> @+bl:Nat -> @+hbl:{Nat.is_le(bl, 64n) == True{} : Bool} -> {Nat.is_lt(1n+Nat.div(bl, 2n+kp), 64n) == True{} : Bool}bl <= 64 gives 1 + bl / (2 + kp) < 64