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"
24#define mul_1(dst, rn, v) \
26 mp_limb_t _c_ = lmmp_mul_1_(dst, dst, rn, v); \
35 467775, 6081075, 42567525,
36 638512875, 638512875, 10854718875, 97692469875,
37 1856156927625, 9280784638125, 194896477400625,
38 2143861251406875, 49308808782358125,
39 147926426347074375ull, 3698160658676859375ull};
130 }
else if (r <= 10) {
137 for (;
i <=
n - 3;
i += 3) {
138 t =
i * (
i + 1) * (
i + 2);
143 for (;
i <=
n; ++
i) {
159 for (;
i <=
n - 7;
i += 7) {
160 t =
i * (
i + 1) * (
i + 2) * (
i + 3) * (
i + 4) * (
i + 5) * (
i + 6);
165 for (;
i <=
n; ++
i) {
173 }
else if (
n <= 0xfff) {
182 t =
i * (
i + 1) * (
i + 2) * (
i + 3) * (
i + 4);
187 for (;
i <=
n; ++
i) {
249 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 PERMUTATION_USHORT_B_THRESHOLD
#define PERMUTATION_UINT_B_THRESHOLD
#define PERMUTATION_UINT_K_THRESHOLD
#define PERMUTATION_USHORT_K_THRESHOLD
#define ODD_FACTORIAL_SIZE
mp_size_t lmmp_nPr_size_(ulong n, ulong r, mp_bitcnt_t *restrict bits)
#define mul_1(dst, rn, v)
Copyright (C) 2026 HJimmyK(Jericho Knox)
static mp_size_t lmmp_odd_nPr_product_(mp_ptr restrict dst, mp_size_t rn, uint n, uint r)
使用累乘函数计算nPr(奇数部分)
mp_size_t lmmp_odd_nPr_ulong_(mp_ptr restrict dst, mp_size_t rn, ulong n, ulong r)
mp_size_t lmmp_odd_nPr_ushort_(mp_ptr restrict dst, mp_size_t rn, ulong n, ulong r)
mp_size_t lmmp_odd_nPr_uint_(mp_ptr restrict dst, mp_size_t rn, ulong n, ulong r)
static const ulong odd_factorial[25]
static uint count_factors(fac_ptr fac, uint nfactors, uint n, uint r, uint p)
mp_size_t lmmp_nPr_(mp_ptr restrict dst, mp_bitcnt_t bits, mp_size_t rn, ulong n, ulong r)
mp_size_t lmmp_pow_1_size_(mp_limb_t base, ulong exp)
计算幂次方需要的limb缓冲区长度 base ^ exp
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 SALLOC_TYPE(n, type)
#define TALLOC_TYPE(n, type)
#define BALLOC_TYPE(n, type)