mod_/(i: %, j: %, n: %): % == { local c0, d0, c1, d1: %; (c0, d0) := (j, n); (c1, d1) := (1, 0); while not zero? d0 repeat { q := c0 quo d0; (c0, d0) := (d0, c0 - q*d0); (c1, d1) := (d1, c1 - q*d1) } if c0 ~= 1 then error "inverse does not exist"; if c1 < 0 then c1 := c1 + n; mod_*(i, c1, n);