package ff
Install
Dune Dependency
Authors
Maintainers
Sources
md5=5853a7487785160bbcf0919f13ace049
sha512=c2e4d3d495a0fe6a5e52ac668d6f7694c7b9161bd0c6fc97cb6ed714a211c397a561feac8c2ea5738182809936c5f8f6e1e64696b0e0f9b3d19e309aa62dd4de
Description
OCaml implementation of Finite Field operations
Published: 08 Dec 2020
README
OCaml FF
Play with Finite Field in OCaml
This library provides functors to instantiate finite field of arbitrary orders (in the limit of Zarith, the dependency to handle arbitrary integers).
module F13 = Ff.MakeFp (struct let prime_order = Z.of_string "13" end)
module BLSFr = Ff.MakeFp (
struct
let prime_order = Z.of_string "52435875175126190479447740508185965837690552500527637822603658699938581184513"
end
)
JavaScript compatibility
This library can be transpiled in JavaScript using js_of_ocaml. An example is provided in js/test_js.ml
, with the corresponding dune
file. It instantiates Fp with p = 53. dune
will compile this into a FiniteField.js
file, exporting methods like add
, toString
, random
, etc. FiniteField
can be used as a Node module. See js/test/test_js.js
for an example.
# Generate FiniteField.js
dune build js
cp _build/default/js/FiniteField.js ./
node
var FF = require("./FiniteField.js");
let x = FF.random();
let y = FF.random();
let x_plus_y = FF.add(x, y);
Install
opam install ff
For a specific version (from 0.2.1), use
opam install ff.0.3.0
Replace 0.3.0 with the version you want, see tags.
Documentation
See here
PBT testing
A package ff-pbt
is also included and published providing Property Based Testing of finite fields based on the generic finite fields interface given in ff
. If you have a library implementing finite fields, but not using the functors provided by ff
, you can use:
(* You module is MyField *)
module MyFieldProperties = Ff_pbt.MakeFieldProperties (MyField)
let () =
let open Alcotest in
run "MyField" [MyFieldProperties.get_tests()]
It is stronly relying on the random
function implemented by the finite field module.
Benchmark
ff-bench
is a benchmark library (using Core_bench
) for finite fields, respecting the signature Ff_sig.BASE
. Here how to use:
module F337 = Ff.Make (struct let prime_order = Z.of_string "337" end)
module Bench = Ff_bench.MakeBench (F337)
let () =
let commands = Bench.get_benches "F337" in
Core.Command.run (Core.Bench.make_command commands)
Dev Dependencies (3)
-
bisect_ppx
with-test & >= "2.5"
-
ff-pbt
= version & with-test
-
alcotest
with-test
Used by (3)
- mec
-
polynomial
>= "0.4.0"
-
tezos-plompiler
< "1.0.0"
Conflicts
None