40# ifndef MODULAR_COMBINATORICS_H
41# define MODULAR_COMBINATORICS_H
73 <<
"ModularCombinatorics: modulus " <<
mod_ <<
" must be prime";
82 for (
size_t i = 1; i <=
max_n; i++)
87 for (
size_t i =
max_n; i > 0; i--)
106 <<
"ModularCombinatorics::nCk: n=" << n <<
" exceeds precomputed range "
130 if (
k == 0)
return 1;
135 if (
ki >
ni)
return 0;
Exception handling system with formatted messages for Aleph-w.
#define ah_out_of_range_error_if(C)
Throws std::out_of_range if condition holds.
#define ah_invalid_argument_if(C)
Throws std::invalid_argument if condition holds.
Simple dynamic array with automatic resizing and functional operations.
constexpr size_t size() const noexcept
Return the number of elements stored in the stack.
T & append(const T &data)
Append a copy of data
void reserve(size_t cap)
Reserves cap cells into the array.
void putn(const size_t n)
Reserve n additional logical slots in the array without value-initializing them.
Combinatorics operations modulo a prime.
Array< uint64_t > fact_
Precomputed factorials.
Array< uint64_t > invFact_
Precomputed inverse factorials.
uint64_t lucas_nCk(const uint64_t n, const uint64_t k) const
Calculate nCk modulo p using Lucas' theorem.
ModularCombinatorics(size_t max_n, const uint64_t p)
Precomputes factorials up to 'max_n' modulo 'p'.
uint64_t mod_
Prime modulus.
uint64_t nCk(const uint64_t n, const uint64_t k) const
Calculate nCk modulo p in O(1).
Safe modular arithmetic, extended Euclidean algorithm, and Chinese Remainder Theorem.
Main namespace for Aleph-w library functions.
uint64_t mod_inv(const uint64_t a, const uint64_t m)
Modular Inverse.
Divide_Conquer_DP_Result< Cost > divide_and_conquer_partition_dp(const size_t groups, const size_t n, Transition_Cost_Fn transition_cost, const Cost inf=dp_optimization_detail::default_inf< Cost >())
Optimize partition DP using divide-and-conquer optimization.
bool miller_rabin(uint64_t n) noexcept
Miller-Rabin primality test for 64-bit integers.
uint64_t mod_mul(uint64_t a, uint64_t b, uint64_t m)
Safe 64-bit modular multiplication.
Advanced primality testing algorithms.
Dynamic array container with automatic resizing.