LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
multinomial.c 文件参考
+ multinomial.c 的引用(Include)关系图:

浏览源代码.

宏定义

#define MULTINOMIAL_INT_LIMIT   (0xffffffff)
 
#define MULTINOMIAL_SHORT_LIMIT   (0xffff)
 

函数

static uint count_factors (fac_ptr fac, uint nfactors, uint n, const uintp r, uint m, uint p)
 
static mp_size_t fac_size_bigger (uint n)
 
static mp_size_t fac_size_lower (uint n)
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 
static uint factor_size_int (mp_size_t rn, uint n)
 
static ushort factor_size_short (mp_size_t rn)
 
mp_size_t lmmp_multinomial_ (mp_ptr restrict dst, mp_size_t rn, uint n, const uintp restrict r, uint m)
 
mp_size_t lmmp_multinomial_size_ (const uintp r, uint m, ulong *restrict n)
 
static mp_size_t lmmp_odd_multinomial_uint_ (mp_ptr restrict dst, mp_size_t rn, uint n, const uintp restrict r, uint m)
 
static mp_size_t lmmp_odd_multinomial_ushort_ (mp_ptr restrict dst, mp_size_t rn, uint n, const uintp restrict r, uint m)
 

宏定义说明

◆ MULTINOMIAL_INT_LIMIT

#define MULTINOMIAL_INT_LIMIT   (0xffffffff)

在文件 multinomial.c153 行定义.

◆ MULTINOMIAL_SHORT_LIMIT

#define MULTINOMIAL_SHORT_LIMIT   (0xffff)

在文件 multinomial.c152 行定义.

函数说明

◆ count_factors()

static uint count_factors ( fac_ptr  fac,
uint  nfactors,
uint  n,
const uintp  r,
uint  m,
uint  p 
)
inlinestatic

在文件 multinomial.c57 行定义.

57 {
58 uint pn = n;
59 uint e = 0;
60 ulong inv = MP_ULONG_MAX / p + 1;
61 while (pn > 0) {
63 e += pn;
64 }
65 for (uint i = 0; i < m; ++i) {
66 pn = r[i];
67 while (pn > 0) {
69 e -= pn;
70 }
71 }
72 if (e > 0) {
73 fac[nfactors].f = p;
74 fac[nfactors++].j = e;
75 }
76 return nfactors;
77}
#define _udiv32by32_q_preinv(q, n0, dinv)
Definition longlong.h:457
#define MP_ULONG_MAX
Definition mparam.h:137
#define n
uint32_t uint
Definition numth.h:31
uint64_t ulong
Definition numth.h:32

引用了 _udiv32by32_q_preinv, MP_ULONG_MAX , 以及 n.

被这些函数引用 lmmp_odd_multinomial_uint_() , 以及 lmmp_odd_multinomial_ushort_().

+ 这是这个函数的调用关系图:

◆ fac_size_bigger()

static mp_size_t fac_size_bigger ( uint  n)
inlinestatic

在文件 multinomial.c32 行定义.

32 {
33 if (n < 20) {
34 return 64;
35 } else {
36 return log2_fac_ceil(n);
37 }
38}
static uint64_t log2_fac_ceil(uint32_t n)
计算 log2(n!)的ceil值
Definition lglg.h:241

引用了 log2_fac_ceil() , 以及 n.

被这些函数引用 lmmp_multinomial_size_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ fac_size_lower()

static mp_size_t fac_size_lower ( uint  n)
inlinestatic

Copyright (C) 2026 HJimmyK(Jericho Knox)

This file is part of LAMMP.

LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed WITHOUT ANY WARRANTY.

See https://www.gnu.org/licenses/.

在文件 multinomial.c24 行定义.

24 {
25 if (n < 20) {
26 return 0;
27 } else {
28 return log2_fac_floor(n);
29 }
30}
static uint64_t log2_fac_floor(uint32_t n)
计算 log2(n!)的floor值
Definition lglg.h:260

引用了 log2_fac_floor() , 以及 n.

被这些函数引用 lmmp_multinomial_size_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ factor_size_int()

static uint factor_size_int ( mp_size_t  rn,
uint  n 
)
inlinestatic

