Hello!

I wrote ocaml-pari, an OCaml library providing bindings to the PARI algebra library. The bindings are automatically generated from the library’s header files. In addition, a light wrapper offers a thin layer of static typing to not only encode part of the written documentation into types by means of phantom types, but to encode actual invariants to prevent mismatches between functions and arguments. E.g., to prevent from multiplying a group element by a polynomial. One can find code samples in the `examples`

directory, notably cryptographic polynomial commitments (`kzg.ml`

) and an attack on a knapsack cryptosystem (`knapsack_lll.ml`

).

The underlying library, PARI, is written in C and relies on a single recursive type to represent all objects. With the wrapper, this type is `(‘kind, ‘structure) t`

so as to annotate it with its kind and the operations it supports. It is thus possible to write a generic algorithm that works with group elements `(‘a, group) t`

for instance. The library is available from OPAM: `opam install pari`

.