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"
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,
53 while ((exp & (0x1full << ((i--) * 5))) == 0);
54 for (++i; i >= 0; --i) {
55 mp_size_t p = (exp & (0x1full << (i * 5))) >> (i * 5);
58 rn -= (dst[rn - 1] == 0) ? 1 : 0;
62 rn -= (sq[rn - 1] == 0) ? 1 : 0;
66 rn -= (dst[rn - 1] == 0) ? 1 : 0;
70 rn -= (sq[rn - 1] == 0) ? 1 : 0;
74 rn -= (dst[rn - 1] == 0) ? 1 : 0;
78 rn -= (sq[rn - 1] == 0) ? 1 : 0;
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) { \
88 static const mp_limb_t tab[16] = { \
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_}; \
106 mp_size_t sqn = (rn + 2) >> 1; \
107 mp_ptr restrict sq = TALLOC_TYPE(sqn, mp_limb_t); \
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]); \
116 rn -= (dst[rn - 1] == 0) ? 1 : 0; \
118 lmmp_sqr_(sq, dst, rn); \
120 rn -= (sq[rn - 1] == 0) ? 1 : 0; \
122 lmmp_sqr_(dst, sq, rn); \
124 rn -= (dst[rn - 1] == 0) ? 1 : 0; \
126 lmmp_sqr_(sq, dst, rn); \
128 rn -= (sq[rn - 1] == 0) ? 1 : 0; \
130 lmmp_sqr_(dst, sq, rn); \
132 rn -= (dst[rn - 1] == 0) ? 1 : 0; \
151 rn -= dst[rn - 1] == 0 ? 1 : 0;
161 rn -= dst[rn - 1] == 0 ? 1 : 0;
172 rn -= dst[rn - 1] == 0 ? 1 : 0;
183 rn -= dst[rn - 1] == 0 ? 1 : 0;
193 rn -= dst[rn - 1] == 0 ? 1 : 0;
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
256 while ((exp & (0x7ull << ((i--) * 3))) == 0);
257 for (++i; i >= 0; --i) {
258 mp_size_t p = (exp & (0x7ull << (i * 3))) >> (i * 3);
261 rn -= (dst[rn - 1] == 0) ? 1 : 0;
265 rn -= (sq[rn - 1] == 0) ? 1 : 0;
268 rn -= (dst[rn - 1] == 0) ? 1 : 0;
271 rn -= (sq[rn - 1] == 0) ? 1 : 0;
287 tab[2][0] = tab[1][0] * base;
289 tab[3][0] = tab[2][0] * base;
295 tab[7][1] += tab[3][0] * tab[4][1];
301 while ((exp & (0x7ull << ((i--) * 3))) == 0);
302 for (++i; i >= 0; --i) {
303 mp_size_t p = (exp & (0x7ull << (i * 3))) >> (i * 3);
311 rn -= (dst[rn - 1] == 0) ? 1 : 0;
316 rn -= (sq[rn - 1] == 0) ? 1 : 0;
319 rn -= (dst[rn - 1] == 0) ? 1 : 0;
322 rn -= (sq[rn - 1] == 0) ? 1 : 0;
331 lmmp_mul_basecase_(dst, sq, rn, b##i, b##i##n); \
333 lmmp_mul_basecase_(dst, b##i, b##i##n, sq, rn); \
335 rn -= (dst[rn - 1] == 0) ? 1 : 0;
365 while (b7[b7n - 1] == 0) --b7n;
371 while ((exp & (0x7ull << ((i--) * 3))) == 0);
372 for (++i; i >= 0; --i) {
373 mp_size_t p = (exp & (0x7ull << (i * 3))) >> (i * 3);
403 rn -= (sq[rn - 1] == 0) ? 1 : 0;
406 rn -= (dst[rn - 1] == 0) ? 1 : 0;
409 rn -= (sq[rn - 1] == 0) ? 1 : 0;
440 b5n -= (b5[b5n - 1] == 0) ? 1 : 0;
445 b6n -= (b6[b6n - 1] == 0) ? 1 : 0;
450 b7n -= (b7[b7n - 1] == 0) ? 1 : 0;
456 while ((exp & (0x7ull << ((i--) * 3))) == 0);
457 for (++i; i >= 0; --i) {
458 mp_size_t p = (exp & (0x7ull << (i * 3))) >> (i * 3);
489 rn -= (sq[rn - 1] == 0) ? 1 : 0;
492 rn -= (dst[rn - 1] == 0) ? 1 : 0;
495 rn -= (sq[rn - 1] == 0) ? 1 : 0;
538 dst[shw + rn] =
lmmp_shl_(dst + shw, dst + shw, rn, shl);
540 rn -= (dst[rn - 1] == 0) ? 1 : 0;
#define lmmp_copy(dst, src, n)
#define lmmp_zero(dst, n)
const mp_limb_t * mp_srcptr
#define lmmp_param_assert(x)
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)中末尾零的个数
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
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
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
static mp_size_t lmmp_8pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
static mp_size_t lmmp_11pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
static mp_size_t lmmp_4pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
static mp_size_t lmmp_5pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
static mp_size_t lmmp_9pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
static mp_size_t lmmp_7pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
static mp_size_t lmmp_14pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
static mp_size_t lmmp_13pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
static mp_size_t lmmp_2pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
mp_size_t lmmp_u4_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
static mp_size_t lmmp_6pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
mp_size_t lmmp_u64_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
#define define_1_npow_1_(_n_)
static mp_size_t lmmp_3pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
static mp_size_t lmmp_10pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
static mp_size_t lmmp_15pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
mp_size_t lmmp_u16_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
mp_size_t lmmp_u8_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
mp_size_t lmmp_pow_1_(mp_ptr restrict dst, mp_size_t rn, mp_limb_t base, ulong exp)
static mp_size_t lmmp_12pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
static mp_size_t lmmp_1pow_1_(mp_ptr restrict dst)
mp_size_t lmmp_u32_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
#define TALLOC_TYPE(n, type)