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.
46 {
55
56#define a0 numa
57#define a1 (numa + n)
58#define a2 (numa + 2 * n)
59#define a3 (numa + 3 * n)
60#define b0 numb
61#define b1 (numb + n)
62
63#define v0 dst
64#define v1 (dst + 2 * n)
65#define vinf (dst + 4 * n)
66#define vm1 tp
67#define v2 (tp + 2 * n + 2)
68
69#define bm1 dst
70#define am1 (dst + n)
71#define ap1 tp
72#define bp1 (tp + n + 1)
73#define ap2 ap1
74#define bp2 bp1
75#define a13 bp1
76
77
83 else
86
87
92 } else {
94 }
95 } else {
100 } else {
103 }
105 }
106
107
110 else
114
115
118
119
126
127
129
130
132
133
137 else
139
140
142
145#undef a0
146#undef a1
147#undef a2
148#undef a3
149#undef b0
150#undef b1
151
152#undef v0
153#undef v1
154#undef vinf
155#undef vm1
156#undef v2
157
158#undef bm1
159#undef am1
160#undef ap1
161#undef bp1
162#undef ap2
163#undef bp2
164#undef a13
165}
166
167typedef struct {
176
181) {
182#define numb (cache->numb)
183#define n (cache->n)
184#define s (cache->s)
185#define t (cache->t)
186#define _bp1 (cache->_bp1)
187#define _bm1 (cache->_bm1)
188#define tp (cache->tp)
189
192
193#define a0 numa
194#define a1 (numa + n)
195#define a2 (numa + 2 * n)
196#define a3 (numa + 3 * n)
197#define b0 numb
198#define b1 (numb + n)
199
200#define v0 dst
201#define v1 (dst + 2 * n)
202#define vinf (dst + 4 * n)
203#define vm1 tp
204#define v2 (tp + 2 * n + 2)
205
206#define bm1 _bm1
207#define am1 (dst + n)
208#define ap1 tp
209#define bp1 _bp1
210#define ap2 ap1
211#define bp2 (tp + n + 1)
212#define a13 (tp + n + 1)
213
214
220 else
223
229 } else {
231 }
232 } else {
238 } else {
241 }
243 }
244
245
248 else
252
253
256
257
264
265
267
268
270
271
275 else
277
278
280
283#undef a0
284#undef a1
285#undef a2
286#undef a3
287#undef b0
288#undef b1
289
290#undef v0
291#undef v1
292#undef vinf
293#undef vm1
294#undef v2
295
296#undef bm1
297#undef am1
298#undef ap1
299#undef bp1
300#undef ap2
301#undef bp2
302#undef a13
303
304#undef numb
305#undef n
306#undef s
307#undef t
308#undef _bp1
309#undef _bm1
310#undef tp
311}
312
318) {
319#define numb (cache->numb)
320#define n (cache->n)
321#define s (cache->s)
322#define t (cache->t)
323#define _bp1 (cache->_bp1)
324#define _bm1 (cache->_bm1)
325#define tp (cache->tp)
326
329
330#define a0 numa
331#define a1 (numa + n)
332#define a2 (numa + 2 * n)
333#define a3 (numa + 3 * n)
334#define b0 numb
335#define b1 (numb + n)
336
337#define v0 dst
338#define v1 (dst + 2 * n)
339#define vinf (dst + 4 * n)
340#define vm1 tp
341#define v2 (tp + 2 * n + 2)
342
343#define bm1 _bm1
344#define am1 (dst + n)
345#define ap1 tp
346#define bp1 _bp1
347#define ap2 ap1
348#define bp2 (tp + n + 1)
349#define a13 (tp + n + 1)
350
351
357 else
360
363
364
367 else
371
372
375
376
383
384
386
387
389
390
394 else
396
397
399
401
402#undef numb
403#undef n
404#undef s
405#undef t
406#undef _bp1
407#undef _bm1
408#undef tp
409}
410
417) {
422
431
437 while (2 *
na >= 5 *
nb) {
445 }
446
449 else
454}
#define lmmp_copy(dst, src, n)
#define lmmp_zero(dst, n)
const mp_limb_t * mp_srcptr
#define lmmp_param_assert(x)
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]
static int lmmp_cmp_(mp_srcptr numa, mp_srcptr numb, mp_size_t n)
大数比较函数(内联)
static mp_limb_t lmmp_add_1_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_limb_t x)
大数加单精度数静态内联函数 [dst,na]=[numa,na]+x
#define lmmp_inc(p)
大数加1宏(预期无进位)
void lmmp_mul_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
不等长大数乘法操作 [dst,na+nb] = [numa,na] * [numb,nb]
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)
mp_limb_t lmmp_add_n_sub_n_(mp_ptr dsta, mp_ptr dstb, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
同时执行n位加法和减法 ([dsta,n],[dstb,n]) = ([numa,n]+[numb,n],[numa,n]-[numb,n])
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
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]
static int lmmp_zero_q_(mp_srcptr p, mp_size_t n)
大数判零函数(内联)
#define lmmp_mul_n_(dst, numa, numb, n)
Copyright (C) 2026 HJimmyK(Jericho Knox)
static void lmmp_mul_toom42_cache_(mp_ptr restrict dst, mp_srcptr restrict numa, const toom42_cache_t *cache, int flag)
static int lmmp_mul_toom42_cache_init_(mp_ptr restrict dst, mp_srcptr restrict numa, toom42_cache_t *cache)
void lmmp_mul_toom42_unbalance_(mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t na, mp_srcptr restrict numb, mp_size_t nb)
#define SALLOC_TYPE(n, type)
void lmmp_toom_interp5_(mp_ptr dst, mp_ptr v2, mp_ptr vm1, mp_size_t n, mp_size_t spt, int vm1_neg, mp_limb_t vinf0)
Toom插值计算(5点插值),用于Toom-33和Toom-42乘法算法