10
1
mirror of https://gitlab.com/scemama/QCaml.git synced 2024-12-22 12:23:31 +01:00
This commit is contained in:
Anthony Scemama 2018-03-03 21:19:50 +01:00
parent eb2d7998e2
commit 6f633fe37e
2 changed files with 56 additions and 26 deletions

View File

@ -8,18 +8,22 @@ type t =
} }
let of_int kind right = (** Creates a Zkey. *)
let make ~kind right =
{ left = 0 ; right ; kind } { left = 0 ; right ; kind }
(** Move [right] to [left] and set [right = x] *)
let (<|) z x = let (<|) z x =
z.left <- z.right; z.left <- z.right;
z.right <- x; z.right <- x;
z z
(** Shift left [right] by 10 bits, and add [x]. *)
let (<<) z x = let (<<) z x =
z.right <- (z.right lsl 10) lor x ; z.right <- (z.right lsl 10) lor x ;
z z
(** Shift left [right] by 10 bits, and add [x]. *)
let (<+) z x = let (<+) z x =
z.right <- (z.right lsl 15) lor x ; z.right <- (z.right lsl 15) lor x ;
z z
@ -31,19 +35,19 @@ type kind =
| Nine of (Powers.t * Powers.t * Powers.t) | Nine of (Powers.t * Powers.t * Powers.t)
| Twelve of (Powers.t * Powers.t * Powers.t * Powers.t) | Twelve of (Powers.t * Powers.t * Powers.t * Powers.t)
let of_powers_three { x=a ; y=b ; z=c ; _ } = of_int 3 a <+ b <+ c let of_powers_three { x=a ; y=b ; z=c ; _ } = make 3 a <+ b <+ c
let of_powers_six { x=a ; y=b ; z=c ; _ } { x=d ; y=e ; z=f ; _ } = let of_powers_six { x=a ; y=b ; z=c ; _ } { x=d ; y=e ; z=f ; _ } =
of_int 6 a << b << c << d << e << f make 6 a << b << c << d << e << f
let of_powers_twelve { x=a ; y=b ; z=c ; _ } { x=d ; y=e ; z=f ; _ } let of_powers_twelve { x=a ; y=b ; z=c ; _ } { x=d ; y=e ; z=f ; _ }
{ x=g ; y=h ; z=i ; _ } { x=j ; y=k ; z=l ; _ } = { x=g ; y=h ; z=i ; _ } { x=j ; y=k ; z=l ; _ } =
of_int 12 a << b << c << d << e << f make 12 a << b << c << d << e << f
<| g << h << i << j << k << l <| g << h << i << j << k << l
let of_powers_nine { x=a ; y=b ; z=c ; _ } { x=d ; y=e ; z=f ; _ } let of_powers_nine { x=a ; y=b ; z=c ; _ } { x=d ; y=e ; z=f ; _ }
{ x=g ; y=h ; z=i ; _ } = { x=g ; y=h ; z=i ; _ } =
of_int 9 a << b << c << d << e << f make 9 a << b << c << d << e << f
<| g << h << i <| g << h << i
@ -168,7 +172,7 @@ let equal
{ right = r2 ; left = l2 ; kind = k2 } = { right = r2 ; left = l2 ; kind = k2 } =
r1 = r2 && l1 = l2 && k1 = k2 r1 = r2 && l1 = l2 && k1 = k2
let cmp let compare
{ right = r1 ; left = l1 ; kind = k1 } { right = r1 ; left = l1 ; kind = k1 }
{ right = r2 ; left = l2 ; kind = k2 } = { right = r2 ; left = l2 ; kind = k2 } =
if k1 <> k2 then invalid_arg (__FILE__^": cmp"); if k1 <> k2 then invalid_arg (__FILE__^": cmp");
@ -186,23 +190,3 @@ let to_string { left ; right ; kind } =
|> String.concat ", " |> String.concat ", "
) ^ " >" ) ^ " >"
(*
let debug () =
and k3 = of_int_array Kind_3 [| 1 ; 2 ; 3 |]
and k6 = of_int_array Kind_6 [| 1 ; 2 ; 3; 4 ; 5; 6|]
and k12 = of_int_array Kind_12 [| 1 ; 2 ; 3; 4 ; 5; 6 ; 7 ; 8 ; 9 ; 10 ; 11; 12|]
in
print_endline @@ to_string Kind_3 k3 ;
print_endline @@ to_string Kind_6 k6 ;
print_endline @@ to_string Kind_12 k12
(*
< 65538 | 1, 2 >
< 1050627 | 1, 2, 3 >
< 281483566841860 | 1, 2, 3, 4 >
< 1128102155523078 | 1, 2, 3, 4, 5, 6 >
< 20809811751934310026571282435288076 | 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 >
*)
let () = debug ()
*)

46
Utils/Zkey.mli Normal file
View File

@ -0,0 +1,46 @@
(** Encodes the powers of x, y, z in a compact form, suitable for being
used in a hash table.
*)
type t
val to_string : t -> string
(** Pretty printing *)
val of_powers_three : Powers.t -> t
(** Create from a {!Powers.t}. *)
val of_powers_six : Powers.t -> Powers.t -> t
(** Create from two {!Powers.t}. *)
val of_powers_nine : Powers.t -> Powers.t -> Powers.t -> t
(** Create from three {!Powers.t}. *)
val of_powers_twelve : Powers.t -> Powers.t -> Powers.t -> Powers.t -> t
(** Create from four {!Powers.t}. *)
type kind =
| Three of Powers.t
| Six of (Powers.t * Powers.t)
| Nine of (Powers.t * Powers.t * Powers.t)
| Twelve of (Powers.t * Powers.t * Powers.t * Powers.t)
val of_powers : kind -> t
(** Create using the [kind] type *)
val to_int_array : t -> int array
(** Convert to an int array. *)
val to_powers : t -> kind
(** {1 Functions for hash tables} *)
val hash : t -> int
(** Associates a nonnegative integer to any Zkey. *)
val equal : t -> t -> bool
(** The equal function. True if two Zkeys are equal. *)
val compare : t -> t -> int
(** Comparison function, used for sorting. *)