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

211 {
212 lmmp_param_assert(n > 0);
213 if (n < MULLO_DC_THRESHOLD) {
214 if (numa == numb) {
215 TEMP_DECL;
218 TEMP_FREE;
219 return;
220 }
221 TEMP_DECL;
224 TEMP_FREE;
225 return;
226 } else {
227 TEMP_DECL;
230 TEMP_FREE;
231 return;
232 }
233}
mp_limb_t * mp_ptr
Definition lmmp.h:117
uint64_t mp_limb_t
Definition lmmp.h:113
#define lmmp_param_assert(x)
Definition lmmp.h:496
#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:173
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:158
#define TALLOC_TYPE(n, type)
Definition tmp_alloc.h:156

引用了 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 {
128 return;
129 } else {
130 mp_size_t m, t;
131 if (n < MUL_TOOM33_THRESHOLD) {
132 m = 25 * n / 36;
133 } else if (n < MUL_TOOM44_THRESHOLD) {
134 m = 31 * n / 40;
135 } else if (n < MUL_TOOM66_THRESHOLD) {
136 m = 32 * n / 39;
137 } else if (n < MUL_TOOM88_THRESHOLD) {
138 m = 27 * n / 31;
139 } else {
140 m = 9 * n / 10;
141 }
142 t = n - m;
143 lmmp_debug_assert(2 * n > 4 * t);
144
145#define a0 (numa) // [numa, m]
146#define a1 (numa + m) // [numa+m, t]
147#define b0 (numb) // [numb, m]
148#define b1 (numb + m) // [numb+m, t]
149#define c0 (dst) // [dst, m]
150#define c1 (dst + m) // [dst+m, t]
151#define lo1 (tp) // [tp, t]
152#define lo2 (tp + t) // [tp+t, t]
153#define scratch (tp + 2 * t) // [tp+2*t, 2*t]
154 lmmp_mul_n_(tp, a0, b0, m);
155 lmmp_copy(c0, tp, n);
158 lmmp_add_n_(c1, c1, lo1, t);
159 lmmp_add_n_(c1, c1, lo2, t);
160 return;
161 }
162#undef a0
163#undef a1
164#undef b0
165#undef b1
166#undef c0
167#undef c1
168#undef lo1
169#undef lo2
170#undef scratch
171}
#define lmmp_mul_n_
Definition inlines.h:167
#define lmmp_copy(dst, src, n)
Definition lmmp.h:461
uint64_t mp_size_t
Definition lmmp.h:114
#define lmmp_debug_assert(x)
Definition lmmp.h:485
void lmmp_mullo_basecase_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
基础低位乘法 [dst,n] = [numa,n] * [numb,n] mod B^n
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_n_, lmmp_mullo_basecase_(), 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:118
void lmmp_free(void *ptr)
内存释放函数(调用lmmp_heap_free_fn)
Definition memory.c:423
#define lmmp_assert(x)
Definition lmmp.h:468
#define LIMB_BITS
Definition lmmp.h:123
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:1013
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:901
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:1027
#define lmmp_dec_1(p, dec)
减指定值宏(预期无借位)
Definition lmmpn.h:940
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:1077
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:182

引用了 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_mullo_n_(), lmmp_sqrlo_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.c173 行定义.

173 {
176 return;
177 } else {
178 mp_size_t m, t;
179 if (n < MUL_TOOM33_THRESHOLD) {
180 m = 25 * n / 36;
181 } else if (n < MUL_TOOM44_THRESHOLD) {
182 m = 31 * n / 40;
183 } else if (n < MUL_TOOM66_THRESHOLD) {
184 m = 32 * n / 39;
185 } else if (n < MUL_TOOM88_THRESHOLD) {
186 m = 27 * n / 31;
187 } else {
188 m = 9 * n / 10;
189 }
190 t = n - m;
191
192#define a0 (numa)
193#define a1 (numa + m)
194#define c0 (dst)
195#define c1 (dst + m)
196#define lo (tp) // [tp, t]
197#define scratch (tp + t) // [tp+t, 2*t]
198 lmmp_sqr_(tp, a0, m);
199 lmmp_copy(c0, tp, n);
202 }
203#undef a0
204#undef a1
205#undef c0
206#undef c1
207#undef lo
208#undef scratch
209}
#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_addshl1_n_(), lmmp_copy, lmmp_mullo_basecase_(), 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_().

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