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

浏览源代码.

宏定义

#define ahi   (numa + halfn)
 
#define ahi   (numa + halfn)
 
#define alo   (numa)
 
#define alo   (numa)
 
#define k   (tp)
 
#define k   (tp)
 
#define scratch   (tp + 3 * halfn)
 
#define scratch   (tp + 3 * halfn)
 
#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)
 
void lmmp_binvert_n_dc_ (mp_ptr restrict dst, mp_srcptr restrict numa, 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)
 

宏定义说明

◆ 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/2]

#define k   (tp)

◆ k [2/2]

#define k   (tp)

◆ scratch [1/2]

#define scratch   (tp + 3 * halfn)

◆ scratch [2/2]

#define scratch   (tp + 3 * halfn)

◆ 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

在文件 binvert.c13 行定义.

13 {
15 lmmp_mul_n_(tp, xp, ap, n);
16 lmmp_copy(dst, tp + n, n);
17 } else {
18 mp_size_t m = lmmp_fft_next_size_((n * 2 + 1) >> 1);
19 lmmp_debug_assert(n * 2 > m && m >= n);
20 lmmp_mul_mersenne_(tp, m, xp, n, ap, n);
21 lmmp_dec(tp);
22 mp_size_t fn = m - n; // 从 tp+n 开始的长度
23 mp_size_t sn = n - fn; // 从 tp 开始的长度
24 lmmp_copy(dst, tp + n, fn);
25 lmmp_copy(dst + fn, tp, sn);
26 }
27}
#define lmmp_copy(dst, src, n)
Definition lmmp.h:364
uint64_t mp_size_t
Definition lmmp.h:212
#define lmmp_debug_assert(x)
Definition lmmp.h:387
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:752
#define lmmp_dec(p)
大数减1宏(预期无借位)
Definition lmmpn.h:973
void lmmp_mul_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
等长大数乘法操作 [dst,2*n] = [numa,n] * [numb,n]
Definition mul.c:99
mp_size_t lmmp_fft_next_size_(mp_size_t n)
计算满足 >=n 的最小费马/梅森乘法可行尺寸
Definition mul_fft.c:84
#define BINVERT_MULHI_MERSENNE_THRESHOLD
Definition mparam.h:130
#define tp

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

被这些函数引用 lmmp_binvert_n_dc_().

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

◆ 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.c91 行定义.

91 {
92 lmmp_param_assert(dst != NULL && tp != NULL);
93 lmmp_param_assert(numa != NULL && n > 0);
94 lmmp_param_assert(numa[0] % 2 == 1);
95 if (n == 1) {
96 dst[0] = lmmp_binvert_ulong_(numa[0]);
97 } else if (n == 2) {
98 lmmp_binvert_2_(dst, numa);
99 } else if (n == 3) {
100 lmmp_binvert_3_(dst, numa);
101 } else if (n == 4) {
102 lmmp_binvert_4_(dst, numa);
103 } else if (n % 2 == 0) {
104 mp_size_t halfn = n / 2;
105
106#define k (tp) // [tp, halfn]
107#define alo (numa) // [numa, halfn]
108#define ahi (numa + halfn) // [numa+halfn, halfn]
109#define xlo (dst) // [dst, halfn]
110#define xhi (dst + halfn) // [dst+halfn, halfn]
111#define xlo_sqr (tp + halfn) // [tp+halfn, halfn]
112#define xlo_sqr_mul_ahi (tp + 2 * halfn) // [tp+2*halfn, halfn]
113#define scratch (tp + 3 * halfn) // [tp+3*halfn,2*halfn]
114// ________________________________________________________________
115// tp : |_________________________5*(n+1)/2____________________________|
116// | k | xlo_sqr | xlo_sqr_mul_ahi | scratch | remaining |
117// |_halfn_|__halfn__|______halfn______|___2*halfn___| |
118
119 lmmp_binvert_n_dc_(xlo, alo, halfn, tp);
120 binvert_mulhi_(k, xlo, alo, halfn, tp + halfn);
123 lmmp_mullo_n_(xhi, xlo, k, halfn, scratch);
125 lmmp_not_(xhi, xhi, halfn);
126 lmmp_inc(xhi);
127 } else {
128 mp_size_t halfn = n / 2 + 1;
129 mp_size_t ahin = n - halfn;
130
131#define k (tp) // [tp, halfn]
132#define alo (numa) // [numa, halfn]
133#define ahi (numa + halfn) // [numa+halfn, ahin]
134#define xlo (dst) // [dst, halfn]
135#define xhi (dst + halfn) // [dst+halfn, ahin]
136#define xlo_sqr (tp + halfn) // [tp+halfn, ahin]
137#define xlo_sqr_mul_ahi (tp + 2 * halfn) // [tp+2*halfn, ahin]
138#define scratch (tp + 3 * halfn) // [tp+3*halfn, 2*ahin]
139// ________________________________________________________________
140// tp : |_________________________5*(n+1)/2____________________________|
141// | k | xlo_sqr | xlo_sqr_mul_ahi | scratch | remaining |
142// |__halfn__|__halfn__|______halfn______|___2*ahin___| |
143
144 lmmp_binvert_n_dc_(xlo, alo, halfn, tp);
145 binvert_mulhi_(k, xlo, alo, halfn, tp + halfn);
148 lmmp_mullo_n_(xhi, xlo, k, ahin, scratch);
150 lmmp_not_(xhi, xhi, ahin);
151 lmmp_inc(xhi);
152 }
153}
#define k
#define ahi
void lmmp_binvert_n_dc_(mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t n, mp_ptr restrict tp)
Definition binvert.c:91
#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)
Definition binvert.c:13
#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:29
#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:42
#define lmmp_param_assert(x)
Definition lmmp.h:398
#define lmmp_inc(p)
大数加1宏(预期无进位)
Definition lmmpn.h:946
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:71
ulong lmmp_binvert_ulong_(ulong a)
计算 a 在2^64下的逆元
Definition binvert_1.c:33
void lmmp_binvert_2_(mp_ptr dst, mp_srcptr numa)
计算 [numa,2] 在B^2下的逆元
Definition binvert_1.c:47
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_(), scratch, tp, xhi, xlo, xlo_sqr , 以及 xlo_sqr_mul_ahi.

被这些函数引用 lmmp_binvert_n_dc_().

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

◆ 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.c42 行定义.

48 {
49 if (n < MULLO_DC_THRESHOLD) {
50 lmmp_mullo_dc_(dst, numa, numb, tp, n);
51 } else {
52 lmmp_mullo_fft_(dst, numa, numb, n, tp);
53 }
54}
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:11
#define MULLO_DC_THRESHOLD
Definition mparam.h:59

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

被这些函数引用 lmmp_binvert_n_dc_().

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

◆ 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.c29 行定义.

34 {
35 if (n < MULLO_DC_THRESHOLD) {
36 lmmp_sqrlo_dc_(dst, numa, tp, n);
37 } else {
38 lmmp_mullo_fft_(dst, numa, numa, n, tp);
39 }
40}
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 , 以及 tp.

被这些函数引用 lmmp_binvert_n_dc_().

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