get "libhdr" let mulinv(a, b) = b<0 -> mulinv(a, -b), a<0 -> mulinv(b - (-a rem b), b), valof $( let t, nt, r, nr = 0, 1, b, a rem b until nr = 0 $( let tmp, q = ?, r / nr tmp := nt ; nt := t - q*nt ; t := tmp tmp := nr ; nr := r - q*nr ; r := tmp $) resultis r>1 -> -1, t<0 -> t + b, t $) let show(a, b) be $( let mi = mulinv(a, b) test mi>=0 do writef("%N, %N -> %N*N", a, b, mi) or writef("%N, %N -> no inverse*N", a, b) $) let start() be $( show(42, 2017) show(40, 1) show(52, -217) show(-486, 217) show(40, 2018) $)