在文件 multinomial.c79 行定义.

79 {
80 /*
81 使用类似组合数的思路来估计缓冲区大小。
82 */
83 ulong approx1 = rn * 8;
86 return approx1 < approx2 ? approx1 : approx2;
87}
#define lmmp_debug_assert(x)
Definition lmmp.h:390
#define MP_UINT_MAX
Definition mparam.h:136
static ulong lmmp_prime_size_(ulong n)
估计 n 范围内的素数数量
Definition prime_table.h:57

引用了 lmmp_debug_assert, lmmp_prime_size_(), MP_UINT_MAX , 以及 n.

被这些函数引用 lmmp_odd_multinomial_uint_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ factor_size_short()

static ushort factor_size_short ( mp_size_t  rn)
inlinestatic

在文件 multinomial.c89 行定义.

89 {
90 ushort approx1 = rn * 8;
92 return approx1;
93}
#define MP_USHORT_MAX
Definition mparam.h:135
uint16_t ushort
Definition numth.h:29

引用了 lmmp_debug_assert, MP_USHORT_MAX , 以及 n.

被这些函数引用 lmmp_odd_multinomial_ushort_().

+ 这是这个函数的调用关系图:

◆ lmmp_multinomial_()

mp_size_t lmmp_multinomial_ ( mp_ptr restrict  dst,
mp_size_t  rn,
uint  n,
const uintp restrict  r,
uint  m 
)

在文件 multinomial.c155 行定义.

155 {
157 for (uint j = 0; j < m; ++j) {
158 shl += lmmp_limb_popcnt_(r[j]);
159 shl -= r[j];
160 }
162 shl %= LIMB_BITS;
163 lmmp_zero(dst, shw);
164 if (n <= MULTINOMIAL_SHORT_LIMIT) {
166 } else {
168 }
169
170 if (shl > 0) {
171 dst[shw + rn] = lmmp_shl_(dst + shw, dst + shw, rn, shl);
172 rn += shw + 1;
173 rn -= dst[rn - 1] == 0 ? 1 : 0;
174 } else {
175 rn += shw;
176 }
177 return rn;
178}
#define lmmp_limb_popcnt_
Definition inlines.h:163
#define lmmp_zero(dst, n)
Definition lmmp.h:369
uint64_t mp_size_t
Definition lmmp.h:77
#define LIMB_BITS
Definition lmmp.h:86
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
Definition shl.c:19
static mp_size_t lmmp_odd_multinomial_ushort_(mp_ptr restrict dst, mp_size_t rn, uint n, const uintp restrict r, uint m)
Definition multinomial.c:95
#define MULTINOMIAL_SHORT_LIMIT
static mp_size_t lmmp_odd_multinomial_uint_(mp_ptr restrict dst, mp_size_t rn, uint n, const uintp restrict r, uint m)

引用了 LIMB_BITS, lmmp_limb_popcnt_, lmmp_odd_multinomial_uint_(), lmmp_odd_multinomial_ushort_(), lmmp_shl_(), lmmp_zero, MULTINOMIAL_SHORT_LIMIT , 以及 n.

+ 函数调用图:

◆ lmmp_multinomial_size_()

mp_size_t lmmp_multinomial_size_ ( const uintp  r,
uint  m,
ulong *restrict  n 
)

在文件 multinomial.c40 行定义.

40 {
41 ulong n_ret = 0;
42 uint i = 0;
43 for (; i < m; ++i) n_ret += r[i];
44
47 *n = n_ret;
49
50 for (i = 0; i < m; ++i) {
51 rn -= fac_size_lower(r[i]);
52 }
53 rn = (rn + LIMB_BITS - 1) / LIMB_BITS;
54 return rn + 2;
55}
#define lmmp_param_assert(x)
Definition lmmp.h:401
static mp_size_t fac_size_lower(uint n)
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition multinomial.c:24
static mp_size_t fac_size_bigger(uint n)
Definition multinomial.c:32

引用了 fac_size_bigger(), fac_size_lower(), LIMB_BITS, lmmp_param_assert, MP_UINT_MAX , 以及 n.

+ 函数调用图:

◆ lmmp_odd_multinomial_uint_()

