(* Division modulo m *)

(* Pour diviser x par y modulo m, on commence par se servir
   de l'algorithme d'Euclide étendu pour calculer l'inverse de y modulo m.
   Ensuite, il suffit de le multiplier par x. *)

let rec extended_gcd x y = (* Programme 79 page 327 *)
  if y = 0 then
    (1, 0, x)
  else
    let q = x / y in
    let (u, v, g) = extended_gcd y (x - q * y) in
    (v, u - q * v, g)

let div_mod x y m =
  assert (x > 0 && y > 0 && m > 0);
  let iy, _, g = extended_gcd y m in
  assert (g = 1);
  let iy = (iy + m) mod m in (* on assure iy >= 0 *)
  (x * iy) mod m

(* preuve : par l'algorithme d'Euclide étendu, on a

     iy * y + im * m = gcd(y,m) = 1

   donc

     iy * y = 1 (mod m)

   et donc

     (x * iy) * y = x (mod m)
*)

This document was generated using caml2html