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

浏览源代码.

宏定义

#define a0   (numa)
 
#define a0   (numa)
 
#define a1   (numa + m)
 
#define a1   (numa + m)
 
#define b0   (numb)
 
#define b1   (numb + m)
 
#define c0   (dst)
 
#define c0   (dst)
 
#define c1   (dst + m)
 
#define c1   (dst + m)
 
#define lo   (tp)
 
#define lo1   (tp)
 
#define lo2   (tp + t)
 
#define MUL_TOOM66_THRESHOLD   MUL_FFT_THRESHOLD
 
#define MUL_TOOM88_THRESHOLD   5621
 
#define scratch   (tp + 2 * t)
 
#define scratch   (tp + t)
 

函数

void lmmp_mullo_ (mp_ptr restrict dst, mp_srcptr restrict numa, mp_srcptr restrict numb, mp_size_t n)
 
void lmmp_mullo_dc_ (mp_ptr restrict dst, mp_srcptr restrict numa, mp_srcptr restrict numb, mp_ptr restrict tp, mp_size_t n)
 
void lmmp_mullo_fft_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_ptr scratch)
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 
void lmmp_sqrlo_dc_ (mp_ptr restrict dst, mp_srcptr restrict numa, mp_ptr restrict tp, mp_size_t n)
 

宏定义说明

◆ a0 [1/2]

#define a0   (numa)

◆ a0 [2/2]

#define a0   (numa)

◆ a1 [1/2]

#define a1   (numa + m)

◆ a1 [2/2]

#define a1   (numa + m)

◆ b0

#define b0   (numb)

◆ b1

#define b1   (numb + m)

◆ c0 [1/2]

#define c0   (dst)

◆ c0 [2/2]

#define c0   (dst)

◆ c1 [1/2]

#define c1   (dst + m)

◆ c1 [2/2]

#define c1   (dst + m)

◆ lo

#define lo   (tp)

◆ lo1

#define lo1   (tp)

◆ lo2

#define lo2   (tp + t)

◆ MUL_TOOM66_THRESHOLD

#define MUL_TOOM66_THRESHOLD   MUL_FFT_THRESHOLD

在文件 mullo.c116 行定义.

◆ MUL_TOOM88_THRESHOLD

#define MUL_TOOM88_THRESHOLD   5621

在文件 mullo.c117 行定义.

◆ scratch [1/2]

#define scratch   (tp + 2 * t)

◆ scratch [2/2]

#define scratch   (tp + t)

函数说明

◆ lmmp_mullo_()

void lmmp_mullo_ ( mp_ptr restrict  dst,
mp_srcptr restrict  numa,
mp_srcptr restrict  numb,
mp_size_t  n 
)

在文件 mullo.c219 行定义.

219 {
220 lmmp_param_assert(n > 0);
221 if (n < MULLO_DC_THRESHOLD) {
222 if (numa == numb) {
223 TEMP_DECL;
226 TEMP_FREE;
227 return;
228 }
229 TEMP_DECL;
232 TEMP_FREE;
233 return;
234 } else {
235 TEMP_DECL;
238 TEMP_FREE;
239 return;
240 }
241}
mp_limb_t * mp_ptr
Definition lmmp.h:80
uint64_t mp_limb_t
Definition lmmp.h:76
#define lmmp_param_assert(x)
Definition lmmp.h:401
#define MULLO_DC_THRESHOLD
Definition mparam.h:59
#define numb
#define tp
#define n
void lmmp_mullo_dc_(mp_ptr restrict dst, mp_srcptr restrict numa, mp_srcptr restrict numb, mp_ptr restrict tp, mp_size_t n)
Definition mullo.c:119
void lmmp_sqrlo_dc_(mp_ptr restrict dst, mp_srcptr restrict numa, mp_ptr restrict tp, mp_size_t n)
Definition mullo.c:177
void lmmp_mullo_fft_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_ptr scratch)
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition mullo.c:22
#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

引用了 lmmp_mullo_dc_(), lmmp_mullo_fft_(), lmmp_param_assert, lmmp_sqrlo_dc_(), MULLO_DC_THRESHOLD, n, numb, TALLOC_TYPE, TEMP_DECL, TEMP_FREE , 以及 tp.

+ 函数调用图:

◆ lmmp_mullo_dc_()

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

在文件 mullo.c119 行定义.

