LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
pow_1.c
浏览该文件的文档.
1/*
2 * LAMMP - Copyright (C) 2025-2026 HJimmyK(Jericho Knox)
3 * This file is part of lammp, under the GNU LGPL v2 license.
4 * See LICENSE in the project root for the full license text.
5 */
6
7#include "../../../include/lammp/impl/mparam.h"
8#include "../../../include/lammp/impl/tmp_alloc.h"
9#include "../../../include/lammp/lmmpn.h"
10#include "../../../include/lammp/numth.h"
11
12static mp_size_t lmmp_1pow_1_(mp_ptr restrict dst) {
13 dst[0] = 1;
14 return 1;
15}
16
17static mp_size_t lmmp_2pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp) {
18 lmmp_zero(dst, exp / LIMB_BITS);
19 dst[exp / LIMB_BITS] = (1ull << (exp % LIMB_BITS));
20 rn = exp / LIMB_BITS + 1;
21 return rn;
22}
23
24static mp_size_t lmmp_4pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp) {
25 exp <<= 1;
26 lmmp_zero(dst, exp / LIMB_BITS);
27 dst[exp / LIMB_BITS] = (1ull << (exp % LIMB_BITS));
28 rn = exp / LIMB_BITS + 1;
29 return rn;
30}
31
32static mp_size_t lmmp_8pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp) {
33 exp *= 3;
34 lmmp_zero(dst, exp / LIMB_BITS);
35 dst[exp / LIMB_BITS] = (1ull << (exp % LIMB_BITS));
36 rn = exp / LIMB_BITS + 1;
37 return rn;
38}
39
40static mp_size_t lmmp_3pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp) {
42 static const mp_limb_t tab[32] = {
43 1, 3, 9, 27, 81, 243, 729, 2187,
44 6561, 19683, 59049, 177147, 531441, 1594323, 4782969, 14348907,
45 43046721, 129140163, 387420489, 1162261467, 3486784401, 10460353203, 31381059609, 94143178827,
46 282429536481,847288609443,2541865828329,7625597484987,22876792454961,68630377364883,205891132094649,617673396283947,
47 };
48
49 mp_ptr restrict sq = TALLOC_TYPE(rn, mp_limb_t);
50 rn = 1;
51 sq[0] = 1;
52 int i = 12;
53 while ((exp & (0x1full << ((i--) * 5))) == 0);
54 for (++i; i >= 0; --i) {
55 mp_size_t p = (exp & (0x1full << (i * 5))) >> (i * 5);
56 dst[rn] = lmmp_mul_1_(dst, sq, rn, tab[p]);
57 ++rn;
58 rn -= (dst[rn - 1] == 0) ? 1 : 0;
59 if (i > 0) {
60 lmmp_sqr_(sq, dst, rn);
61 rn <<= 1;
62 rn -= (sq[rn - 1] == 0) ? 1 : 0;
63
64 lmmp_sqr_(dst, sq, rn);
65 rn <<= 1;
66 rn -= (dst[rn - 1] == 0) ? 1 : 0;
67
68 lmmp_sqr_(sq, dst, rn);
69 rn <<= 1;
70 rn -= (sq[rn - 1] == 0) ? 1 : 0;
71
72 lmmp_sqr_(dst, sq, rn);
73 rn <<= 1;
74 rn -= (dst[rn - 1] == 0) ? 1 : 0;
75
76 lmmp_sqr_(sq, dst, rn);
77 rn <<= 1;
78 rn -= (sq[rn - 1] == 0) ? 1 : 0;
79 }
80 }
82 return rn;
83}
84
85#define define_1_npow_1_(_n_) \
86 static mp_size_t lmmp_##_n_##pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp) { \
87 TEMP_DECL; \
88 static const mp_limb_t tab[16] = { \
89 1, \
90 (mp_limb_t)_n_, \
91 (mp_limb_t)_n_ * _n_, \
92 (mp_limb_t)_n_ * _n_ * _n_, \
93 (mp_limb_t)_n_ * _n_ * _n_ * _n_, \
94 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_, \
95 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
96 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
97 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
98 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
99 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
100 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
101 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
102 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
103 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
104 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_}; \
105 \
106 mp_size_t sqn = (rn + 2) >> 1; \
107 mp_ptr restrict sq = TALLOC_TYPE(sqn, mp_limb_t); \
108 rn = 1; \
109 dst[0] = 1; \
110 int i = 15; \
111 while ((exp & (0xfull << ((i--) * 4))) == 0); \
112 for (++i; i >= 0; --i) { \
113 mp_size_t p = (exp & (0xfull << (i * 4))) >> (i * 4); \
114 dst[rn] = lmmp_mul_1_(dst, dst, rn, tab[p]); \
115 ++rn; \
116 rn -= (dst[rn - 1] == 0) ? 1 : 0; \
117 if (i > 0) { \
118 lmmp_sqr_(sq, dst, rn); \
119 rn <<= 1; \
120 rn -= (sq[rn - 1] == 0) ? 1 : 0; \
121 \
122 lmmp_sqr_(dst, sq, rn); \
123 rn <<= 1; \
124 rn -= (dst[rn - 1] == 0) ? 1 : 0; \
125 \
126 lmmp_sqr_(sq, dst, rn); \
127 rn <<= 1; \
128 rn -= (sq[rn - 1] == 0) ? 1 : 0; \
129 \
130 lmmp_sqr_(dst, sq, rn); \
131 rn <<= 1; \
132 rn -= (dst[rn - 1] == 0) ? 1 : 0; \
133 } \
134 } \
135 TEMP_FREE; \
136 return rn; \
137 }
138
144
145static mp_size_t lmmp_6pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp) {
146 mp_size_t n = exp / LIMB_BITS;
147 lmmp_zero(dst, n);
148 rn = lmmp_3pow_1_(dst + n, rn - n, exp);
149 dst[n + rn] = lmmp_shl_(dst + n, dst + n, rn, exp % LIMB_BITS);
150 rn += n;
151 rn -= dst[rn - 1] == 0 ? 1 : 0;
152 return rn;
153}
154
155static mp_size_t lmmp_9pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp) {
156 TEMP_DECL;
157 mp_ptr restrict tp = TALLOC_TYPE((rn + 1) >> 1, mp_limb_t);
158 rn = lmmp_3pow_1_(tp, (rn + 1) >> 1, exp);
159 lmmp_sqr_(dst, tp, rn);
160 rn <<= 1;
161 rn -= dst[rn - 1] == 0 ? 1 : 0;
162 TEMP_FREE;
163 return rn;
164}
165
166static mp_size_t lmmp_10pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp) {
167 mp_size_t n = exp / LIMB_BITS;
168 lmmp_zero(dst, n);
169 rn = lmmp_5pow_1_(dst + n, rn - n, exp);
170 dst[n + rn] = lmmp_shl_(dst + n, dst + n, rn, exp % LIMB_BITS);
171 rn += n + 1;
172 rn -= dst[rn - 1] == 0 ? 1 : 0;
173 return rn;
174}
175
176static mp_size_t lmmp_12pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp) {
177 mp_size_t n = (2 * exp) / LIMB_BITS;
178 lmmp_zero(dst, n);
179 lmmp_assert(rn > n);
180 rn = lmmp_3pow_1_(dst + n, rn - n, exp);
181 dst[n + rn] = lmmp_shl_(dst + n, dst + n, rn, (2 * exp) % LIMB_BITS);
182 rn += n + 1;
183 rn -= dst[rn - 1] == 0 ? 1 : 0;
184 return rn;
185}
186
187static mp_size_t lmmp_14pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp) {
188 mp_size_t n = exp / LIMB_BITS;
189 lmmp_zero(dst, n);
190 rn = lmmp_7pow_1_(dst + n, rn - n, exp);
191 dst[n + rn] = lmmp_shl_(dst + n, dst + n, rn, exp % LIMB_BITS);
192 rn += n + 1;
193 rn -= dst[rn - 1] == 0 ? 1 : 0;
194 return rn;
195}
196
197mp_size_t lmmp_u4_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp) {
198 switch (base) {
199 case 1:
200 return lmmp_1pow_1_(dst);
201 case 2:
202 return lmmp_2pow_1_(dst, rn, exp);
203 case 4:
204 return lmmp_4pow_1_(dst, rn, exp);
205 case 8:
206 return lmmp_8pow_1_(dst, rn, exp);
207 case 3:
208 return lmmp_3pow_1_(dst, rn, exp);
209 case 5:
210 return lmmp_5pow_1_(dst, rn, exp);
211 case 7:
212 return lmmp_7pow_1_(dst, rn, exp);
213 case 11:
214 return lmmp_11pow_1_(dst, rn, exp);
215 case 13:
216 return lmmp_13pow_1_(dst, rn, exp);
217 case 15:
218 return lmmp_15pow_1_(dst, rn, exp);
219 case 6:
220 return lmmp_6pow_1_(dst, rn, exp);
221 case 9:
222 return lmmp_9pow_1_(dst, rn, exp);
223 case 10:
224 return lmmp_10pow_1_(dst, rn, exp);
225 case 12:
226 return lmmp_12pow_1_(dst, rn, exp);
227 case 14:
228 return lmmp_14pow_1_(dst, rn, exp);
229 default:
230 lmmp_param_assert(base <= 15 && base >= 1);
231 return 0;
232 }
233}
234
235#define cal_tab(i) \
236 tab[i] = tab[i - 1] * base; \
237 tab[i + 1] = tab[i] * base; \
238 tab[i + 2] = tab[i + 1] * base; \
239 tab[i + 3] = tab[i + 2] * base; \
240 tab[i + 4] = tab[i + 3] * base; \
241 tab[i + 5] = tab[i + 4] * base; \
242 tab[i + 6] = tab[i + 5] * base
243
244mp_size_t lmmp_u8_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp) {
245 lmmp_param_assert(base >= 2);
247 TEMP_DECL;
248 mp_limb_t tab[8];
249 tab[0] = 1;
250 cal_tab(1);
251
252 mp_ptr restrict sq = TALLOC_TYPE(rn, mp_limb_t);
253 sq[0] = 1;
254 rn = 1;
255 int i = 21;
256 while ((exp & (0x7ull << ((i--) * 3))) == 0);
257 for (++i; i >= 0; --i) {
258 mp_size_t p = (exp & (0x7ull << (i * 3))) >> (i * 3);
259 dst[rn] = lmmp_mul_1_(dst, sq, rn, tab[p]);
260 ++rn;
261 rn -= (dst[rn - 1] == 0) ? 1 : 0;
262 if (i > 0) {
263 lmmp_sqr_(sq, dst, rn);
264 rn <<= 1;
265 rn -= (sq[rn - 1] == 0) ? 1 : 0;
266 lmmp_sqr_(dst, sq, rn);
267 rn <<= 1;
268 rn -= (dst[rn - 1] == 0) ? 1 : 0;
269 lmmp_sqr_(sq, dst, rn);
270 rn <<= 1;
271 rn -= (sq[rn - 1] == 0) ? 1 : 0;
272 }
273 }
274 TEMP_FREE;
275 return rn;
276}
277
278mp_size_t lmmp_u16_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp) {
279 lmmp_param_assert(base >= 2);
281 TEMP_DECL;
282 mp_limb_t tab[8][2];
283 tab[0][0] = 1;
284 tab[0][1] = 0;
285 tab[1][0] = base;
286 tab[1][1] = 0;
287 tab[2][0] = tab[1][0] * base;
288 tab[2][1] = 0;
289 tab[3][0] = tab[2][0] * base;
290 tab[3][1] = 0;
291 lmmp_mullh_(tab[2][0], tab[2][0], tab[4]);
292 lmmp_mullh_(tab[3][0], tab[2][0], tab[5]);
293 lmmp_mullh_(tab[3][0], tab[3][0], tab[6]);
294 lmmp_mullh_(tab[3][0], tab[4][0], tab[7]);
295 tab[7][1] += tab[3][0] * tab[4][1];
296
297 mp_ptr restrict sq = TALLOC_TYPE(rn, mp_limb_t);
298 rn = 1;
299 sq[0] = 1;
300 int i = 21;
301 while ((exp & (0x7ull << ((i--) * 3))) == 0);
302 for (++i; i >= 0; --i) {
303 mp_size_t p = (exp & (0x7ull << (i * 3))) >> (i * 3);
304 mp_srcptr tap = tab[p];
305 mp_size_t tan = (tap[1] != 0) ? 2 : 1;
306 if (rn >= tan)
307 lmmp_mul_basecase_(dst, sq, rn, tap, tan);
308 else
309 lmmp_mul_basecase_(dst, tap, tan, sq, rn);
310 rn += tan;
311 rn -= (dst[rn - 1] == 0) ? 1 : 0;
312
313 if (i > 0) {
314 lmmp_sqr_(sq, dst, rn);
315 rn <<= 1;
316 rn -= (sq[rn - 1] == 0) ? 1 : 0;
317 lmmp_sqr_(dst, sq, rn);
318 rn <<= 1;
319 rn -= (dst[rn - 1] == 0) ? 1 : 0;
320 lmmp_sqr_(sq, dst, rn);
321 rn <<= 1;
322 rn -= (sq[rn - 1] == 0) ? 1 : 0;
323 }
324 }
325 TEMP_FREE;
326 return rn;
327}
328
329#define mul_b(i) \
330 if (rn >= b##i##n) \
331 lmmp_mul_basecase_(dst, sq, rn, b##i, b##i##n); \
332 else \
333 lmmp_mul_basecase_(dst, b##i, b##i##n, sq, rn); \
334 rn += b##i##n; \
335 rn -= (dst[rn - 1] == 0) ? 1 : 0;
336
337mp_size_t lmmp_u32_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp) {
338 lmmp_param_assert(base >= 2);
340 TEMP_DECL;
341 mp_limb_t b1[1] = { base};
342#define b1n 1
343 mp_limb_t b2[1] = { base * base};
344#define b2n 1
345
346 mp_limb_t b3[2];
347#define b3n 2
348 lmmp_mullh_(b2[0], base, b3);
349
350 mp_limb_t b4[2];
351#define b4n 2
352 lmmp_mullh_(b2[0], b2[0], b4);
353
354 mp_limb_t b5[3];
355 b5[2] = lmmp_mul_1_(b5, b4, b4n, base);
356 mp_size_t b5n = b5[2] != 0 ? 3 : 2;
357
358 mp_limb_t b6[3];
360 mp_size_t b6n = b6[2] != 0 ? 3 : 2;
361
362 mp_limb_t b7[4];
363 b7[3] = lmmp_mul_1_(b7, b5, b5n, b2[0]);
364 mp_size_t b7n = 4;
365 while (b7[b7n - 1] == 0) --b7n;
366
367 mp_ptr restrict sq = TALLOC_TYPE(rn, mp_limb_t);
368 sq[0] = 1;
369 rn = 1;
370 int i = 21;
371 while ((exp & (0x7ull << ((i--) * 3))) == 0);
372 for (++i; i >= 0; --i) {
373 mp_size_t p = (exp & (0x7ull << (i * 3))) >> (i * 3);
374 switch (p) {
375 case 0:
376 lmmp_copy(dst, sq, rn);
377 break;
378 case 1:
379 mul_b(1);
380 break;
381 case 2:
382 mul_b(2);
383 break;
384 case 3:
385 mul_b(3);
386 break;
387 case 4:
388 mul_b(4);
389 break;
390 case 5:
391 mul_b(5);
392 break;
393 case 6:
394 mul_b(6);
395 break;
396 case 7:
397 mul_b(7);
398 break;
399 }
400 if (i > 0) {
401 lmmp_sqr_(sq, dst, rn);
402 rn <<= 1;
403 rn -= (sq[rn - 1] == 0) ? 1 : 0;
404 lmmp_sqr_(dst, sq, rn);
405 rn <<= 1;
406 rn -= (dst[rn - 1] == 0) ? 1 : 0;
407 lmmp_sqr_(sq, dst, rn);
408 rn <<= 1;
409 rn -= (sq[rn - 1] == 0) ? 1 : 0;
410 }
411 }
412 TEMP_FREE;
413 return rn;
414#undef b1n
415#undef b2n
416#undef b3n
417#undef b4n
418}
419
420mp_size_t lmmp_u64_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp) {
422 TEMP_DECL;
423
424#define b1n 1
425 mp_limb_t b1[1] = { base};
426#define b2n 2
427 mp_limb_t b2[2];
428 lmmp_mullh_(base, base, b2);
429 mp_limb_t b3[3];
430 b3[2] = lmmp_mul_1_(b3, b2, b2n, base);
431 mp_size_t b3n = b3[2] != 0 ? 3 : 2;
432
433 mp_limb_t b4[4];
435 mp_size_t b4n = b4[3] != 0 ? 4 : 3;
436
437 mp_limb_t b5[5];
438 b5[b4n] = lmmp_mul_1_(b5, b4, b4n, base);
439 mp_size_t b5n = b4n + 1;
440 b5n -= (b5[b5n - 1] == 0) ? 1 : 0;
441
442 mp_limb_t b6[6];
444 mp_size_t b6n = 2 * b3n;
445 b6n -= (b6[b6n - 1] == 0) ? 1 : 0;
446
447 mp_limb_t b7[7];
448 b7[b6n] = lmmp_mul_1_(b7, b6, b6n, b1[0]);
449 mp_size_t b7n = b6n + 1;
450 b7n -= (b7[b7n - 1] == 0) ? 1 : 0;
451
452 mp_ptr restrict sq = TALLOC_TYPE(rn, mp_limb_t);
453 sq[0] = 1;
454 rn = 1;
455 int i = 21;
456 while ((exp & (0x7ull << ((i--) * 3))) == 0);
457 for (++i; i >= 0; --i) {
458 mp_size_t p = (exp & (0x7ull << (i * 3))) >> (i * 3);
459 switch (p) {
460 case 0:
461 lmmp_copy(dst, sq, rn);
462 break;
463 case 1:
464 mul_b(1);
465 break;
466 case 2:
467 mul_b(2);
468 break;
469 case 3:
470 mul_b(3);
471 break;
472 case 4:
473 mul_b(4);
474 break;
475 case 5:
476 mul_b(5);
477 break;
478 case 6:
479 mul_b(6);
480 break;
481 case 7:
482 mul_b(7);
483 break;
484 }
485
486 if (i > 0) {
487 lmmp_sqr_(sq, dst, rn);
488 rn <<= 1;
489 rn -= (sq[rn - 1] == 0) ? 1 : 0;
490 lmmp_sqr_(dst, sq, rn);
491 rn <<= 1;
492 rn -= (dst[rn - 1] == 0) ? 1 : 0;
493 lmmp_sqr_(sq, dst, rn);
494 rn <<= 1;
495 rn -= (sq[rn - 1] == 0) ? 1 : 0;
496 }
497 }
498 TEMP_FREE;
499 return rn;
500#undef b1n
501#undef b2n
502#undef mul_b
503}
504
505/*
506 * base ^ exp
507 *
508 * - base <= 15 : 4-bit lmmp_u4_pow_1_
509 * - base <= 255 : 8-bit lmmp_u8_pow_1_
510 * - base <= 65535 : 16-bit lmmp_u16_pow_1_
511 * - base <= 2^32-1 : 32-bit lmmp_u32_pow_1_
512 * - base <= 2^64-1 : 64-bit lmmp_u64_pow_1_
513 */
514
515mp_size_t lmmp_pow_1_(mp_ptr restrict dst, mp_size_t rn, mp_limb_t base, ulong exp) {
516 lmmp_param_assert(base > 1);
517 lmmp_param_assert(exp > 0);
518 if (base <= (mp_limb_t)0xf) {
519 return lmmp_u4_pow_1_(dst, rn, base, exp);
520 } else {
521 int tz = lmmp_tailing_zeros_(base);
522 base >>= tz;
523 mp_size_t shw = (exp * tz) / LIMB_BITS;
524 mp_size_t shl = (exp * tz) % LIMB_BITS;
525
526 lmmp_zero(dst, shw);
527 if (base <= (mp_limb_t)0xf)
528 rn = lmmp_u4_pow_1_(dst + shw, rn - shw, base, exp);
529 else if (base <= (mp_limb_t)MP_UCHAR_MAX)
530 rn = lmmp_u8_pow_1_(dst + shw, rn - shw, base, exp);
531 else if (base <= (mp_limb_t)MP_USHORT_MAX)
532 rn = lmmp_u16_pow_1_(dst + shw, rn - shw, base, exp);
533 else if (base <= (mp_limb_t)MP_UINT_MAX)
534 rn = lmmp_u32_pow_1_(dst + shw, rn - shw, base, exp);
535 else
536 rn = lmmp_u64_pow_1_(dst + shw, rn - shw, base, exp);
537 if (shl) {
538 dst[shw + rn] = lmmp_shl_(dst + shw, dst + shw, rn, shl);
539 rn += shw + 1;
540 rn -= (dst[rn - 1] == 0) ? 1 : 0;
541 } else {
542 rn += shw;
543 }
544 return rn;
545 }
546}
mp_limb_t * mp_ptr
Definition lmmp.h:215
#define lmmp_copy(dst, src, n)
Definition lmmp.h:364
#define lmmp_zero(dst, n)
Definition lmmp.h:366
uint64_t mp_size_t
Definition lmmp.h:212
const mp_limb_t * mp_srcptr
Definition lmmp.h:216
uint64_t mp_limb_t
Definition lmmp.h:211
#define lmmp_assert(x)
Definition lmmp.h:370
#define LIMB_BITS
Definition lmmp.h:221
#define lmmp_param_assert(x)
Definition lmmp.h:398
void lmmp_mullh_(mp_limb_t a, mp_limb_t b, mp_ptr dst)
计算两个64位无符号整数相乘的128位结果 (a*b)
int lmmp_tailing_zeros_(mp_limb_t x)
计算一个单精度数(limb)中末尾零的个数
Definition tiny.c:54
void lmmp_sqr_basecase_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
基础平方运算 [dst,2*na] = [numa,na]^2
void lmmp_mul_basecase_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
基础乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_sqr_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
大数平方操作 [dst,2*na] = [numa,na]^2
Definition sqr.c:10
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:9
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
#define MP_UINT_MAX
Definition mparam.h:139
#define MP_UCHAR_MAX
Definition mparam.h:137
#define MP_USHORT_MAX
Definition mparam.h:138
#define b1
#define b2
#define tp
#define b3
uint64_t ulong
Definition numth.h:36
static mp_size_t lmmp_8pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:32
static mp_size_t lmmp_11pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:141
static mp_size_t lmmp_4pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:24
#define b2n
static mp_size_t lmmp_5pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:139
static mp_size_t lmmp_9pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:155
static mp_size_t lmmp_7pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:140
static mp_size_t lmmp_14pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:187
static mp_size_t lmmp_13pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:142
static mp_size_t lmmp_2pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:17
mp_size_t lmmp_u4_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
Definition pow_1.c:197
static mp_size_t lmmp_6pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:145
mp_size_t lmmp_u64_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
Definition pow_1.c:420
#define mul_b(i)
Definition pow_1.c:329
#define define_1_npow_1_(_n_)
Definition pow_1.c:85
static mp_size_t lmmp_3pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:40
static mp_size_t lmmp_10pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:166
#define b4n
static mp_size_t lmmp_15pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:143
mp_size_t lmmp_u16_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
Definition pow_1.c:278
mp_size_t lmmp_u8_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
Definition pow_1.c:244
mp_size_t lmmp_pow_1_(mp_ptr restrict dst, mp_size_t rn, mp_limb_t base, ulong exp)
Definition pow_1.c:515
#define b3n
#define cal_tab(i)
Definition pow_1.c:235
static mp_size_t lmmp_12pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:176
static mp_size_t lmmp_1pow_1_(mp_ptr restrict dst)
Definition pow_1.c:12
mp_size_t lmmp_u32_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
Definition pow_1.c:337
#define TEMP_DECL
Definition tmp_alloc.h:72
#define TEMP_FREE
Definition tmp_alloc.h:93
#define TALLOC_TYPE(n, type)
Definition tmp_alloc.h:91