7#include "../../../include/lammp/impl/ele_mul.h"
8#include "../../../include/lammp/impl/mparam.h"
9#include "../../../include/lammp/impl/prime_table.h"
10#include "../../../include/lammp/impl/longlong.h"
12#define mul_1(dst, rn, v) \
13 dst[rn] = lmmp_mul_1_(dst, dst, rn, v); \
15 rn -= dst[rn - 1] == 0 ? 1 : 0
19 467775, 6081075, 42567525,
20 638512875, 638512875, 10854718875, 97692469875,
21 1856156927625, 9280784638125, 194896477400625,
22 2143861251406875, 49308808782358125,
23 147926426347074375ull, 3698160658676859375ull};
30 double ln_perm = lgamma(n + 1.0) - lgamma(n - r + 1.0);
31 double log2_perm = ln_perm /
LOG2_;
55 fac[nfactors++].
j = e;
69 for (
ulong i = n - r + 1; i <= n; ++i) {
100 }
else if (r <= 10) {
107 for (; i <= (
ulong)n - 3; i += 3) {
108 t = i * (i + 1) * (i + 2);
113 for (; i <= n; ++i) {
129 for (; i <= (
ulong)n - 7; i += 7) {
130 t = i * (i + 1) * (i + 2) * (i + 3) * (i + 4) * (i + 5) * (i + 6);
135 for (; i <= n; ++i) {
143 }
else if (n <= 0xfff) {
151 for (; i <= (
ulong)n - 5; i += 5) {
152 t = i * (i + 1) * (i + 2) * (i + 3) * (i + 4);
157 for (; i <= n; ++i) {
174 uint nfactors = primen;
178 for (
uint i = 1; i < primen; ++i) {
198 for (
ulong i = n - r + 1; i <= n; ++i) {
216 while(cache.
is_end == 0) {
218 for (
uint i = 0; i < cache.
size; ++i) {
238 for (
ulong i = 1; i <= r; ++i) {
268 dst[shw + rn] =
lmmp_shl_(dst + shw, dst + shw, rn, bits);
270 rn -= dst[rn - 1] == 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_(mp_ptr dst, mp_size_t rn, fac_ptr fac, uint nfactors)
计算因子的累乘,并将结果放入dst中
#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
int lmmp_limb_popcnt_(mp_limb_t x)
计算一个64位无符号整数中1的个数
#define ctz_shl(r, x, cnt)
#define _udiv32by32_q_preinv(q, n0, dinv)
#define PERMUTATION_UINT_TIMES_THRESHOLD
#define DBL_2POW_MANT_DIG_
#define ODD_FACTORIAL_SIZE
#define PERMUTATION_USHORT_TIMES_THRESHOLD
mp_size_t lmmp_nPr_size_(ulong n, ulong r, mp_bitcnt_t *restrict bits)
#define mul_1(dst, rn, v)
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)
static 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)
释放素数表缓存
ulong lmmp_prime_size_(ulong n)
估计 n 范围内的素数数量
void lmmp_prime_cache_next_(prime_cache_t *cache)
素数表缓存更新(从小到大遍历全局质数表)
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)