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

浏览源代码.

函数

static void lmmp_invsqrt_newton_ (mp_ptr dstis, mp_size_t ns, mp_srcptr numa, mp_size_t na)
 
void lmmp_sqrt_ (mp_ptr dsts, mp_ptr dstr, mp_srcptr numa, mp_size_t na, mp_size_t nf)
 大数平方根和取余操作
 
static mp_limb_t lmmp_sqrt_1_ (mp_ptr dsts, mp_limb_t x)
 
static mp_limb_t lmmp_sqrt_2_ (mp_ptr dsts, mp_ptr dstr, mp_srcptr numa)
 
static mp_limb_t lmmp_sqrt_divide_ (mp_ptr dsts, mp_ptr numa, mp_size_t ns, int nsh)
 
static void lmmp_sqrt_newton_ (mp_ptr dsts, mp_srcptr numa, mp_size_t na, mp_size_t nf)
 

变量

static const mp_byte_t lmmp_invsqrt_table_ []
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 

函数说明

◆ lmmp_invsqrt_newton_()

static void lmmp_invsqrt_newton_ ( mp_ptr  dstis,
mp_size_t  ns,
mp_srcptr  numa,
mp_size_t  na 
)
static

在文件 sqrt.c157 行定义.

157 {
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}
#define lmmp_mul_n_
Definition inlines.h:167
#define lmmp_sqr_
Definition inlines.h:166
mp_limb_t * mp_ptr
Definition lmmp.h:80
#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
#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
#define lmmp_dec(p)
大数减1宏(预期无借位)
Definition lmmpn.h:965
#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_size_t lmmp_fft_next_size_(mp_size_t n)
计算满足 >=n 的最小费马/梅森乘法可行尺寸
Definition mul_fft.c:95
#define lmmp_dec_1(p, dec)
大数减指定值宏(预期无借位)
Definition lmmpn.h:977
void lmmp_not_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
大数按位取反操作 [dst,na] = ~[numa,na] (对每个limb执行按位非操作)
#define lmmp_inc_1(p, inc)
大数加指定值宏(预期无进位)
Definition lmmpn.h:950
static int lmmp_zero_q_(mp_srcptr p, mp_size_t n)
大数判零函数(内联)
Definition lmmpn.h:1019
#define LIMB_B_4
Definition mparam.h:159
#define SQRT_NEWTON_MODM_THRESHOLD
Definition mparam.h:43
#define n
static mp_limb_t lmmp_sqrt_divide_(mp_ptr dsts, mp_ptr numa, mp_size_t ns, int nsh)
Definition sqrt.c:117
#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

引用了 LIMB_B_4, LIMB_BITS, LIMB_MAX, lmmp_add_(), lmmp_copy, lmmp_dec, lmmp_dec_1, lmmp_div_s_(), lmmp_fft_next_size_(), lmmp_inc, lmmp_inc_1, LMMP_MIN, lmmp_mul_(), lmmp_mul_mersenne_(), lmmp_mul_n_, lmmp_not_(), lmmp_param_assert, lmmp_shlnot_(), lmmp_shr_(), lmmp_sqr_, lmmp_sqrt_divide_(), lmmp_zero, lmmp_zero_q_(), n, SQRT_NEWTON_MODM_THRESHOLD, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.

被这些函数引用 lmmp_sqrt_newton_().

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

◆ lmmp_sqrt_()

void lmmp_sqrt_ ( mp_ptr  dsts,
mp_ptr  dstr,
mp_srcptr  numa,
mp_size_t  na,
mp_size_t  nf 
)

大数平方根和取余操作

注解
如果dstr不为NULL: [dsts,nf+na/2+1], [dstr,nf+na/2+1] = sqrtrem([numa,na]*B^(2*nf)) 也即 [numa,na] × B^(2×nf) = [dsts,nf+na/2+1]^2 + [dstr,nf+na/2+1] 且 0 <= [dstr,nf+na/2+1] < 2 * [dsts,nf+na/2+1] + 1 如果dstr为NULL: [dsts,nf+na/2+1] = [round|floor](sqrt([numa,na]*B^(2*nf)))
警告
na>0, numa[na-1]!=0, eqsep(dsts,numa), eqsep(dstr,numa)
参数
dsts平方根结果输出指针
dstr余数结果输出指针(NULL表示不计算余数)
numa源操作数指针
na操作数的 limb 长度
nf精度因子

在文件 sqrt.c333 行定义.

333 {
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_debug_assert(x)
Definition lmmp.h:390
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
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_submul_1_(mp_ptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t b)
大数乘以单limb并累减操作 [numa,n] -= [numb,n] * b
#define SQRT_NEWTON_THRESHOLD
Definition mparam.h:41
static mp_limb_t lmmp_sqrt_1_(mp_ptr dsts, mp_limb_t x)
Definition sqrt.c:48
static void lmmp_sqrt_newton_(mp_ptr dsts, mp_srcptr numa, mp_size_t na, mp_size_t nf)
Definition sqrt.c:285

引用了 LIMB_BITS, lmmp_addmul_1_(), lmmp_copy, lmmp_debug_assert, lmmp_leading_zeros_, lmmp_shl_(), lmmp_shr_(), lmmp_sqrt_1_(), lmmp_sqrt_divide_(), lmmp_sqrt_newton_(), lmmp_sub_1_(), lmmp_submul_1_(), lmmp_zero, n, SQRT_NEWTON_THRESHOLD, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.

+ 函数调用图:

◆ lmmp_sqrt_1_()

static mp_limb_t lmmp_sqrt_1_ ( mp_ptr  dsts,
mp_limb_t  x 
)
static

在文件 sqrt.c48 行定义.

48 {
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}
int64_t mp_slimb_t
Definition lmmp.h:78
#define s2
#define t
#define s
static const mp_byte_t lmmp_invsqrt_table_[]
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition sqrt.c:22

引用了 LIMB_B_4, lmmp_invsqrt_table_, lmmp_param_assert, n, s, s2 , 以及 t.

被这些函数引用 lmmp_sqrt_() , 以及 lmmp_sqrt_2_().

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

◆ lmmp_sqrt_2_()

static mp_limb_t lmmp_sqrt_2_ ( mp_ptr  dsts,
mp_ptr  dstr,
mp_srcptr  numa 
)
static

在文件 sqrt.c80 行定义.

80 {
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}

引用了 LIMB_B_4, lmmp_param_assert, lmmp_sqrt_1_(), n , 以及 s.

被这些函数引用 lmmp_sqrt_divide_().

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

◆ lmmp_sqrt_divide_()

static mp_limb_t lmmp_sqrt_divide_ ( mp_ptr  dsts,
mp_ptr  numa,
mp_size_t  ns,
int  nsh 
)
static

在文件 sqrt.c117 行定义.

117 {
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}
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
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
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_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_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 lo
static mp_limb_t lmmp_sqrt_2_(mp_ptr dsts, mp_ptr dstr, mp_srcptr numa)
Definition sqrt.c:80

引用了 LIMB_B_4, LIMB_BITS, lmmp_add_1_(), lmmp_add_n_(), lmmp_addshl1_n_(), lmmp_div_s_(), lmmp_param_assert, lmmp_shr_c_(), lmmp_sqr_, lmmp_sqrt_2_(), lmmp_sqrt_divide_(), lmmp_sub_1_(), lmmp_sub_n_(), lo , 以及 n.

被这些函数引用 lmmp_invsqrt_newton_(), lmmp_sqrt_() , 以及 lmmp_sqrt_divide_().

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

◆ lmmp_sqrt_newton_()

static void lmmp_sqrt_newton_ ( mp_ptr  dsts,
mp_srcptr  numa,
mp_size_t  na,
mp_size_t  nf 
)
static

在文件 sqrt.c285 行定义.

285 {
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}
#define tp
static void lmmp_invsqrt_newton_(mp_ptr dstis, mp_size_t ns, mp_srcptr numa, mp_size_t na)
Definition sqrt.c:157

引用了 LIMB_BITS, lmmp_copy, lmmp_inc, lmmp_invsqrt_newton_(), lmmp_leading_zeros_, lmmp_mul_(), lmmp_param_assert, lmmp_shl_(), lmmp_shr_(), n, TALLOC_TYPE, TEMP_DECL, TEMP_FREE , 以及 tp.

被这些函数引用 lmmp_sqrt_().

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

变量说明

◆ lmmp_invsqrt_table_

const mp_byte_t lmmp_invsqrt_table_[]
static
初始值:
= {
0xff, 0xfd, 0xfb, 0xf9, 0xf7, 0xf5, 0xf3, 0xf2, 0xf0, 0xee, 0xec, 0xea, 0xe9, 0xe7, 0xe5, 0xe4, 0xe2, 0xe0, 0xdf,
0xdd, 0xdb, 0xda, 0xd8, 0xd7, 0xd5, 0xd4, 0xd2, 0xd1, 0xcf, 0xce, 0xcc, 0xcb, 0xc9, 0xc8, 0xc6, 0xc5, 0xc4, 0xc2,
0xc1, 0xc0, 0xbe, 0xbd, 0xbc, 0xba, 0xb9, 0xb8, 0xb7, 0xb5, 0xb4, 0xb3, 0xb2, 0xb0, 0xaf, 0xae, 0xad, 0xac, 0xaa,
0xa9, 0xa8, 0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa0, 0x9f, 0x9e, 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98, 0x97, 0x96,
0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8f, 0x8e, 0x8d, 0x8c, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85, 0x84,
0x83, 0x83, 0x82, 0x81, 0x80, 0x7f, 0x7e, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x79, 0x78, 0x77, 0x76, 0x76, 0x75,
0x74, 0x73, 0x72, 0x72, 0x71, 0x70, 0x6f, 0x6f, 0x6e, 0x6d, 0x6d, 0x6c, 0x6b, 0x6a, 0x6a, 0x69, 0x68, 0x68, 0x67,
0x66, 0x66, 0x65, 0x64, 0x64, 0x63, 0x62, 0x62, 0x61, 0x60, 0x60, 0x5f, 0x5e, 0x5e, 0x5d, 0x5c, 0x5c, 0x5b, 0x5a,
0x5a, 0x59, 0x59, 0x58, 0x57, 0x57, 0x56, 0x56, 0x55, 0x54, 0x54, 0x53, 0x53, 0x52, 0x52, 0x51, 0x50, 0x50, 0x4f,
0x4f, 0x4e, 0x4e, 0x4d, 0x4d, 0x4c, 0x4b, 0x4b, 0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47, 0x46, 0x46, 0x45,
0x45, 0x44, 0x44, 0x43, 0x43, 0x42, 0x42, 0x41, 0x41, 0x40, 0x40, 0x3f, 0x3f, 0x3e, 0x3e, 0x3d, 0x3d, 0x3c, 0x3c,
0x3b, 0x3b, 0x3a, 0x3a, 0x39, 0x39, 0x39, 0x38, 0x38, 0x37, 0x37, 0x36, 0x36, 0x35, 0x35, 0x35, 0x34, 0x34, 0x33,
0x33, 0x32, 0x32, 0x32, 0x31, 0x31, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2e, 0x2e, 0x2d, 0x2d, 0x2d, 0x2c, 0x2c, 0x2b,
0x2b, 0x2b, 0x2a, 0x2a, 0x29, 0x29, 0x29, 0x28, 0x28, 0x27, 0x27, 0x27, 0x26, 0x26, 0x26, 0x25, 0x25, 0x24, 0x24,
0x24, 0x23, 0x23, 0x23, 0x22, 0x22, 0x21, 0x21, 0x21, 0x20, 0x20, 0x20, 0x1f, 0x1f, 0x1f, 0x1e, 0x1e, 0x1e, 0x1d,
0x1d, 0x1d, 0x1c, 0x1c, 0x1b, 0x1b, 0x1b, 0x1a, 0x1a, 0x1a, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x18, 0x17, 0x17,
0x17, 0x16, 0x16, 0x16, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x13, 0x13, 0x13, 0x12, 0x12, 0x12, 0x12, 0x11, 0x11,
0x11, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b,
0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06,
0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01,
0x01, 0x01, 0x00, 0x00}

Copyright (C) 2026 HJimmyK(Jericho Knox)

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

在文件 sqrt.c22 行定义.

22 {
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};

被这些函数引用 lmmp_sqrt_1_().