RosettaCodeData/Task/Modular-inverse/BCPL/modular-inverse.bcpl

32 lines
674 B
Plaintext

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)
$)