def exp_inv

bend-collections-laws-crypto@1.0.0.0 · proofs/crypto/secp256k1/scalarpow.bend:197

import bend-collections-laws-crypto@1.0.0.0/proofs/crypto/secp256k1/scalarpow.bend as Scalarpow
import Base
import bend-collections-laws-crypto@1.0.0.0/spec/crypto/secp256k1/field.bend as FS
import bend-collections-laws-crypto@1.0.0.0/src/crypto/secp256k1/scalar.bend as S
import bend-collections-laws-crypto@1.0.0.0/proofs/lib/nat.bend as N
import bend-collections-laws-crypto@1.0.0.0/proofs/lib/lemmas/proofs/nat_algebra.bend as NA
import bend-collections-laws-crypto@1.0.0.0/proofs/math/natural/arith.bend as NR
import bend-collections-laws-crypto@1.0.0.0/proofs/crypto/secp256k1/consts.bend as K
import bend-collections-laws-crypto@1.0.0.0/proofs/crypto/secp256k1/bitsv.bend as BV

197def exp_inv(+one: Nat, +h1: {one == 1n : Nat}) -> {BV.hv(S.inv_bits(), one, 0n) == Nat.sub(1n+K.np(one), 2n) : Nat}:
198  +h = BV.hv(S.inv_bits(), one, 0n)
199  +e = NR.add_cancel(FS.cn(one), Nat.add(h, 2n), 1n+K.np(one), inv_h2(one, h1))
200  %Equal.sym(Nat, 1n+K.np(one), Nat.add(BV.hv(S.inv_bits(), one, 0n), 2n), Equal.sym(Nat, Nat.add(BV.hv(S.inv_bits(), one, 0n), 2n), 1n+K.np(one), e)) : {BV.hv(S.inv_bits(), one, 0n) == Nat.sub(_, 2n) : Nat}
201  %Equal.sym(Nat, Nat.add(BV.hv(S.inv_bits(), one, 0n), 2n), Nat.add(2n, BV.hv(S.inv_bits(), one, 0n)), NA.add_comm(BV.hv(S.inv_bits(), one, 0n), 2n)) : {BV.hv(S.inv_bits(), one, 0n) == Nat.sub(_, 2n) : Nat}
202  %Equal.sym(Nat, Nat.sub(Nat.add(2n, BV.hv(S.inv_bits(), one, 0n)), 2n), BV.hv(S.inv_bits(), one, 0n), N.add_sub_cancel(2n, BV.hv(S.inv_bits(), one, 0n))) : {BV.hv(S.inv_bits(), one, 0n) == _ : Nat}
203  {==}

Uses (12)

Used by (1)