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

浏览源代码.

宏定义

#define a_binvert   (tp)
 
#define ahi   (numa + halfn)
 
#define ahi   (numa + halfn)
 
#define alo   (numa)
 
#define alo   (numa)
 
#define k   (tp)
 
#define k   (tp)
 
#define k   (tp + 1 * na)
 
#define scratch   (tp + 3 * halfn)
 
#define scratch   (tp + 3 * halfn)
 
#define scratch   (tp + 2 * na)
 
#define xhi   (dst + halfn)
 
#define xhi   (dst + halfn)
 
#define xlo   (dst)
 
#define xlo   (dst)
 
#define xlo_sqr   (tp + halfn)
 
#define xlo_sqr   (tp + halfn)
 
#define xlo_sqr_mul_ahi   (tp + 2 * halfn)
 
#define xlo_sqr_mul_ahi   (tp + 2 * halfn)
 

函数

static void binvert_mulhi_ (mp_ptr dst, mp_srcptr xp, mp_srcptr ap, mp_size_t n, mp_ptr tp)
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 
void lmmp_binvert_ (mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t na, mp_size_t n)
 
void lmmp_binvert_n_dc_ (mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t n, mp_ptr restrict tp)
 
void lmmp_binvert_unbalanced_ (mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t na, mp_size_t n, mp_ptr restrict tp)
 
static void lmmp_mullo_n_ (mp_ptr restrict dst, mp_srcptr restrict numa, mp_srcptr restrict numb, mp_size_t n, mp_ptr restrict tp)
 
static void lmmp_sqrlo_n_ (mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t n, mp_ptr restrict tp)
 

宏定义说明

◆ a_binvert

#define a_binvert   (tp)

◆ ahi [1/2]

#define ahi   (numa + halfn)

◆ ahi [2/2]

#define ahi   (numa + halfn)

◆ alo [1/2]

#define alo   (numa)

◆ alo [2/2]

#define alo   (numa)

◆ k [1/3]

#define k   (tp)

◆ k [2/3]

#define k   (tp)

◆ k [3/3]

#define k   (tp + 1 * na)

◆ scratch [1/3]

#define scratch   (tp + 3 * halfn)

◆ scratch [2/3]

#define scratch   (tp + 3 * halfn)

◆ scratch [3/3]

#define scratch   (tp + 2 * na)

◆ xhi [1/2]

#define xhi   (dst + halfn)

◆ xhi [2/2]

#define xhi   (dst + halfn)

◆ xlo [1/2]

#define xlo   (dst)

◆ xlo [2/2]

#define xlo   (dst)

◆ xlo_sqr [1/2]

#define xlo_sqr   (tp + halfn)

◆ xlo_sqr [2/2]

#define xlo_sqr   (tp + halfn)

◆ xlo_sqr_mul_ahi [1/2]

#define xlo_sqr_mul_ahi   (tp + 2 * halfn)

◆ xlo_sqr_mul_ahi [2/2]

#define xlo_sqr_mul_ahi   (tp + 2 * halfn)

函数说明

◆ binvert_mulhi_()

static void binvert_mulhi_ ( mp_ptr  dst,
mp_srcptr  xp,
mp_srcptr  ap,
mp_size_t  n,
mp_ptr  tp 
)
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/.

计算 [dst,n] = [xp,n]*[ap,n] div B^n

参数
dst结果指针
tpscratch space, need 2*n limbs
警告
[xp,n] * [ap,n] mod B^n == 1

在文件 binvert.c28 行定义.

