This library implements polynomials of Bls12_381.Fr as arrays of contiguous memory in C, allowing much better performances for algorithms that scan the polynomials.
An array a
of size n
represents the polynomial $\sum_i^(n-1) ai
X^i$ The length of a
is always greater or equal than the degree+1 of its corresponding polynomial, if greater it padded with zeros. As a consequence a polynomial has many representations, namely all arrays with trailing zeros.
allocate len
creates a zero polynomial of size len
erase p
overwrites a polynomial p
with a zero polynomial of the same size as the polynomial p
length p
returns the length of a C array where a polynomial p
is stored
val generate_random_polynomial : int -> t
generate_random_polynomial n
generates a polynomial with a maximum size n
Note: generates more often the zero polynomial and polynomials with zero coefficients
degree p
returns the degree of a polynomial p
. Returns -1
for the zero polynomial
get p i
returns the i
-th element of a given array p
, a coefficient of X^i
in p
val to_string : t -> string
to_string p
returns the string representation of a polynomial p
val copy : ?offset :int -> ?len :int -> t -> t
copy p
returns a copy of a polynomial p
val to_dense_coefficients : t -> scalar array
to_dense_coefficients p
returns the dense representation of a polynomial p
, i.e., it converts a C array to an OCaml array
of_dense p
creates a value of type t
from the dense representation of a polynomial p
, i.e., it converts an OCaml array to a C array
val of_coefficients : (scalar * int) list -> t
of_coefficients p
creates a value of type t
from the sparse representation of a polynomial p
, i.e., it converts an OCaml array to a C array
val equal : t -> t -> bool
equal a b
checks whether a polynomial a
is equal to a polynomial b
is_zero p
checks whether a polynomial p
is the zero polynomial
zero
is the zero polynomial, the neutral element for polynomial addition
one
is the constant polynomial one, the neutral element for polynomial multiplication
add
computes polynomial addition
val add_inplace : t -> t -> t -> unit
add_inplace res a b
computes polynomial addition of a
and b
and writes the result in res
Note: res
can be equal to either a
or b
sub
computes polynomial subtraction
val sub_inplace : t -> t -> t -> unit
sub_inplace res a b
computes polynomial subtraction of a
and b
and writes the result in res
Note: res
can be equal to either a
or b
mul
computes polynomial multiplication
Note: naive quadratic algorithm, result's size is the sum of arguments' size
mul_by_scalar
computes multiplication of a polynomial by a blst_fr element
val mul_by_scalar_inplace : t -> scalar -> t -> unit
mul_by_scalar_inplace res s p
computes multiplication of a polynomial p
by a blst_fr element s
and stores it in res
linear p s
computes sum (mul p.(i) s.(i))
opposite
computes polynomial negation
val opposite_inplace : t -> unit
opposite_inplace p
computes polynomial negation
Note: The argument p
is overwritten
evaluate p x
evaluates a polynomial p
at x
exception Rest_not_null of string
division_x_z p z
returns the quotient of the division of p
by (X - z)
requires: length of p >= 2 Does NOT raise an error if p
is not divisible. val division_zs : t -> int -> t
division_zs p n
returns the quotient of the division of p
by (X^n - 1)
requires: length of p >= 2*n Does NOT raise an error if p
is not divisible, it can be checked using mul_zs
. val mul_zs : t -> int -> t
mul_zs p n
returns the product of p
and (X^n - 1)
requires: length of p >= n derivative p
returns the formal derivative of p
val split : int -> int -> t -> t list
constant s
creates a value of type t
from a blst_fr element s