125 {
127 lmmp_mul_1_(dst, numa, n, numb[0]);
128 for (mp_size_t i = 1; i < n; ++i) {
129 lmmp_mul_1_(tp, numa, n - i, numb[i]);
130 lmmp_add_n_(dst + i, dst + i, tp, n - i);
131 }
132 return;
133 } else {
134 mp_size_t m, t;
135 if (n < MUL_TOOM33_THRESHOLD) {
136 m = 25 * n / 36;
137 } else if (n < MUL_TOOM44_THRESHOLD) {
138 m = 31 * n / 40;
139 } else if (n < MUL_TOOM66_THRESHOLD) {
140 m = 32 * n / 39;
141 } else if (n < MUL_TOOM88_THRESHOLD) {
142 m = 27 * n / 31;
143 } else {
144 m = 9 * n / 10;
145 }
146 t = n - m;
147 lmmp_debug_assert(2 * n > 4 * t);
148
149#define a0 (numa) // [numa, m]
150#define a1 (numa + m) // [numa+m, t]
151#define b0 (numb) // [numb, m]
152#define b1 (numb + m) // [numb+m, t]
153#define c0 (dst) // [dst, m]
154#define c1 (dst + m) // [dst+m, t]
155#define lo1 (tp) // [tp, t]
156#define lo2 (tp + t) // [tp+t, t]
157#define scratch (tp + 2 * t) // [tp+2*t, 2*t]
158 lmmp_mul_n_(tp, a0, b0, m);
159 lmmp_copy(c0, tp, n);
162 lmmp_add_n_(c1, c1, lo1, t);
163 lmmp_add_n_(c1, c1, lo2, t);
164 return;
165 }
166#undef a0
167#undef a1
168#undef b0
169#undef b1
170#undef c0
171#undef c1
172#undef lo1
173#undef lo2
174#undef scratch
175}
#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
mp_limb_t lmmp_mul_1_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_limb_t x)
大数乘以单limb操作 [dst,na] = [numa,na] * x
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
#define MULLO_BASECASE_THRESHOLD
Definition mparam.h:57
#define MUL_TOOM33_THRESHOLD
Definition mparam.h:50
#define MUL_TOOM44_THRESHOLD
Definition mparam.h:52
#define t
#define lo2
#define b0
#define MUL_TOOM66_THRESHOLD
Definition mullo.c:116
#define b1
#define scratch
#define c1
#define a0
#define a1
#define c0
#define MUL_TOOM88_THRESHOLD
Definition mullo.c:117
#define lo1

引用了 a0, a1, b0, b1, c0, c1, lmmp_add_n_(), lmmp_copy, lmmp_debug_assert, lmmp_mul_1_(), lmmp_mul_n_, lmmp_mullo_dc_(), lo1, lo2, MUL_TOOM33_THRESHOLD, MUL_TOOM44_THRESHOLD, MUL_TOOM66_THRESHOLD, MUL_TOOM88_THRESHOLD, MULLO_BASECASE_THRESHOLD, n, numb, scratch, t , 以及 tp.

被这些函数引用 lmmp_mullo_(), lmmp_mullo_dc_() , 以及 lmmp_sqrlo_dc_().

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

◆ lmmp_mullo_fft_()

void lmmp_mullo_fft_ ( mp_ptr  dst,
mp_srcptr  numa,
mp_srcptr  numb,
mp_size_t  n,
mp_ptr  scratch 
)

Copyright (C) 2026 HJimmyK(Jericho Knox)

低位FFT乘法 [dst,n] = [numa,n] * [numb,n] mod B^n

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/.

在文件 mullo.c22 行定义.

