Flint2-0.1.0.0: src/Data/Number/Flint/Fmpz/Vec/FFI.hsc
{-|
module : Data.Number.Flint.Fmpz.Vec.FFI
copyright : (c) 2022 Hartmut Monien
license : GNU GPL, version 2 or above (see LICENSE)
maintainer : hmonien@uni-bonn.de
-}
module Data.Number.Flint.Fmpz.Vec.FFI (
-- * Vectors of integers
-- * Memory management
_fmpz_vec_init
, _fmpz_vec_clear
-- * Randomisation
, _fmpz_vec_randtest
, _fmpz_vec_randtest_unsigned
-- * Bit sizes and norms
, _fmpz_vec_max_bits
, _fmpz_vec_max_bits_ref
, _fmpz_vec_sum_max_bits
, _fmpz_vec_max_limbs
, _fmpz_vec_height
, _fmpz_vec_height_index
-- * Input and output
, _fmpz_vec_fread
, _fmpz_vec_read
, _fmpz_vec_fprint
, _fmpz_vec_print
, _fmpz_vec_get_str
-- * Conversions
, _fmpz_vec_get_nmod_vec
, _fmpz_vec_set_nmod_vec
, _fmpz_vec_get_fft
, _fmpz_vec_set_fft
, _fmpz_vec_get_d_vec_2exp
-- , _fmpz_vec_get_mpf_vec
-- * Assignment and basic manipulation
, _fmpz_vec_set
, _fmpz_vec_swap
, _fmpz_vec_zero
, _fmpz_vec_neg
, _fmpz_vec_scalar_abs
-- * Comparison
, _fmpz_vec_equal
, _fmpz_vec_is_zero
, _fmpz_vec_max
, _fmpz_vec_max_inplace
-- * Sorting
, _fmpz_vec_sort
-- * Addition and subtraction
, _fmpz_vec_add
, _fmpz_vec_sub
-- * Scalar multiplication and division
, _fmpz_vec_scalar_mul_fmpz
, _fmpz_vec_scalar_mul_si
, _fmpz_vec_scalar_mul_ui
, _fmpz_vec_scalar_mul_2exp
, _fmpz_vec_scalar_divexact_fmpz
, _fmpz_vec_scalar_divexact_si
, _fmpz_vec_scalar_divexact_ui
, _fmpz_vec_scalar_fdiv_q_fmpz
, _fmpz_vec_scalar_fdiv_q_si
, _fmpz_vec_scalar_fdiv_q_ui
, _fmpz_vec_scalar_fdiv_q_2exp
, _fmpz_vec_scalar_fdiv_r_2exp
, _fmpz_vec_scalar_tdiv_q_fmpz
, _fmpz_vec_scalar_tdiv_q_si
, _fmpz_vec_scalar_tdiv_q_ui
, _fmpz_vec_scalar_tdiv_q_2exp
, _fmpz_vec_scalar_addmul_si
, _fmpz_vec_scalar_addmul_ui
, _fmpz_vec_scalar_addmul_fmpz
, _fmpz_vec_scalar_addmul_si_2exp
, _fmpz_vec_scalar_submul_fmpz
, _fmpz_vec_scalar_submul_si
, _fmpz_vec_scalar_submul_si_2exp
-- * Sums and products
, _fmpz_vec_sum
, _fmpz_vec_prod
-- * Reduction mod \(p\)
, _fmpz_vec_scalar_mod_fmpz
, _fmpz_vec_scalar_smod_fmpz
-- * Gaussian content
, _fmpz_vec_content
, _fmpz_vec_content_chained
, _fmpz_vec_lcm
-- * Dot product
, _fmpz_vec_dot
, _fmpz_vec_dot_ptr
) where
-- vectors of integers ---------------------------------------------------------
import Foreign.C.String
import Foreign.C.Types
import Foreign.ForeignPtr
import Foreign.Ptr ( Ptr, FunPtr, plusPtr, nullPtr, castPtr )
import Foreign.Storable
import Foreign.Marshal ( free )
import Data.Number.Flint.Flint
import Data.Number.Flint.Fmpz
import Data.Number.Flint.NMod
#include <flint/flint.h>
#include <flint/fmpz.h>
#include <flint/fmpz_vec.h>
-- Memory management -----------------------------------------------------------
-- | /_fmpz_vec_init/ /len/
--
-- Returns an initialised vector of @fmpz@\'s of given length.
foreign import ccall "fmpz_vec.h _fmpz_vec_init"
_fmpz_vec_init :: CLong -> IO (Ptr CFmpz)
-- | /_fmpz_vec_clear/ /vec/ /len/
--
-- Clears the entries of @(vec, len)@ and frees the space allocated for
-- @vec@.
foreign import ccall "fmpz_vec.h _fmpz_vec_clear"
_fmpz_vec_clear :: Ptr CFmpz -> CLong -> IO ()
-- Randomisation ---------------------------------------------------------------
-- | /_fmpz_vec_randtest/ /f/ /state/ /len/ /bits/
--
-- Sets the entries of a vector of the given length to random integers with
-- up to the given number of bits per entry.
foreign import ccall "fmpz_vec.h _fmpz_vec_randtest"
_fmpz_vec_randtest :: Ptr CFmpz -> Ptr CFRandState -> CLong -> CFBitCnt -> IO ()
-- | /_fmpz_vec_randtest_unsigned/ /f/ /state/ /len/ /bits/
--
-- Sets the entries of a vector of the given length to random unsigned
-- integers with up to the given number of bits per entry.
foreign import ccall "fmpz_vec.h _fmpz_vec_randtest_unsigned"
_fmpz_vec_randtest_unsigned :: Ptr CFmpz -> Ptr CFRandState -> CLong -> CFBitCnt -> IO ()
-- Bit sizes and norms ---------------------------------------------------------
-- | /_fmpz_vec_max_bits/ /vec/ /len/
--
-- If \(b\) is the maximum number of bits of the absolute value of any
-- coefficient of @vec@, then if any coefficient of @vec@ is negative,
-- \(-b\) is returned, else \(b\) is returned.
foreign import ccall "fmpz_vec.h _fmpz_vec_max_bits"
_fmpz_vec_max_bits :: Ptr CFmpz -> CLong -> IO CLong
-- | /_fmpz_vec_max_bits_ref/ /vec/ /len/
--
-- If \(b\) is the maximum number of bits of the absolute value of any
-- coefficient of @vec@, then if any coefficient of @vec@ is negative,
-- \(-b\) is returned, else \(b\) is returned. This is a slower reference
-- implementation of @_fmpz_vec_max_bits@.
foreign import ccall "fmpz_vec.h _fmpz_vec_max_bits_ref"
_fmpz_vec_max_bits_ref :: Ptr CFmpz -> CLong -> IO CLong
-- | /_fmpz_vec_sum_max_bits/ /sumabs/ /maxabs/ /vec/ /len/
--
-- Sets @sumabs@ to the bit count of the sum of the absolute values of the
-- elements of @vec@. Sets @maxabs@ to the bit count of the maximum of the
-- absolute values of the elements of @vec@.
foreign import ccall "fmpz_vec.h _fmpz_vec_sum_max_bits"
_fmpz_vec_sum_max_bits :: Ptr CLong -> Ptr CLong -> Ptr CFmpz -> CLong -> IO ()
-- | /_fmpz_vec_max_limbs/ /vec/ /len/
--
-- Returns the maximum number of limbs needed to store the absolute value
-- of any entry in @(vec, len)@. If all entries are zero, returns zero.
foreign import ccall "fmpz_vec.h _fmpz_vec_max_limbs"
_fmpz_vec_max_limbs :: Ptr CFmpz -> CLong -> IO CULong
-- | /_fmpz_vec_height/ /height/ /vec/ /len/
--
-- Computes the height of @(vec, len)@, defined as the largest of the
-- absolute values the coefficients. Equivalently, this gives the infinity
-- norm of the vector. If @len@ is zero, the height is \(0\).
foreign import ccall "fmpz_vec.h _fmpz_vec_height"
_fmpz_vec_height :: Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- | /_fmpz_vec_height_index/ /vec/ /len/
--
-- Returns the index of an entry of maximum absolute value in the vector.
-- The the length must be at least 1.
foreign import ccall "fmpz_vec.h _fmpz_vec_height_index"
_fmpz_vec_height_index :: Ptr CFmpz -> CLong -> IO CLong
-- Input and output ------------------------------------------------------------
foreign import ccall "_fmpz_vec_get_str"
_fmpz_vec_get_str :: CLong -> Ptr CFmpz -> IO (CString)
-- | /_fmpz_vec_fread/ /file/ /vec/ /len/
--
-- Reads a vector from the stream @file@ and stores it at @*vec@. The
-- format is the same as the output format of @_fmpz_vec_fprint()@,
-- followed by either any character or the end of the file.
--
-- The interpretation of the various input arguments depends on whether or
-- not @*vec@ is @NULL@:
--
-- If @*vec == NULL@, the value of @*len@ on input is ignored. Once the
-- length has been read from @file@, @*len@ is set to that value and a
-- vector of this length is allocated at @*vec@. Finally, @*len@
-- coefficients are read from the input stream. In case of a file or
-- parsing error, clears the vector and sets @*vec@ and @*len@ to @NULL@
-- and @0@, respectively.
--
-- Otherwise, if @*vec != NULL@, it is assumed that @(*vec, *len)@ is a
-- properly initialised vector. If the length on the input stream does not
-- match @*len@, a parsing error is raised. Attempts to read the right
-- number of coefficients from the input stream. In case of a file or
-- parsing error, leaves the vector @(*vec, *len)@ in its current state.
--
-- In case of success, returns a positive value. In case of failure,
-- returns a non-positive value.
foreign import ccall "fmpz_vec.h _fmpz_vec_fread"
_fmpz_vec_fread :: Ptr CFile -> Ptr CFmpz -> Ptr CLong -> IO CInt
-- | /_fmpz_vec_read/ /vec/ /len/
--
-- Reads a vector from @stdin@ and stores it at @*vec@.
--
-- For further details, see @_fmpz_vec_fread()@.
foreign import ccall "fmpz_vec.h _fmpz_vec_read"
_fmpz_vec_read :: Ptr CFmpz -> Ptr CLong -> IO CInt
-- | /_fmpz_vec_fprint/ /file/ /vec/ /len/
--
-- Prints the vector of given length to the stream @file@. The format is
-- the length followed by two spaces, then a space separated list of
-- coefficients. If the length is zero, only \(0\) is printed.
--
-- In case of success, returns a positive value. In case of failure,
-- returns a non-positive value.
foreign import ccall "fmpz_vec.h _fmpz_vec_fprint"
_fmpz_vec_fprint :: Ptr CFile -> Ptr CFmpz -> CLong -> IO CInt
-- | /_fmpz_vec_print/ /vec/ /len/
--
-- Prints the vector of given length to @stdout@.
--
-- For further details, see @_fmpz_vec_fprint()@.
_fmpz_vec_print :: Ptr CFmpz -> CLong -> IO CInt
_fmpz_vec_print x n = printCStr (_fmpz_vec_get_str n) x
-- Conversions -----------------------------------------------------------------
-- | /_fmpz_vec_get_nmod_vec/ /res/ /poly/ /len/ /mod/
--
-- Reduce the coefficients of @(poly, len)@ modulo the given modulus and
-- set @(res, len)@ to the result.
foreign import ccall "fmpz_vec.h _fmpz_vec_get_nmod_vec"
_fmpz_vec_get_nmod_vec :: Ptr CMp -> Ptr CFmpz -> CLong -> Ptr CNMod -> IO ()
-- | /_fmpz_vec_set_nmod_vec/ /res/ /poly/ /len/ /mod/
--
-- Set the coefficients of @(res, len)@ to the symmetric modulus of the
-- coefficients of @(poly, len)@, i.e. convert the given coefficients
-- modulo the given modulus \(n\) to their signed integer representatives
-- in the range \([-n/2, n/2)\).
foreign import ccall "fmpz_vec.h _fmpz_vec_set_nmod_vec"
_fmpz_vec_set_nmod_vec :: Ptr CFmpz -> Ptr CMp -> CLong -> Ptr CNMod -> IO ()
-- | /_fmpz_vec_get_fft/ /coeffs_f/ /coeffs_m/ /l/ /length/
--
-- Convert the vector of coeffs @coeffs_m@ to an fft vector @coeffs_f@ of
-- the given @length@ with @l@ limbs per coefficient with an additional
-- limb for overflow.
foreign import ccall "fmpz_vec.h _fmpz_vec_get_fft"
_fmpz_vec_get_fft :: Ptr (Ptr CMpLimb) -> Ptr CFmpz -> CLong -> CLong -> IO CLong
-- | /_fmpz_vec_set_fft/ /coeffs_m/ /length/ /coeffs_f/ /limbs/ /sign/
--
-- Convert an fft vector @coeffs_f@ of fully reduced Fermat numbers of the
-- given @length@ to a vector of @fmpz@\'s. Each is assumed to be the given
-- number of limbs in length with an additional limb for overflow. If the
-- output coefficients are to be signed then set @sign@, otherwise clear
-- it. The resulting @fmpz@s will be in the range \([-n,n]\) in the signed
-- case and in the range \([0,2n]\) in the unsigned case where
-- @n = 2^(FLINT_BITS*limbs - 1)@.
foreign import ccall "fmpz_vec.h _fmpz_vec_set_fft"
_fmpz_vec_set_fft :: Ptr CFmpz -> CLong -> Ptr CMp -> CLong -> CLong -> IO ()
-- | /_fmpz_vec_get_d_vec_2exp/ /appv/ /vec/ /len/
--
-- Export the array of @len@ entries starting at the pointer @vec@ to an
-- array of doubles @appv@, each entry of which is notionally multiplied by
-- a single returned exponent to give the original entry. The returned
-- exponent is set to be the maximum exponent of all the original entries
-- so that all the doubles in @appv@ have a maximum absolute value of 1.0.
foreign import ccall "fmpz_vec.h _fmpz_vec_get_d_vec_2exp"
_fmpz_vec_get_d_vec_2exp :: Ptr CDouble -> Ptr CFmpz -> CLong -> IO CLong
-- -- | /_fmpz_vec_get_mpf_vec/ /appv/ /vec/ /len/
-- --
-- -- Export the array of @len@ entries starting at the pointer @vec@ to an
-- -- array of mpfs @appv@.
-- foreign import ccall "fmpz_vec.h _fmpz_vec_get_mpf_vec"
-- _fmpz_vec_get_mpf_vec :: Ptr CMpf -> Ptr CFmpz -> CLong -> IO ()
-- Assignment and basic manipulation -------------------------------------------
-- | /_fmpz_vec_set/ /vec1/ /vec2/ /len2/
--
-- Makes a copy of @(vec2, len2)@ into @vec1@.
foreign import ccall "fmpz_vec.h _fmpz_vec_set"
_fmpz_vec_set :: Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- | /_fmpz_vec_swap/ /vec1/ /vec2/ /len2/
--
-- Swaps the integers in @(vec1, len2)@ and @(vec2, len2)@.
foreign import ccall "fmpz_vec.h _fmpz_vec_swap"
_fmpz_vec_swap :: Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- | /_fmpz_vec_zero/ /vec/ /len/
--
-- Zeros the entries of @(vec, len)@.
foreign import ccall "fmpz_vec.h _fmpz_vec_zero"
_fmpz_vec_zero :: Ptr CFmpz -> CLong -> IO ()
-- | /_fmpz_vec_neg/ /vec1/ /vec2/ /len2/
--
-- Negates @(vec2, len2)@ and places it into @vec1@.
foreign import ccall "fmpz_vec.h _fmpz_vec_neg"
_fmpz_vec_neg :: Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- | /_fmpz_vec_scalar_abs/ /vec1/ /vec2/ /len2/
--
-- Takes the absolute value of entries in @(vec2, len2)@ and places the
-- result into @vec1@.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_abs"
_fmpz_vec_scalar_abs :: Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- Comparison ------------------------------------------------------------------
-- | /_fmpz_vec_equal/ /vec1/ /vec2/ /len/
--
-- Compares two vectors of the given length and returns \(1\) if they are
-- equal, otherwise returns \(0\).
foreign import ccall "fmpz_vec.h _fmpz_vec_equal"
_fmpz_vec_equal :: Ptr CFmpz -> Ptr CFmpz -> CLong -> IO CInt
-- | /_fmpz_vec_is_zero/ /vec/ /len/
--
-- Returns \(1\) if @(vec, len)@ is zero, and \(0\) otherwise.
foreign import ccall "fmpz_vec.h _fmpz_vec_is_zero"
_fmpz_vec_is_zero :: Ptr CFmpz -> CLong -> IO CInt
-- | /_fmpz_vec_max/ /vec1/ /vec2/ /vec3/ /len/
--
-- Sets @vec1@ to the pointwise maximum of @vec2@ and @vec3@.
foreign import ccall "fmpz_vec.h _fmpz_vec_max"
_fmpz_vec_max :: Ptr CFmpz -> Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- | /_fmpz_vec_max_inplace/ /vec1/ /vec2/ /len/
--
-- Sets @vec1@ to the pointwise maximum of @vec1@ and @vec2@.
foreign import ccall "fmpz_vec.h _fmpz_vec_max_inplace"
_fmpz_vec_max_inplace :: Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- Sorting ---------------------------------------------------------------------
-- | /_fmpz_vec_sort/ /vec/ /len/
--
-- Sorts the coefficients of @vec@ in ascending order.
foreign import ccall "fmpz_vec.h _fmpz_vec_sort"
_fmpz_vec_sort :: Ptr CFmpz -> CLong -> IO ()
-- Addition and subtraction ----------------------------------------------------
-- | /_fmpz_vec_add/ /res/ /vec1/ /vec2/ /len2/
--
-- Sets @(res, len2)@ to the sum of @(vec1, len2)@ and @(vec2, len2)@.
foreign import ccall "fmpz_vec.h _fmpz_vec_add"
_fmpz_vec_add :: Ptr CFmpz -> Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- | /_fmpz_vec_sub/ /res/ /vec1/ /vec2/ /len2/
--
-- Sets @(res, len2)@ to @(vec1, len2)@ minus @(vec2, len2)@.
foreign import ccall "fmpz_vec.h _fmpz_vec_sub"
_fmpz_vec_sub :: Ptr CFmpz -> Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- Scalar multiplication and division ------------------------------------------
-- | /_fmpz_vec_scalar_mul_fmpz/ /vec1/ /vec2/ /len2/ /x/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ multiplied by \(c\), where \(c\)
-- is an @fmpz_t@.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_mul_fmpz"
_fmpz_vec_scalar_mul_fmpz :: Ptr CFmpz -> Ptr CFmpz -> CLong -> Ptr CFmpz -> IO ()
-- | /_fmpz_vec_scalar_mul_si/ /vec1/ /vec2/ /len2/ /c/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ multiplied by \(c\), where \(c\)
-- is a @slong@.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_mul_si"
_fmpz_vec_scalar_mul_si :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CLong -> IO ()
-- | /_fmpz_vec_scalar_mul_ui/ /vec1/ /vec2/ /len2/ /c/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ multiplied by \(c\), where \(c\)
-- is an @ulong@.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_mul_ui"
_fmpz_vec_scalar_mul_ui :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CULong -> IO ()
-- | /_fmpz_vec_scalar_mul_2exp/ /vec1/ /vec2/ /len2/ /exp/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ multiplied by @2^exp@.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_mul_2exp"
_fmpz_vec_scalar_mul_2exp :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CULong -> IO ()
-- | /_fmpz_vec_scalar_divexact_fmpz/ /vec1/ /vec2/ /len2/ /x/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ divided by \(x\), where the
-- division is assumed to be exact for every entry in @vec2@.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_divexact_fmpz"
_fmpz_vec_scalar_divexact_fmpz :: Ptr CFmpz -> Ptr CFmpz -> CLong -> Ptr CFmpz -> IO ()
-- | /_fmpz_vec_scalar_divexact_si/ /vec1/ /vec2/ /len2/ /c/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ divided by \(x\), where the
-- division is assumed to be exact for every entry in @vec2@.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_divexact_si"
_fmpz_vec_scalar_divexact_si :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CLong -> IO ()
-- | /_fmpz_vec_scalar_divexact_ui/ /vec1/ /vec2/ /len2/ /c/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ divided by \(x\), where the
-- division is assumed to be exact for every entry in @vec2@.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_divexact_ui"
_fmpz_vec_scalar_divexact_ui :: Ptr CFmpz -> Ptr CFmpz -> CULong -> CULong -> IO ()
-- | /_fmpz_vec_scalar_fdiv_q_fmpz/ /vec1/ /vec2/ /len2/ /c/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ divided by \(c\), rounding down
-- towards minus infinity whenever the division is not exact.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_fdiv_q_fmpz"
_fmpz_vec_scalar_fdiv_q_fmpz :: Ptr CFmpz -> Ptr CFmpz -> CLong -> Ptr CFmpz -> IO ()
-- | /_fmpz_vec_scalar_fdiv_q_si/ /vec1/ /vec2/ /len2/ /c/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ divided by \(c\), rounding down
-- towards minus infinity whenever the division is not exact.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_fdiv_q_si"
_fmpz_vec_scalar_fdiv_q_si :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CLong -> IO ()
-- | /_fmpz_vec_scalar_fdiv_q_ui/ /vec1/ /vec2/ /len2/ /c/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ divided by \(c\), rounding down
-- towards minus infinity whenever the division is not exact.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_fdiv_q_ui"
_fmpz_vec_scalar_fdiv_q_ui :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CULong -> IO ()
-- | /_fmpz_vec_scalar_fdiv_q_2exp/ /vec1/ /vec2/ /len2/ /exp/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ divided by @2^exp@, rounding down
-- towards minus infinity whenever the division is not exact.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_fdiv_q_2exp"
_fmpz_vec_scalar_fdiv_q_2exp :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CULong -> IO ()
-- | /_fmpz_vec_scalar_fdiv_r_2exp/ /vec1/ /vec2/ /len2/ /exp/
--
-- Sets @(vec1, len2)@ to the remainder of @(vec2, len2)@ divided by
-- @2^exp@, rounding down the quotient towards minus infinity whenever the
-- division is not exact.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_fdiv_r_2exp"
_fmpz_vec_scalar_fdiv_r_2exp :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CULong -> IO ()
-- | /_fmpz_vec_scalar_tdiv_q_fmpz/ /vec1/ /vec2/ /len2/ /c/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ divided by \(c\), rounding towards
-- zero whenever the division is not exact.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_tdiv_q_fmpz"
_fmpz_vec_scalar_tdiv_q_fmpz :: Ptr CFmpz -> Ptr CFmpz -> CLong -> Ptr CFmpz -> IO ()
-- | /_fmpz_vec_scalar_tdiv_q_si/ /vec1/ /vec2/ /len2/ /c/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ divided by \(c\), rounding towards
-- zero whenever the division is not exact.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_tdiv_q_si"
_fmpz_vec_scalar_tdiv_q_si :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CLong -> IO ()
-- | /_fmpz_vec_scalar_tdiv_q_ui/ /vec1/ /vec2/ /len2/ /c/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ divided by \(c\), rounding towards
-- zero whenever the division is not exact.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_tdiv_q_ui"
_fmpz_vec_scalar_tdiv_q_ui :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CULong -> IO ()
-- | /_fmpz_vec_scalar_tdiv_q_2exp/ /vec1/ /vec2/ /len2/ /exp/
--
-- Sets @(vec1, len2)@ to @(vec2, len2)@ divided by @2^exp@, rounding down
-- towards zero whenever the division is not exact.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_tdiv_q_2exp"
_fmpz_vec_scalar_tdiv_q_2exp :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CULong -> IO ()
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_addmul_si"
_fmpz_vec_scalar_addmul_si :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CLong -> IO ()
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_addmul_ui"
_fmpz_vec_scalar_addmul_ui :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CULong -> IO ()
-- | /_fmpz_vec_scalar_addmul_fmpz/ /vec1/ /vec2/ /len2/ /c/
--
-- Adds @(vec2, len2)@ times \(c\) to @(vec1, len2)@.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_addmul_fmpz"
_fmpz_vec_scalar_addmul_fmpz :: Ptr CFmpz -> Ptr CFmpz -> CLong -> Ptr CFmpz -> IO ()
-- | /_fmpz_vec_scalar_addmul_si_2exp/ /vec1/ /vec2/ /len2/ /c/ /exp/
--
-- Adds @(vec2, len2)@ times @c * 2^exp@ to @(vec1, len2)@, where \(c\) is
-- a @slong@.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_addmul_si_2exp"
_fmpz_vec_scalar_addmul_si_2exp :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CLong -> CULong -> IO ()
-- | /_fmpz_vec_scalar_submul_fmpz/ /vec1/ /vec2/ /len2/ /x/
--
-- Subtracts @(vec2, len2)@ times \(c\) from @(vec1, len2)@, where \(c\) is
-- a @fmpz_t@.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_submul_fmpz"
_fmpz_vec_scalar_submul_fmpz :: Ptr CFmpz -> Ptr CFmpz -> CLong -> Ptr CFmpz -> IO ()
-- | /_fmpz_vec_scalar_submul_si/ /vec1/ /vec2/ /len2/ /c/
--
-- Subtracts @(vec2, len2)@ times \(c\) from @(vec1, len2)@, where \(c\) is
-- a @slong@.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_submul_si"
_fmpz_vec_scalar_submul_si :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CLong -> IO ()
-- | /_fmpz_vec_scalar_submul_si_2exp/ /vec1/ /vec2/ /len2/ /c/ /e/
--
-- Subtracts @(vec2, len2)@ times \(c \times 2^e\) from @(vec1, len2)@,
-- where \(c\) is a @slong@.
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_submul_si_2exp"
_fmpz_vec_scalar_submul_si_2exp :: Ptr CFmpz -> Ptr CFmpz -> CLong -> CLong -> CULong -> IO ()
-- Sums and products -----------------------------------------------------------
-- | /_fmpz_vec_sum/ /res/ /vec/ /len/
--
-- Sets @res@ to the sum of the entries in @(vec, len)@. Aliasing of @res@
-- with the entries in @vec@ is not permitted.
foreign import ccall "fmpz_vec.h _fmpz_vec_sum"
_fmpz_vec_sum :: Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- | /_fmpz_vec_prod/ /res/ /vec/ /len/
--
-- Sets @res@ to the product of the entries in @(vec, len)@. Aliasing of
-- @res@ with the entries in @vec@ is not permitted. Uses binary splitting.
foreign import ccall "fmpz_vec.h _fmpz_vec_prod"
_fmpz_vec_prod :: Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- Reduction mod \(p\) ---------------------------------------------------------
-- | /_fmpz_vec_scalar_mod_fmpz/ /res/ /vec/ /len/ /p/
--
-- Reduces all entries in @(vec, len)@ modulo \(p > 0\).
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_mod_fmpz"
_fmpz_vec_scalar_mod_fmpz :: Ptr CFmpz -> Ptr CFmpz -> CLong -> Ptr CFmpz -> IO ()
-- | /_fmpz_vec_scalar_smod_fmpz/ /res/ /vec/ /len/ /p/
--
-- Reduces all entries in @(vec, len)@ modulo \(p > 0\), choosing the
-- unique representative in \((-p/2, p/2]\).
foreign import ccall "fmpz_vec.h _fmpz_vec_scalar_smod_fmpz"
_fmpz_vec_scalar_smod_fmpz :: Ptr CFmpz -> Ptr CFmpz -> CLong -> Ptr CFmpz -> IO ()
-- Gaussian content ------------------------------------------------------------
-- | /_fmpz_vec_content/ /res/ /vec/ /len/
--
-- Sets @res@ to the non-negative content of the entries in @vec@. The
-- content of a zero vector, including the case when the length is zero, is
-- defined to be zero.
foreign import ccall "fmpz_vec.h _fmpz_vec_content"
_fmpz_vec_content :: Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- | /_fmpz_vec_content_chained/ /res/ /vec/ /len/ /input/
--
-- Sets @res@ to the non-negative content of @input@ and the entries in
-- @vec@. This is useful for calculating the common content of several
-- vectors.
foreign import ccall "fmpz_vec.h _fmpz_vec_content_chained"
_fmpz_vec_content_chained :: Ptr CFmpz -> Ptr CFmpz -> CLong -> Ptr CFmpz -> IO ()
-- | /_fmpz_vec_lcm/ /res/ /vec/ /len/
--
-- Sets @res@ to the nonnegative least common multiple of the entries in
-- @vec@. The least common multiple is zero if any entry in the vector is
-- zero. The least common multiple of a length zero vector is defined to be
-- one.
foreign import ccall "fmpz_vec.h _fmpz_vec_lcm"
_fmpz_vec_lcm :: Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- Dot product -----------------------------------------------------------------
-- | /_fmpz_vec_dot/ /res/ /vec1/ /vec2/ /len2/
--
-- Sets @res@ to the dot product of @(vec1, len2)@ and @(vec2, len2)@.
foreign import ccall "fmpz_vec.h _fmpz_vec_dot"
_fmpz_vec_dot :: Ptr CFmpz -> Ptr CFmpz -> Ptr CFmpz -> CLong -> IO ()
-- | /_fmpz_vec_dot_ptr/ /res/ /vec1/ /vec2/ /offset/ /len/
--
-- Sets @res@ to the dot product of @len@ values at @vec1@ and the @len@
-- values @vec2[i] + offset@ for @0 \\leq i \< len@.
foreign import ccall "fmpz_vec.h _fmpz_vec_dot_ptr"
_fmpz_vec_dot_ptr :: Ptr CFmpz -> Ptr CFmpz -> Ptr (Ptr CFmpz) -> CLong -> CLong -> IO ()