16#include "../../../include/lammp/impl/ele_mul.h"
17#include "../../../include/lammp/impl/inlines.h"
18#include "../../../include/lammp/impl/lglg.h"
19#include "../../../include/lammp/impl/longlong.h"
20#include "../../../include/lammp/impl/mparam.h"
21#include "../../../include/lammp/impl/prime_table.h"
22#include "../../../include/lammp/numth.h"
56#define mul_1(dst, rn, v) \
58 mp_limb_t _c_ = lmmp_mul_1_(dst, dst, rn, v); \
63#define div_1(dst, rn, v) \
65 mp_limb_t _dinv_ = lmmp_binvert_ulong_(v); \
66 lmmp_divexact_1_(dst, dst, rn, v, _dinv_); \
67 rn -= dst[rn - 1] == 0; \
185 rn = nPr_n - fac_n + 1;
221 for (;
i <= (
ulong)r - 4;
i += 4) {
223 d =
i * (
i + 1) * (
i + 2) * (
i + 3);
225 t = (
n -
i + 1) * (
n -
i) * (
n -
i - 1) * (
n -
i - 2);
232 for (;
i <= r; ++
i) {
283 for (;
i <= (
ulong)r - 2;
i += 2) {
285 t = (
n -
i + 1) * (
n -
i);
291 for (;
i <= r; ++
i) {
303 if (50 *
ctx.nPr_n > 89 *
ctx.fac_n) {
319 while (
cache.is_end == 0) {
mp_size_t lmmp_elem_mul_ulong_(mp_ptr dst, const ulongp limbs, mp_size_t n, mp_ptr tp)
计算limbs数组的累乘积
mp_size_t lmmp_factors_mul_ushort_(mp_ptr dst, mp_size_t rn, fac_ptr fac, ushort nfactors)
计算因子的累乘,并将结果放入dst中
mp_size_t lmmp_factors_mul_(mp_ptr dst, mp_size_t rn, fac_ptr fac, uint nfactors)
计算因子的累乘,并将结果放入dst中
#define lmmp_limb_popcnt_
static uint64_t log2_fac_ceil(uint32_t n)
计算 log2(n!)的ceil值
static uint64_t log2_fac_floor(uint32_t n)
计算 log2(n!)的floor值
#define lmmp_copy(dst, src, n)
#define lmmp_zero(dst, n)
#define lmmp_debug_assert(x)
#define lmmp_param_assert(x)
mp_limb_t lmmp_shl_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shl)
大数左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充0
#define _udiv32by32_q_preinv(q, n0, dinv)
#define ctz_shr_u64(r, x, cnt)
Copyright (C) 2026 HJimmyK(Jericho Knox)
#define ctz_shr_u32(r, x, cnt)
#define BINOMIAL_RN_BASECASE_THRESHOLD
#define ODD_FACTORIAL_SIZE
mp_size_t lmmp_odd_nCr_ushort_(mp_ptr restrict dst, mp_size_t rn, uint n, uint r)
#define mul_1(dst, rn, v)
static uint factor_size_int(mp_size_t rn, uint n)
static mp_size_t lmmp_odd_nCr_div_(mp_ptr restrict dst, mp_size_t rn, bino_choose_t *restrict ctx)
static mp_size_t lmmp_odd_nPr_product_(mp_ptr restrict dst, mp_size_t rn, uint n, uint r)
使用累乘函数计算nPr(奇数部分)
#define div_1(dst, rn, v)
mp_size_t lmmp_nCr_size_(uint n, uint r, mp_bitcnt_t *restrict bits)
Copyright (C) 2026 HJimmyK(Jericho Knox)
static ushort factor_size_short(mp_size_t rn)
static uint count_factors(fac_ptr fac, uint nfactors, uint n, uint r, uint nr, uint p)
static mp_size_t lmmp_odd_factorial_(mp_ptr restrict dst, mp_size_t rn, uint n)
mp_size_t lmmp_odd_nCr_uint_(mp_ptr restrict dst, mp_size_t rn, uint n, uint r)
mp_size_t lmmp_nCr_(mp_ptr restrict dst, mp_bitcnt_t bits, mp_size_t rn, uint n, uint r)
mp_size_t lmmp_odd_factorial_uint_(mp_ptr dst, mp_size_t rn, uint n)
计算 n! 阶乘的奇数部分
mp_size_t lmmp_pow_1_size_(mp_limb_t base, ulong exp)
计算幂次方需要的limb缓冲区长度 base ^ exp
void lmmp_divexact_(mp_ptr dst, mp_srcptr np, mp_size_t nn, mp_srcptr dp, mp_size_t dn)
精确除法([dst,nn]=[np,nn]/[dp,dn],且余数必须为0)
mp_size_t lmmp_odd_nPr_ushort_(mp_ptr dst, mp_size_t rn, ulong n, ulong r)
计算 nPr 排列数的奇数部分
mp_size_t lmmp_factorial_size_(uint n, mp_bitcnt_t *bits)
计算 n! 阶乘的 limb 缓冲区长度
mp_size_t lmmp_nPr_size_(ulong n, ulong r, mp_bitcnt_t *bits)
计算 nPr 排列数的 limb 缓冲区长度
void lmmp_prime_cache_free_(prime_cache_t *cache)
释放素数表缓存
void lmmp_prime_cache_next_(prime_cache_t *cache)
素数表缓存更新(从小到大遍历全局质数表)
static ulong lmmp_prime_size_(ulong n)
估计 n 范围内的素数数量
const ushort prime_short_table[6542]
void lmmp_prime_int_table_init_(uint n)
初始化全局素数表
ushort lmmp_prime_cnt16_(ushort n)
计算小于等于 n 的素数数量
void lmmp_prime_cache_init_(prime_cache_t *cache, uint n)
初始化素数表缓存
#define TALLOC_TYPE(n, type)
#define BALLOC_TYPE(n, type)