22 {
24 mp_size_t hn = lmmp_fft_next_size_((n + n + 1) >> 1);
25 lmmp_assert(n + n > hn);
27
29 mp_size_t nam = n;
30 if (n > hn) {
31 /*
32 Z = B^hb - 1
33 amodm = a mod Z
34 */
35 if (lmmp_add_(scratch, numa, hn, numa + hn, n - hn))
37 amodm = scratch;
38 nam = hn;
39 }
41
43 mp_size_t nap = n;
44 if (n > hn) {
45 /*
46 Z = B^hp - 1
47 amodp = a mod Z
48 */
49 tp[hn] = 0;
50 if (lmmp_sub_(tp, numa, hn, numa + hn, n - hn))
51 lmmp_inc(tp);
52 amodp = tp;
53 nap = hn + 1;
54 }
56
58 cy <<= LIMB_BITS - 1;
59 scratch[hn - 1] += cy;
60 if (scratch[hn - 1] < cy)
62
63 if (n == hn) {
65 // cy==1 means [tp,hn+1]!=0, then [dst,hn]!=0
66 // cy==2 is impossible since [tp,hn+1] is normalized.
67 // so the following dec won't overflow.
69 } else {
70 mp_size_t n2 = 2 * n;
72 cy = tp[hn] + lmmp_sub_nc_(tp + n2 - hn, scratch + n2 - hn, tp + n2 - hn, 2 * hn - n2, cy);
74 }
77}
const mp_limb_t * mp_srcptr
Definition lmmp.h:81
void lmmp_free(void *ptr)
内存释放函数(调用lmmp_heap_free_fn)
Definition memory.c:202
#define lmmp_assert(x)
Definition lmmp.h:373
#define LIMB_BITS
Definition lmmp.h:86
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
static mp_limb_t lmmp_add_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
大数加法静态内联函数 [dst,na]=[numa,na]+[numb,nb]
Definition lmmpn.h:1050
mp_limb_t lmmp_shr1add_nc_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c)
带进位加法后右移1位 [dst,n] = ([numa,n] + [numb,n] + c) >> 1
Definition shr.c:89
#define lmmp_inc(p)
大数加1宏(预期无进位)
Definition lmmpn.h:938
void lmmp_mul_fermat_(mp_ptr dst, mp_size_t rn, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
费马数模乘法 [dst,rn+1]=[numa,na]*[numb,nb] mod B^rn+1
Definition mul_fft.c:687
mp_size_t lmmp_fft_next_size_(mp_size_t n)
计算满足 >=n 的最小费马/梅森乘法可行尺寸
Definition mul_fft.c:95
static mp_limb_t lmmp_sub_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
大数减法静态内联函数 [dst,na]=[numa,na]-[numb,nb]
Definition lmmpn.h:1064
#define lmmp_dec_1(p, dec)
大数减指定值宏(预期无借位)
Definition lmmpn.h:977
static mp_limb_t lmmp_sub_1_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_limb_t x)
大数减单精度数静态内联函数 [dst,na]=[numa,na]-x
Definition lmmpn.h:1114
mp_limb_t lmmp_sub_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
无借位的n位减法 [dst,n] = [numa,n] - [numb,n]
Definition sub_n.c:80
mp_limb_t lmmp_sub_nc_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c)
带借位的n位减法 [dst,n] = [numa,n] - [numb,n] - c
Definition sub_n.c:19
#define ALLOC_TYPE(n, type)
Definition tmp_alloc.h:173

引用了 ALLOC_TYPE, LIMB_BITS, lmmp_add_(), lmmp_assert, lmmp_copy, lmmp_dec_1, lmmp_fft_next_size_(), lmmp_free(), lmmp_inc, lmmp_mul_fermat_(), lmmp_mul_mersenne_(), lmmp_param_assert, lmmp_shr1add_nc_(), lmmp_sub_(), lmmp_sub_1_(), lmmp_sub_n_(), lmmp_sub_nc_(), n, numb, scratch , 以及 tp.

被这些函数引用 lmmp_mullo_(), lmmp_mullo_n_(), lmmp_mullo_n_() , 以及 lmmp_sqrlo_n_().

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

◆ lmmp_sqrlo_dc_()

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

在文件 mullo.c177 行定义.

177 {
179 lmmp_mul_1_(dst, numa, n, numa[0]);
180 for (mp_size_t i = 1; i < n; ++i) {
181 lmmp_mul_1_(tp, numa, n - i, numa[i]);
182 lmmp_add_n_(dst + i, dst + i, tp, n - i);
183 }
184 return;
185 } else {
186 mp_size_t m, t;
187 if (n < MUL_TOOM33_THRESHOLD) {
188 m = 25 * n / 36;
189 } else if (n < MUL_TOOM44_THRESHOLD) {
190 m = 31 * n / 40;
191 } else if (n < MUL_TOOM66_THRESHOLD) {
192 m = 32 * n / 39;
193 } else if (n < MUL_TOOM88_THRESHOLD) {
194 m = 27 * n / 31;
195 } else {
196 m = 9 * n / 10;
197 }
198 t = n - m;
199
200#define a0 (numa)
201#define a1 (numa + m)
202#define c0 (dst)
203#define c1 (dst + m)
204#define lo (tp) // [tp, t]
205#define scratch (tp + t) // [tp+t, 2*t]
206 lmmp_sqr_(tp, a0, m);
207 lmmp_copy(c0, tp, n);
210 }
211#undef a0
212#undef a1
213#undef c0
214#undef c1
215#undef lo
216#undef scratch
217}
#define lmmp_sqr_
Definition inlines.h:166
mp_limb_t lmmp_addshl1_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
加法结合左移1位操作 [dst,n] = [numa,n] + ([numb,n] << 1)
Definition shl.c:66
#define lo

引用了 a0, a1, c0, c1, lmmp_add_n_(), lmmp_addshl1_n_(), lmmp_copy, lmmp_mul_1_(), lmmp_mullo_dc_(), lmmp_sqr_, lo, MUL_TOOM33_THRESHOLD, MUL_TOOM44_THRESHOLD, MUL_TOOM66_THRESHOLD, MUL_TOOM88_THRESHOLD, MULLO_BASECASE_THRESHOLD, n, scratch, t , 以及 tp.

被这些函数引用 lmmp_mullo_().

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