LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
sqrt.c
浏览该文件的文档.
1/**
2 * Copyright (C) 2026 HJimmyK(Jericho Knox)
3 *
4 * This file is part of LAMMP.
5 *
6 * LAMMP is free software: you can redistribute it and/or modify it under
7 * the terms of the GNU Lesser General Public License (LGPL) as published
8 * by the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed WITHOUT ANY WARRANTY.
12 *
13 * See <https://www.gnu.org/licenses/>.
14 */
15
16#include "../../../include/lammp/impl/mparam.h"
17#include "../../../include/lammp/impl/tmp_alloc.h"
18#include "../../../include/lammp/lmmpn.h"
19
20
21// round(sqrt(2^25/(i+128+1/2)))-256
23 0xff, 0xfd, 0xfb, 0xf9, 0xf7, 0xf5, 0xf3, 0xf2, 0xf0, 0xee, 0xec, 0xea, 0xe9, 0xe7, 0xe5, 0xe4, 0xe2, 0xe0, 0xdf,
24 0xdd, 0xdb, 0xda, 0xd8, 0xd7, 0xd5, 0xd4, 0xd2, 0xd1, 0xcf, 0xce, 0xcc, 0xcb, 0xc9, 0xc8, 0xc6, 0xc5, 0xc4, 0xc2,
25 0xc1, 0xc0, 0xbe, 0xbd, 0xbc, 0xba, 0xb9, 0xb8, 0xb7, 0xb5, 0xb4, 0xb3, 0xb2, 0xb0, 0xaf, 0xae, 0xad, 0xac, 0xaa,
26 0xa9, 0xa8, 0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa0, 0x9f, 0x9e, 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98, 0x97, 0x96,
27 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8f, 0x8e, 0x8d, 0x8c, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85, 0x84,
28 0x83, 0x83, 0x82, 0x81, 0x80, 0x7f, 0x7e, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x79, 0x78, 0x77, 0x76, 0x76, 0x75,
29 0x74, 0x73, 0x72, 0x72, 0x71, 0x70, 0x6f, 0x6f, 0x6e, 0x6d, 0x6d, 0x6c, 0x6b, 0x6a, 0x6a, 0x69, 0x68, 0x68, 0x67,
30 0x66, 0x66, 0x65, 0x64, 0x64, 0x63, 0x62, 0x62, 0x61, 0x60, 0x60, 0x5f, 0x5e, 0x5e, 0x5d, 0x5c, 0x5c, 0x5b, 0x5a,
31 0x5a, 0x59, 0x59, 0x58, 0x57, 0x57, 0x56, 0x56, 0x55, 0x54, 0x54, 0x53, 0x53, 0x52, 0x52, 0x51, 0x50, 0x50, 0x4f,
32 0x4f, 0x4e, 0x4e, 0x4d, 0x4d, 0x4c, 0x4b, 0x4b, 0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47, 0x46, 0x46, 0x45,
33 0x45, 0x44, 0x44, 0x43, 0x43, 0x42, 0x42, 0x41, 0x41, 0x40, 0x40, 0x3f, 0x3f, 0x3e, 0x3e, 0x3d, 0x3d, 0x3c, 0x3c,
34 0x3b, 0x3b, 0x3a, 0x3a, 0x39, 0x39, 0x39, 0x38, 0x38, 0x37, 0x37, 0x36, 0x36, 0x35, 0x35, 0x35, 0x34, 0x34, 0x33,
35 0x33, 0x32, 0x32, 0x32, 0x31, 0x31, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2e, 0x2e, 0x2d, 0x2d, 0x2d, 0x2c, 0x2c, 0x2b,
36 0x2b, 0x2b, 0x2a, 0x2a, 0x29, 0x29, 0x29, 0x28, 0x28, 0x27, 0x27, 0x27, 0x26, 0x26, 0x26, 0x25, 0x25, 0x24, 0x24,
37 0x24, 0x23, 0x23, 0x23, 0x22, 0x22, 0x21, 0x21, 0x21, 0x20, 0x20, 0x20, 0x1f, 0x1f, 0x1f, 0x1e, 0x1e, 0x1e, 0x1d,
38 0x1d, 0x1d, 0x1c, 0x1c, 0x1b, 0x1b, 0x1b, 0x1a, 0x1a, 0x1a, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x18, 0x17, 0x17,
39 0x17, 0x16, 0x16, 0x16, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x13, 0x13, 0x13, 0x12, 0x12, 0x12, 0x12, 0x11, 0x11,
40 0x11, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b,
41 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06,
42 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01,
43 0x01, 0x01, 0x00, 0x00};
44
45
46//[dsts,1]=floor(sqrt(x)), return remainder
47// need(x>=B/4)
50 mp_limb_t v, xh = x >> 24, s, s2;
52
53 // round(sqrt(2^25/(1/2+floor(x/2^55))))
54 v = 256 + lmmp_invsqrt_table_[(x >> 55) - 128];
55
56 t = (((mp_limb_t)1 << 48) - ((x >> 32) + 1) * v * v) * v;
57 v = (v << 16) + (t >> 33);
58
59 s = v * xh;
60 s2 = (s >> 28) + 1;
61 t = (xh << 32) - s2 * s2;
62 s = s + v * (t >> 33);
63
64 // we proved that -0.616 < s/2^32 - sqrt(x) < 0
65 // so (s>>32) will be either floor(sqrt(x)), or 1 too small
66 s >>= 32;
67 x -= s * s;
68
69 if (x >= 2 * s + 1) {
70 x -= 2 * s + 1;
71 ++s;
72 }
73
74 *dsts = s;
75 return x;
76}
77
78//[dsts,1]=floor(sqrt([numa,2])), rh:[dstr,1]=remainder, return rh
79// need(numa[1]>=B/4)
82 mp_limb_t rl, s, q, al, u;
84
85 rl = lmmp_sqrt_1_(&s, numa[1]);
86 al = numa[0];
87
88 //(r:alh)/2
89 rl = rl << 31 | al >> 33;
90 q = rl / s;
91 q -= q >> 32;
92
93 u = rl - s * q;
94 s = s << 32 | q;
95 rh = u >> 31;
96 rl = (u << 33) | (al & (((mp_limb_t)1 << 33) - 1));
97
98 q *= q;
99 rh -= rl < q;
100 rl -= q;
101 if (rh < 0) {
102 rl += s;
103 rh += rl < s;
104 --s;
105 rl += s;
106 rh += rl < s;
107 }
108
109 dsts[0] = s;
110 dstr[0] = rl;
111 return rh;
112}
113
114// if(!nsh){[dsts,ns],rh:[numa,ns]}=sqrtrem([numa,2*ns]), return rh
115// else [dsts,ns]=floor(sqrt([numa,2*ns])), return 1
116// need(ns>0, numa[2*ns-1]>=B/4, 0<=nsh<LIMB_BITS)
120 lmmp_param_assert(numa[2 * ns - 1] >= LIMB_B_4);
122 if (ns == 1) {
124 } else {
125 mp_size_t lo = ns / 2, hi = ns - lo;
126 mp_limb_t qh = lmmp_sqrt_divide_(dsts + lo, numa + 2 * lo, hi, 0);
127 if (qh)
128 lmmp_sub_n_(numa + 2 * lo, numa + 2 * lo, dsts + lo, hi);
129 qh += lmmp_div_s_(dsts, numa + lo, ns, dsts + lo, hi);
130 rh = lmmp_shr_c_(dsts, dsts, lo, 1, qh << (LIMB_BITS - 1));
131 // now dsts is either correct or 1 too big,
132 // if nsh-LSBs are non-zero, subtracting 1
133 // will not affect anything after de-normalization
134 if (dsts[0] & (((mp_limb_t)1 << nsh) - 1))
135 return 1;
136 if (rh)
137 rh = lmmp_add_n_(numa + lo, numa + lo, dsts + lo, hi);
138 qh >>= 1;
139 lmmp_sqr_(numa + ns, dsts, lo);
140 mp_limb_t b = qh + lmmp_sub_n_(numa, numa, numa + ns, lo * 2);
141 if (lo == hi)
142 rh -= b;
143 else
144 rh -= lmmp_sub_1_(numa + 2 * lo, numa + 2 * lo, 1, b);
145 if (rh < 0) {
146 qh = lmmp_add_1_(dsts + lo, dsts + lo, hi, qh);
147 rh += 2 * qh + lmmp_addshl1_n_(numa, numa, dsts, ns);
148 rh -= lmmp_sub_1_(numa, numa, ns, 1);
149 qh -= lmmp_sub_1_(dsts, dsts, ns, 1);
150 }
151 }
152 return rh;
153}
154
155//[dstis,ns+1]=floor(sqrt(B^(2*ns+na)/[numa,na]))-[0|1], dstis[ns]=1
156// need(ns>=3, na>0, numa[na-1]>=B/4)
158 lmmp_param_assert(ns >= 3);
161 mp_size_t nr = ns, namax = na, mn;
163
164 do {
165 *sizp = nr;
166 nr = (nr >> 1) + 1;
167 ++sizp;
168 } while (nr > 2);
169
170 numa += na;
171 dstis += ns;
172
173 // nr=2
174 // i2=floor((B^5-1)/(1+floor(sqrt(x*B^4))))
175 mp_limb_t numa2[6], sval[3];
176 lmmp_zero(numa2, 4);
177 numa2[5] = numa[-1];
178 if (na > 1)
179 numa2[4] = numa[-2];
180 else
181 numa2[4] = 0;
183 lmmp_inc(sval);
184 for (mp_size_t i = 0; i < 5; ++i) numa2[i] = LIMB_MAX;
185 dstis[0] = lmmp_div_s_(dstis - 2, numa2, 5, sval, 3);
186
187 TEMP_DECL;
188 mp_limb_t alloc_size = na + 2 * ns + 6;
190 do {
191 na = *--sizp;
192
193 // ar = 0:[numa-nr,nr]
194 // an = 0:[numa-na,na]
195 // ir = 1:[dst-nr,nr] = floor(B^(3*nr/2)/sqrt(ar)) - [0|1]
196 // d = B^(na+2*nr)-an*ir*ir
197 // -4*B^(na+nr) < d < 4*B^(na+nr)
198
200 //mp_size_t zeros = na - naz;
201 mp_size_t nsqr, nres = naz + nr + 1;
202 mp_ptr dp = xp + 2 * nr + 1, dip = xp + nr + 1;
203 int cmod; // 1=mod b^mn-1, 0=mod b^(naz+nr+1)
204 int sign; // 1:d<0, 0:d>=0
206
207 // ir^2
208 if (2 * SQRT_NEWTON_MODM_THRESHOLD + mn >= nr * 2 + 1) {
209 cmod = 0;
210 lmmp_sqr_(xp, dstis - nr, nr + 1);
211 nsqr = 2 * nr + 1;
212 } else {
213 cmod = 1;
214 lmmp_mul_mersenne_(xp, mn, dstis - nr, nr + 1, dstis - nr, nr + 1);
215 nsqr = mn;
216 }
217
218 // ir^2*an
219 if (naz < SQRT_NEWTON_MODM_THRESHOLD || naz * 8 < nsqr || mn >= nsqr + naz) {
220 if (cmod == 0)
222 lmmp_mul_(dp, xp, nsqr, numa - naz, naz);
223 if (cmod == 1) {
224 if (lmmp_add_(dp, dp, mn, dp + mn, naz))
225 lmmp_inc(dp);
226 }
227 } else {
228 if (nsqr > mn) { // cmod==0
229 if (lmmp_add_(xp, xp, mn, xp + mn, nsqr - mn))
230 lmmp_inc(xp);
231 }
233 cmod = 1;
234 }
235
236 if (cmod == 1) {
237 // naz+nr < mn <= naz+2*nr
238 //[dp,mn] -= B^(naz+2*nr) mod (B^mn-1)
239 dp[mn] = 1;
240 lmmp_dec(dp + naz + 2 * nr - mn);
241 if (dp[mn] == 0)
242 lmmp_dec(dp);
243 }
244
245 if (dp[nres - 1] > 3) { //-d<0
246 if (cmod == 0)
247 lmmp_dec(dp); // for neg to not
248 // else (neg to not) compensate (mod transfer)
249 dp += naz;
250 lmmp_shlnot_(xp, dp + 1, nr, LIMB_BITS - 1);
251 xp[0] ^= dp[0] >> 1;
252 xp[nr] = ~dp[nr] >> 1;
253 sign = 0;
254 } else { //-d>0
255 lmmp_shr_(xp, dp + naz, nr + 1, 1);
256 if ((dp[naz] & 1) || !lmmp_zero_q_(dp, naz))
257 lmmp_inc(xp);
258 sign = 1;
259 }
260
261 lmmp_mul_n_(dip, xp, dstis - nr, nr + 1);
262
263 if (sign) {
264 if (lmmp_zero_q_(dip, 3 * nr - na)) {
265 // a limit for dec
266 dip[2 * nr + 1] = 1;
267 lmmp_dec(dip + 3 * nr - na);
268 }
269 lmmp_not_(dstis - na, dip + 3 * nr - na, na - nr);
270 lmmp_dec_1(dstis - nr, dip[2 * nr] + 1);
271 } else {
272 lmmp_copy(dstis - na, dip + 3 * nr - na, na - nr);
273 lmmp_inc_1(dstis - nr, dip[2 * nr]);
274 }
275
276 nr = na;
277 } while (sizp != sizes);
278 TEMP_FREE;
279}
280
281//[dsts,nf+na/2+1]=[floor|round](sqrt([numa,na]*B^(2*nf)))
282// need(na>0, nf>=2)
283// note: here [floor|ceiling](x) is internally this: round(x-epsilon), where 0<=epsilon<2^-31
284// so if round is equivalent to floor, ceiling will not be used
287 lmmp_param_assert(nf >= 2);
288 mp_limb_t high = numa[na - 1];
289 int nsh = lmmp_leading_zeros_(high) / 2;
290 mp_size_t ns = na / 2 + 1 + nf;
291
292 TEMP_DECL;
293 mp_limb_t alloc_size = (nsh ? na : 0) + ns + 1;
295 if (nsh) {
296 numa2 = tp;
297 lmmp_shl_(numa2, numa, na, nsh * 2);
298 tp += na;
299 } else
300 numa2 = (mp_ptr)numa;
301
303
305
306 if (ns + 1 > na)
307 lmmp_mul_(msqr, tp, ns + 1, numa2, na);
308 else
309 lmmp_mul_(msqr, numa2, na, tp, ns + 1);
310
312 if (na & 1) {
313 nsh += LIMB_BITS / 2;
314 lmmp_shr_(dsts, msqr + na, ns, nsh);
315 cceil = msqr[na] >> (nsh - 1);
316 } else {
317 if (nsh) {
318 lmmp_shr_(dsts, msqr + na + 1, ns - 1, nsh);
319 cceil = msqr[na + 1] >> (nsh - 1);
320 } else {
321 lmmp_copy(dsts, msqr + na + 1, ns - 1);
322 cceil = msqr[na] >> (LIMB_BITS - 1);
323 }
324 dsts[ns - 1] = 0;
325 }
326
327 if (cceil & 1)
328 lmmp_inc(dsts);
329
330 TEMP_FREE;
331}
332
335 lmmp_debug_assert(numa[na - 1] > 0);
336 mp_limb_t high = numa[na - 1];
337 int nsh = lmmp_leading_zeros_(high) / 2;
338 mp_size_t nl = na + 2 * nf;
339 if (nl == 1) {
341 lmmp_sqrt_1_(&srt, high << nsh * 2);
342 srt >>= nsh;
343 dsts[0] = srt;
344 if (dstr)
345 dstr[0] = high - srt * srt;
346 } else if (!dstr && nf >= 10 * na + SQRT_NEWTON_THRESHOLD) {
348 } else {
349 TEMP_DECL;
350 mp_limb_t ns = (nl + 1) / 2;
352 if (nf)
353 lmmp_zero(numa2, 2 * nf);
354 if (nsh)
355 lmmp_shl_(numa2 + 2 * ns - na, numa, na, nsh * 2);
356 else
357 lmmp_copy(numa2 + 2 * ns - na, numa, na);
358 if (nl & 1) {
359 numa2[2 * nf] = 0;
360 nsh += LIMB_BITS / 2;
361 } else {
362 dsts[ns] = 0;
363 }
365 if (nsh) {
366 if (dstr) {
367 mp_limb_t ds = dsts[0] & (((mp_limb_t)1 << nsh) - 1);
368 rh += lmmp_addmul_1_(numa2, dsts, ns, 2 * ds);
370 if (ns == 1)
371 rh -= b;
372 else
373 rh -= lmmp_sub_1_(numa2 + 1, numa2 + 1, ns - 1, b);
374 }
376 }
377 if (dstr) {
378 numa2[ns] = rh;
379 nsh *= 2;
380 if (nsh >= LIMB_BITS) {
381 nsh -= LIMB_BITS;
382 ++numa2;
383 } else
384 ++ns;
385 if (nsh)
387 else
389 }
390
391 TEMP_FREE;
392 }
393}
#define lmmp_leading_zeros_
Definition inlines.h:160
#define lmmp_mul_n_
Definition inlines.h:167
#define lmmp_sqr_
Definition inlines.h:166
mp_limb_t * mp_ptr
Definition lmmp.h:80
uint8_t mp_byte_t
Definition lmmp.h:75
#define lmmp_copy(dst, src, n)
Definition lmmp.h:367
#define lmmp_zero(dst, n)
Definition lmmp.h:369
uint64_t mp_size_t
Definition lmmp.h:77
int64_t mp_slimb_t
Definition lmmp.h:78
#define lmmp_debug_assert(x)
Definition lmmp.h:390
const mp_limb_t * mp_srcptr
Definition lmmp.h:81
#define LIMB_MAX
Definition lmmp.h:89
uint64_t mp_limb_t
Definition lmmp.h:76
#define LMMP_MIN(l, o)
Definition lmmp.h:351
#define LIMB_BITS
Definition lmmp.h:86
#define lmmp_param_assert(x)
Definition lmmp.h:401
mp_limb_t lmmp_shlnot_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shl)
左移后按位取反操作 [dst,na] = ~([numa,na] << shl),dst的低shl位填充1
mp_limb_t lmmp_div_s_(mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
除法运算
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_shr_c_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr, mp_limb_t c)
带进位的大数右移操作 [dst,na] = [numa,na]>>shr,dst的高shr位填充c的高shr位
Definition shr.c:40
#define lmmp_dec(p)
大数减1宏(预期无借位)
Definition lmmpn.h:965
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
Definition lmmpn.h:1103
#define lmmp_inc(p)
大数加1宏(预期无进位)
Definition lmmpn.h:938
mp_limb_t lmmp_shr_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr)
大数右移操作 [dst,na] = [numa,na]>>shr,dst的高shr位填充0
Definition shr.c:19
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)
Definition shl.c:66
mp_size_t lmmp_fft_next_size_(mp_size_t n)
计算满足 >=n 的最小费马/梅森乘法可行尺寸
Definition mul_fft.c:95
mp_limb_t lmmp_shl_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shl)
大数左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充0
Definition shl.c:19
mp_limb_t lmmp_addmul_1_(mp_ptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t b)
大数乘以单limb并累加操作 [numa,n] += [numb,n] * b
#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
void lmmp_not_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
大数按位取反操作 [dst,na] = ~[numa,na] (对每个limb执行按位非操作)
mp_limb_t lmmp_submul_1_(mp_ptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t b)
大数乘以单limb并累减操作 [numa,n] -= [numb,n] * b
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
#define lmmp_inc_1(p, inc)
大数加指定值宏(预期无进位)
Definition lmmpn.h:950
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
static int lmmp_zero_q_(mp_srcptr p, mp_size_t n)
大数判零函数(内联)
Definition lmmpn.h:1019
#define s2
#define LIMB_B_4
Definition mparam.h:159
#define SQRT_NEWTON_MODM_THRESHOLD
Definition mparam.h:43
#define SQRT_NEWTON_THRESHOLD
Definition mparam.h:41
#define t
#define tp
#define s
#define n
#define lo
static mp_limb_t lmmp_sqrt_2_(mp_ptr dsts, mp_ptr dstr, mp_srcptr numa)
Definition sqrt.c:80
static mp_limb_t lmmp_sqrt_divide_(mp_ptr dsts, mp_ptr numa, mp_size_t ns, int nsh)
Definition sqrt.c:117
static const mp_byte_t lmmp_invsqrt_table_[]
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition sqrt.c:22
static mp_limb_t lmmp_sqrt_1_(mp_ptr dsts, mp_limb_t x)
Definition sqrt.c:48
static void lmmp_invsqrt_newton_(mp_ptr dstis, mp_size_t ns, mp_srcptr numa, mp_size_t na)
Definition sqrt.c:157
static void lmmp_sqrt_newton_(mp_ptr dsts, mp_srcptr numa, mp_size_t na, mp_size_t nf)
Definition sqrt.c:285
void lmmp_sqrt_(mp_ptr dsts, mp_ptr dstr, mp_srcptr numa, mp_size_t na, mp_size_t nf)
大数平方根和取余操作
Definition sqrt.c:333
#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