def pm_gen
bend-collections-laws-math@1.0.0.0 · proofs/math/typed/u32int.bend:462
import bend-collections-laws-math@1.0.0.0/proofs/math/typed/u32int.bend as U32int
import Base
import bend-collections-laws-math@1.0.0.0/src/math/generic.bend as G
import bend-collections-laws-math@1.0.0.0/src/math/num.bend as NM
import bend-collections-laws-math@1.0.0.0/src/math/natural.bend as M
import bend-collections-laws-math@1.0.0.0/src/math/instances.bend as I
import bend-collections-laws-math@1.0.0.0/proofs/lib/logic.bend as L
import bend-collections-laws-math@1.0.0.0/proofs/math/natural/arith.bend as NR
import bend-collections-laws-math@1.0.0.0/proofs/math/typed/u32.bend as U32P
import bend-collections-laws-math@1.0.0.0/proofs/math/typed/natfuel.bend as NF
462
463def pm_gen(+k: Nat, +hk: {k == 32n : Nat}, +b: U32, +e: U32, +m: U32, +mp: Nat, +hnm: {v(m) == 1n+mp : Nat}) -> {v(G.pow_mod_go(~U32, ~I.u32_op, ~I.u32_is, 140n, m, I.u32_op(NM.Rem{b, m}), I.u32_op(NM.Rem{I.u32_op(NM.One{}), m}), (e, I.u32_is(NM.IsZero{e})))) == M.pow_mod_go(v(e), 1n+mp, v(e), Nat.mod(v(b), 1n+mp), Nat.mod(1n, 1n+mp)) : Nat}:
464 +rb = I.u32_op(NM.Rem{b, m})
465 +ra = I.u32_op(NM.Rem{I.u32_op(NM.One{}), m})
466 +eb = pm_rem(b, m, mp, hnm)
467 +ea = Equal.trans(Nat, v(ra), Nat.mod(v(I.u32_op(NM.One{})), 1n+mp), Nat.mod(1n, 1n+mp), pm_rem(I.u32_op(NM.One{}), m, mp, hnm), Equal.cong(Nat, Nat, t => Nat.mod(t, 1n+mp), v(I.u32_op(NM.One{})), 1n, one_v()))
468 +hb = L.subst(Nat, z => {Nat.is_lt(z, 1n+mp) == True{} : Bool}, Nat.mod(v(b), 1n+mp), v(rb), Equal.sym(Nat, v(rb), Nat.mod(v(b), 1n+mp), eb), NR.dm_lt(mp, v(b)))
469 +ha = L.subst(Nat, z => {Nat.is_lt(z, 1n+mp) == True{} : Bool}, Nat.mod(1n, 1n+mp), v(ra), Equal.sym(Nat, v(ra), Nat.mod(1n, 1n+mp), ea), NR.dm_lt(mp, 1n))
470 +hj = L.subst(Nat, z => {Nat.is_le(z, 140n) == True{} : Bool}, 32n, k, Equal.sym(Nat, k, 32n, hk), {==})
471 +s = pmsim(140n, m, rb, ra, e, mp, hnm, hb, ha, I.u32_is(NM.IsZero{e}), v(e), {==}, {==})
472 +c1 = Equal.trans(Nat, M.pow_mod_go(140n, 1n+mp, v(e), v(rb), v(ra)), M.pow_mod_go(140n, 1n+mp, v(e), Nat.mod(v(b), 1n+mp), v(ra)), M.pow_mod_go(140n, 1n+mp, v(e), Nat.mod(v(b), 1n+mp), Nat.mod(1n, 1n+mp)), Equal.cong(Nat, Nat, t => M.pow_mod_go(140n, 1n+mp, v(e), t, v(ra)), v(rb), Nat.mod(v(b), 1n+mp), eb), Equal.cong(Nat, Nat, t => M.pow_mod_go(140n, 1n+mp, v(e), Nat.mod(v(b), 1n+mp), t), v(ra), Nat.mod(1n, 1n+mp), ea))
473 +c2 = NF.pm_140(k, 1n+mp, v(e), Nat.mod(v(b), 1n+mp), Nat.mod(1n, 1n+mp), hj, U32P.val_lt(1n, {==}, k, hk, e))
474 Equal.trans(Nat, v(G.pow_mod_go(~U32, ~I.u32_op, ~I.u32_is, 140n, m, I.u32_op(NM.Rem{b, m}), I.u32_op(NM.Rem{I.u32_op(NM.One{}), m}), (e, I.u32_is(NM.IsZero{e})))), M.pow_mod_go(140n, 1n+mp, v(e), v(rb), v(ra)), M.pow_mod_go(v(e), 1n+mp, v(e), Nat.mod(v(b), 1n+mp), Nat.mod(1n, 1n+mp)), s, Equal.trans(Nat, M.pow_mod_go(140n, 1n+mp, v(e), v(rb), v(ra)), M.pow_mod_go(140n, 1n+mp, v(e), Nat.mod(v(b), 1n+mp), Nat.mod(1n, 1n+mp)), M.pow_mod_go(v(e), 1n+mp, v(e), Nat.mod(v(b), 1n+mp), Nat.mod(1n, 1n+mp)), c1, c2))