Flint2-0.1.0.0: src/Data/Number/Flint/Partitions/FFI.hsc
{-|
module : Data.Number.Flint.Partitions.FFI
copyright : (c) 2022 Hartmut Monien
license : GNU GPL, version 2 or above (see LICENSE)
maintainer : hmonien@uni-bonn.de
-}
module Data.Number.Flint.Partitions.FFI (
-- * Computation of the partition function
partitions_rademacher_bound
, partitions_hrr_sum_arb
, partitions_fmpz_fmpz
, partitions_fmpz_ui
-- , partitions_fmpz_ui_using_doubles
, partitions_leading_fmpz
) where
-- Computation of the partition function ---------------------------------------
import Foreign.Ptr
import Foreign.ForeignPtr
import Foreign.C.Types
import Data.Number.Flint.Fmpz
import Data.Number.Flint.Arb.Types
import Data.Number.Flint.Acb.Types
--------------------------------------------------------------------------------
-- | /partitions_rademacher_bound/ /b/ /n/ /N/
--
-- Sets \(b\) to an upper bound for
--
-- \[M(n,N) = \frac{44 \pi^2}{225 \sqrt 3} N^{-1/2}
-- + \frac{\pi \sqrt{2}}{75} \left( \frac{N}{n-1} \right)^{1/2}
-- \sinh\left(\frac{\pi}{N} \sqrt{\frac{2n}{3}}\right).\]
--
-- This formula gives an upper bound for the truncation error in the
-- Hardy-Ramanujan-Rademacher formula when the series is taken up to the
-- term \(t(n,N)\) inclusive.
foreign import ccall "partitions.h partitions_rademacher_bound"
partitions_rademacher_bound :: Ptr CArf -> Ptr CFmpz -> CULong -> IO ()
-- | /partitions_hrr_sum_arb/ /x/ /n/ /N0/ /N/ /use_doubles/
--
-- Evaluates the partial sum \(\sum_{k=N_0}^N t(n,k)\) of the
-- Hardy-Ramanujan-Rademacher series.
--
-- If /use_doubles/ is nonzero, doubles and the system\'s standard library
-- math functions are used to evaluate the smallest terms. This
-- significantly speeds up evaluation for small \(n\) (e.g. \(n < 10^6\)),
-- and gives a small speed improvement for larger \(n\), but the result is
-- not guaranteed to be correct. In practice, the error is estimated very
-- conservatively, and unless the system\'s standard library is broken, use
-- of doubles can be considered safe. Setting /use_doubles/ to zero gives a
-- fully guaranteed bound.
foreign import ccall "partitions.h partitions_hrr_sum_arb"
partitions_hrr_sum_arb :: Ptr CArb -> Ptr CFmpz -> CLong -> CLong -> CInt -> IO ()
-- | /partitions_fmpz_fmpz/ /p/ /n/ /use_doubles/
--
-- Computes the partition function \(p(n)\) using the
-- Hardy-Ramanujan-Rademacher formula. This function computes a numerical
-- ball containing \(p(n)\) and verifies that the ball contains a unique
-- integer.
--
-- If /n/ is sufficiently large and a number of threads greater than 1 has
-- been selected with @flint_set_num_threads()@, the computation time will
-- be reduced by using two threads.
--
-- See @partitions_hrr_sum_arb@ for an explanation of the /use_doubles/
-- option.
foreign import ccall "partitions.h partitions_fmpz_fmpz"
partitions_fmpz_fmpz :: Ptr CFmpz -> Ptr CFmpz -> CInt -> IO ()
-- | /partitions_fmpz_ui/ /p/ /n/
--
-- Computes the partition function \(p(n)\) using the
-- Hardy-Ramanujan-Rademacher formula. This function computes a numerical
-- ball containing \(p(n)\) and verifies that the ball contains a unique
-- integer.
foreign import ccall "partitions.h partitions_fmpz_ui"
partitions_fmpz_ui :: Ptr CFmpz -> CULong -> IO ()
-- -- | /partitions_fmpz_ui_using_doubles/ /p/ /n/
-- --
-- -- Computes the partition function \(p(n)\), enabling the use of doubles
-- -- internally. This significantly speeds up evaluation for small \(n\)
-- -- (e.g. \(n < 10^6\)), but the error bounds are not certified (see remarks
-- -- for @partitions_hrr_sum_arb@).
-- foreign import ccall "partitions.h partitions_fmpz_ui_using_doubles"
-- partitions_fmpz_ui_using_doubles :: Ptr CFmpz -> CULong -> IO ()
-- | /partitions_leading_fmpz/ /res/ /n/ /prec/
--
-- Sets /res/ to the leading term in the Hardy-Ramanujan series for
-- \(p(n)\) (without Rademacher\'s correction of this term, which is
-- vanishingly small when \(n\) is large), that is,
-- \(\sqrt{12} (1-1/t) e^t / (24n-1)\) where \(t = \pi \sqrt{24n-1} / 6\).
foreign import ccall "partitions.h partitions_leading_fmpz"
partitions_leading_fmpz :: Ptr CArb -> Ptr CFmpz -> CLong -> IO ()