28 {
30 lmmp_mul_n_(tp, xp, ap, n);
31 lmmp_copy(dst, tp + n, n);
32 } else {
33 mp_size_t m = lmmp_fft_next_size_((n * 2 + 1) >> 1);
34 lmmp_debug_assert(n * 2 > m && m >= n);
36 lmmp_dec(tp);
37 mp_size_t fn = m - n; // 从 tp+n 开始的长度
38 mp_size_t sn = n - fn; // 从 tp 开始的长度
39 lmmp_copy(dst, tp + n, fn);
40 lmmp_copy(dst + fn, tp, sn);
41 }
42}
#define lmmp_mul_n_
Definition inlines.h:167
#define lmmp_copy(dst, src, n)
Definition lmmp.h:367
uint64_t mp_size_t
Definition lmmp.h:77
#define lmmp_debug_assert(x)
Definition lmmp.h:390
void lmmp_mul_mersenne_(mp_ptr dst, mp_size_t rn, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
梅森数模乘法 [dst,rn] = [numa,na]*[numb,nb] mod B^rn-1
Definition mul_fft.c:761
#define lmmp_dec(p)
大数减1宏(预期无借位)
Definition lmmpn.h:965
mp_size_t lmmp_fft_next_size_(mp_size_t n)
计算满足 >=n 的最小费马/梅森乘法可行尺寸
Definition mul_fft.c:95
#define MULHI_MERSENNE_THRESHOLD
Definition mparam.h:121
#define tp
#define n

引用了 lmmp_copy, lmmp_debug_assert, lmmp_dec, lmmp_fft_next_size_(), lmmp_mul_mersenne_(), lmmp_mul_n_, MULHI_MERSENNE_THRESHOLD, n , 以及 tp.

被这些函数引用 lmmp_binvert_n_dc_() , 以及 lmmp_binvert_unbalanced_().

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

◆ lmmp_binvert_()

void lmmp_binvert_ ( mp_ptr restrict  dst,
mp_srcptr restrict  numa,
mp_size_t  na,
mp_size_t  n 
)

在文件 binvert.c218 行定义.

218 {
220 lmmp_param_assert(na > 0 && n > 0);
221 lmmp_param_assert(numa[0] % 2 == 1);
222 TEMP_DECL;
223 if (n == na) {
224 mp_ptr restrict tp = ALLOC_TYPE(5 * (n + 1) / 2, mp_limb_t);
226 } else if (na == 1) {
228 } else if (na == 2) {
230 } else if (4 * n >= 5 * na) {
231 // n/na >= 5/4 这是一个比较简单的调优结果
232 mp_ptr restrict tp = ALLOC_TYPE((9 * n + 5) / 2, mp_limb_t);
234 } else {
236 mp_ptr restrict tp = ALLOC_TYPE((5 * n + 5) / 2, mp_limb_t);
237 lmmp_copy(ap, numa, n);
238 lmmp_zero(ap + na, n - na);
240 }
241 TEMP_FREE;
242}
void lmmp_binvert_unbalanced_(mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t na, mp_size_t n, mp_ptr restrict tp)
Definition binvert.c:178
void lmmp_binvert_n_dc_(mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t n, mp_ptr restrict tp)
Definition binvert.c:106
mp_limb_t * mp_ptr
Definition lmmp.h:80
#define lmmp_zero(dst, n)
Definition lmmp.h:369
uint64_t mp_limb_t
Definition lmmp.h:76
#define lmmp_param_assert(x)
Definition lmmp.h:401
void lmmp_binvert_unbalanced_1_(mp_ptr dst, mp_limb_t a, mp_size_t n)
计算 a 在 B^n 下的逆元
void lmmp_binvert_unbalanced_2_(mp_ptr dst, mp_srcptr numa, mp_size_t n)
计算 [numa,2] 在 B^n 下的逆元
#define TEMP_DECL
Definition tmp_alloc.h:131
#define ALLOC_TYPE(n, type)
Definition tmp_alloc.h:173
#define TEMP_FREE
Definition tmp_alloc.h:150

引用了 ALLOC_TYPE, lmmp_binvert_n_dc_(), lmmp_binvert_unbalanced_(), lmmp_binvert_unbalanced_1_(), lmmp_binvert_unbalanced_2_(), lmmp_copy, lmmp_param_assert, lmmp_zero, n, TEMP_DECL, TEMP_FREE , 以及 tp.

+ 函数调用图:

◆ lmmp_binvert_n_dc_()

void lmmp_binvert_n_dc_ ( mp_ptr restrict  dst,
mp_srcptr restrict  numa,
mp_size_t  n,
mp_ptr restrict  tp 
)

在文件 binvert.c106 行定义.

106 {
107 lmmp_param_assert(dst != NULL && tp != NULL);
108 lmmp_param_assert(numa != NULL && n > 0);
109 lmmp_param_assert(numa[0] % 2 == 1);
110 if (n == 1) {
112 } else if (n == 2) {
114 } else if (n == 3) {
116 } else if (n == 4) {
118 } else if (n % 2 == 0) {
119 mp_size_t halfn = n / 2;
120
121#define k (tp) // [tp, halfn]
122#define alo (numa) // [numa, halfn]
123#define ahi (numa + halfn) // [numa+halfn, halfn]
124#define xlo (dst) // [dst, halfn]
125#define xhi (dst + halfn) // [dst+halfn, halfn]
126#define xlo_sqr (tp + halfn) // [tp+halfn, halfn]
127#define xlo_sqr_mul_ahi (tp + 2 * halfn) // [tp+2*halfn, halfn]
128#define scratch (tp + 3 * halfn) // [tp+3*halfn,2*halfn]
129// ________________________________________________________________
130// tp : |_________________________5*(n+1)/2____________________________|
131// | k | xlo_sqr | xlo_sqr_mul_ahi | scratch | remaining |
132// |_halfn_|__halfn__|______halfn______|___2*halfn___| |
133
141 lmmp_inc(xhi);
142 } else {
143 mp_size_t halfn = n / 2 + 1;
144 mp_size_t ahin = n - halfn;
145
146#define k (tp) // [tp, halfn]
147#define alo (numa) // [numa, halfn]
148#define ahi (numa + halfn) // [numa+halfn, ahin]
149#define xlo (dst) // [dst, halfn]
150#define xhi (dst + halfn) // [dst+halfn, ahin]
151#define xlo_sqr (tp + halfn) // [tp+halfn, ahin]
152#define xlo_sqr_mul_ahi (tp + 2 * halfn) // [tp+2*halfn, ahin]
153#define scratch (tp + 3 * halfn) // [tp+3*halfn, 2*ahin]
154// ________________________________________________________________
155// tp : |_________________________5*(n+1)/2____________________________|
156// | k | xlo_sqr | xlo_sqr_mul_ahi | scratch | remaining |
157// |__halfn__|__halfn__|______halfn______|___2*ahin___| |
158
166 lmmp_inc(xhi);
167 }
168#undef k
169#undef alo
170#undef ahi
171#undef xlo
172#undef xhi
173#undef xlo_sqr
174#undef xlo_sqr_mul_ahi
175#undef scratch
176}
#define k
#define ahi
#define xlo_sqr_mul_ahi
#define xlo_sqr
static void binvert_mulhi_(mp_ptr dst, mp_srcptr xp, mp_srcptr ap, mp_size_t n, mp_ptr tp)
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition binvert.c:28
#define xhi
#define scratch
#define alo
static void lmmp_sqrlo_n_(mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t n, mp_ptr restrict tp)
Definition binvert.c:44
#define xlo
static void lmmp_mullo_n_(mp_ptr restrict dst, mp_srcptr restrict numa, mp_srcptr restrict numb, mp_size_t n, mp_ptr restrict tp)
Definition binvert.c:57
#define lmmp_inc(p)
大数加1宏(预期无进位)
Definition lmmpn.h:938
void lmmp_not_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
大数按位取反操作 [dst,na] = ~[numa,na] (对每个limb执行按位非操作)
mp_limb_t lmmp_add_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
无进位的n位加法 [dst,n] = [numa,n] + [numb,n]
Definition add_n.c:81
ulong lmmp_binvert_ulong_(ulong a)
计算 a 在2^64下的逆元
Definition binvert_1.c:42
void lmmp_binvert_2_(mp_ptr dst, mp_srcptr numa)
计算 [numa,2] 在 B^2 下的逆元
Definition binvert_1.c:56
void lmmp_binvert_3_(mp_ptr dst, mp_srcptr numa)
计算 [numa,3] 在 B^3 下的逆元
void lmmp_binvert_4_(mp_ptr dst, mp_srcptr numa)
计算 [numa,4] 在 B^4 下的逆元

引用了 ahi, alo, binvert_mulhi_(), k, lmmp_add_n_(), lmmp_binvert_2_(), lmmp_binvert_3_(), lmmp_binvert_4_(), lmmp_binvert_n_dc_(), lmmp_binvert_ulong_(), lmmp_inc, lmmp_mullo_n_(), lmmp_not_(), lmmp_param_assert, lmmp_sqrlo_n_(), n, scratch, tp, xhi, xlo, xlo_sqr , 以及 xlo_sqr_mul_ahi.

被这些函数引用 lmmp_binvert_(), lmmp_binvert_n_dc_() , 以及 lmmp_binvert_unbalanced_().

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

◆ lmmp_binvert_unbalanced_()

void lmmp_binvert_unbalanced_ ( mp_ptr restrict  dst,
mp_srcptr restrict  numa,
mp_size_t  na,
mp_size_t  n,
mp_ptr restrict  tp 
)

在文件 binvert.c178 行定义.

178 {
179 lmmp_param_assert(dst != NULL && numa != NULL && tp != NULL);
180 lmmp_param_assert(numa[0] % 2 == 1);
181 lmmp_param_assert(n > na && na > 0);
182
183#define a_binvert (tp) // [tp, na]
184#define k (tp + 1 * na) // [tp+na, na]
185#define scratch (tp + 2 * na) // [tp+2*na, 5*(na+1)/2]
186
190
191 // a_binvert 低位不可能为0,故加一不会进位
194 a_binvert[0] += 1;
195
196 mp_size_t i = na;
197 for (; i < n - na; i += na) {
199 /*
200 FIXME: 这里的循环中,第二个乘数numa,始终保持不变
201 在拥有可以惰性初始化的FFT算法的情况下,可以节省numa的正变换
202 在循环的情况下,这将会有可观的性能提升
203 */
205 // now [scratch,2*na] = a * p
206 if (lmmp_add_n_(scratch, scratch, k, na)) {
208 }
209 lmmp_copy(k, scratch + na, na);
210 }
211
213#undef a_binvert
214#undef k
215#undef scratch
216}
#define a_binvert

引用了 a_binvert, binvert_mulhi_(), k, lmmp_add_n_(), lmmp_binvert_n_dc_(), lmmp_copy, lmmp_debug_assert, lmmp_inc, lmmp_mul_n_, lmmp_mullo_n_(), lmmp_not_(), lmmp_param_assert, n, scratch , 以及 tp.

被这些函数引用 lmmp_binvert_().

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

◆ lmmp_mullo_n_()

static void lmmp_mullo_n_ ( mp_ptr restrict  dst,
mp_srcptr restrict  numa,
mp_srcptr restrict  numb,
mp_size_t  n,
mp_ptr restrict  tp 
)
inlinestatic

在文件 binvert.c57 行定义.

63 {
64 if (n < MULLO_DC_THRESHOLD) {
66 } else {
68 }
69}
void lmmp_mullo_dc_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_ptr tp, mp_size_t n)
低位乘法 [dst,n] = [numa,n] * [numb,n] mod B^n
void lmmp_mullo_fft_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_ptr scratch)
低位FFT乘法 [dst,n] = [numa,n] * [numb,n] mod B^n
Definition mullo.c:22
#define MULLO_DC_THRESHOLD
Definition mparam.h:59
#define numb

引用了 lmmp_mullo_dc_(), lmmp_mullo_fft_(), MULLO_DC_THRESHOLD, n, numb , 以及 tp.

被这些函数引用 lmmp_binvert_n_dc_() , 以及 lmmp_binvert_unbalanced_().

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

◆ lmmp_sqrlo_n_()

static void lmmp_sqrlo_n_ ( mp_ptr restrict  dst,
mp_srcptr restrict  numa,
mp_size_t  n,
mp_ptr restrict  tp 
)
inlinestatic

在文件 binvert.c44 行定义.

49 {
50 if (n < MULLO_DC_THRESHOLD) {
52 } else {
54 }
55}
void lmmp_sqrlo_dc_(mp_ptr dst, mp_srcptr numa, mp_ptr tp, mp_size_t n)
低位平方 [dst,n] = [numa,n]^2 mod B^n

引用了 lmmp_mullo_fft_(), lmmp_sqrlo_dc_(), MULLO_DC_THRESHOLD, n , 以及 tp.

被这些函数引用 lmmp_binvert_n_dc_().

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