static mp_size_t lmmp_odd_multinomial_uint_ ( mp_ptr restrict  dst,
mp_size_t  rn,
uint  n,
const uintp restrict  r,
uint  m 
)
static

在文件 multinomial.c129 行定义.

129 {
134
135 nfactors = 0;
138 while (cache.is_end == 0) {
140 for (uint i = 0; i < cache.size; ++i) {
141 nfactors = count_factors(fac, nfactors, n, r, m, cache.pp[i]);
142 }
143 }
145
147
149 return rn;
150}
mp_size_t lmmp_factors_mul_(mp_ptr dst, mp_size_t rn, fac_ptr fac, uint nfactors)
计算因子的累乘,并将结果放入dst中
static uint factor_size_int(mp_size_t rn, uint n)
Definition multinomial.c:79
static uint count_factors(fac_ptr fac, uint nfactors, uint n, const uintp r, uint m, uint p)
Definition multinomial.c:57
void lmmp_prime_cache_free_(prime_cache_t *cache)
释放素数表缓存
void lmmp_prime_cache_next_(prime_cache_t *cache)
素数表缓存更新(从小到大遍历全局质数表)
void lmmp_prime_int_table_init_(uint n)
初始化全局素数表
Definition prime_table.c:99
void lmmp_prime_cache_init_(prime_cache_t *cache, uint n)
初始化素数表缓存
#define TEMP_B_DECL
Definition tmp_alloc.h:132
#define BALLOC_TYPE(n, type)
Definition tmp_alloc.h:146
#define TEMP_B_FREE
Definition tmp_alloc.h:159

引用了 BALLOC_TYPE, count_factors(), factor_size_int(), lmmp_factors_mul_(), lmmp_prime_cache_free_(), lmmp_prime_cache_init_(), lmmp_prime_cache_next_(), lmmp_prime_int_table_init_(), n, TEMP_B_DECL , 以及 TEMP_B_FREE.

被这些函数引用 lmmp_multinomial_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ lmmp_odd_multinomial_ushort_()

static mp_size_t lmmp_odd_multinomial_ushort_ ( mp_ptr restrict  dst,
mp_size_t  rn,
uint  n,
const uintp restrict  r,
uint  m 
)
static

在文件 multinomial.c95 行定义.

101 {
102 if (n < ODD_FACTORIAL_SIZE) {
104 mp_limb_t t = 0;
105 for (uint i = 0; i < m; ++i) {
106 lmmp_odd_nPr_ushort_(&t, 1, r[i], r[i]);
107 dst[0] /= t;
108 }
109 return 1;
110 } else {
111 TEMP_DECL;
116 nfactors = 0;
117 for (ushort i = 1; i < primen; ++i) {
119 nfactors = count_factors(fac, nfactors, n, r, m, p);
120 }
121
123
124 TEMP_FREE;
125 return rn;
126 }
127}
mp_size_t lmmp_factors_mul_ushort_(mp_ptr dst, mp_size_t rn, fac_ptr fac, ushort nfactors)
计算因子的累乘,并将结果放入dst中
uint64_t mp_limb_t
Definition lmmp.h:76
#define ODD_FACTORIAL_SIZE
Definition mparam.h:149
#define t
static ushort factor_size_short(mp_size_t rn)
Definition multinomial.c:89
mp_size_t lmmp_odd_nPr_ushort_(mp_ptr dst, mp_size_t rn, ulong n, ulong r)
计算 nPr 排列数的奇数部分
const ushort prime_short_table[6542]
ushort lmmp_prime_cnt16_(ushort n)
计算小于等于 n 的素数数量
#define TEMP_DECL
Definition tmp_alloc.h:131
#define TEMP_FREE
Definition tmp_alloc.h:150
#define TALLOC_TYPE(n, type)
Definition tmp_alloc.h:148

引用了 count_factors(), factor_size_short(), lmmp_factors_mul_ushort_(), lmmp_odd_nPr_ushort_(), lmmp_prime_cnt16_(), n, ODD_FACTORIAL_SIZE, prime_short_table, t, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.

被这些函数引用 lmmp_multinomial_().

+ 函数调用图:
+ 这是这个函数的调用关系图: