Guest User

Untitled

a guest
Nov 4th, 2012
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.48 KB | None | 0 0
  1. module type Params =
  2.   sig
  3.     val n : int
  4.   end
  5.  
  6. module type MakeField = functor (P : Params) ->
  7.   sig
  8.     type t
  9.     val n : int
  10.     val q : int
  11.     val irr : int
  12.     val zero : t
  13.     val one : t
  14.     val (+) : t -> t -> t
  15.     val (-) : t -> t -> t
  16.     val minus : t -> t
  17.     val ( * ) : t -> t -> t
  18.     val inv : t -> t
  19.     val ( / ) : t -> t -> t
  20.     val pow : t -> int -> t
  21.     val print : t -> unit
  22.     val print_irr : unit -> unit
  23.   end
  24.  
  25. module Make : MakeField = functor (P : Params) ->
  26.   struct
  27.     type t = Zero | Pow of int
  28.     let n = P.n
  29.     let q = 1 lsl n
  30.     let irr = find_irr P.n
  31.     let zero = Zero
  32.     let one = Pow 0
  33.     let add_table = make_table q n irr
  34.     let rev_add_table = reverse_table q add_table
  35.     let (+) a b =
  36.         match a,b with
  37.         | Zero,_ -> b
  38.         | _,Zero -> a
  39.         | (Pow x),(Pow y) ->
  40.             let res = add_table.(x) lxor add_table.(y) in
  41.             if res = 0 then Zero else Pow rev_add_table.(res-1)
  42.     let (-) = (+)
  43.     let minus (x:t) = x
  44.     let ( * ) a b =
  45.         match a,b with
  46.         | Zero,_ -> Zero
  47.         | _,Zero -> Zero
  48.         | (Pow x),(Pow y) -> let c = ((x+y) mod (q-1)) in Pow c
  49.     let inv = function
  50.         | Zero -> raise (Invalid_argument "inv")
  51.         | Pow 0 -> Pow 0
  52.         | Pow a -> Pow (q - 1 - a)
  53.     let ( / ) a b = a * (inv b)
  54.     let pow p = function 0 -> one | n -> fast_exp ( * ) p n
  55.     let print_irr () = print irr
  56.     let print = function Zero -> Printf "0\n" | Pow a -> print add_table.(a)
  57.   end
Advertisement
Add Comment
Please, Sign In to add comment