16#include "../../../include/lammp/impl/inlines.h"
17#include "../../../include/lammp/impl/mparam.h"
18#include "../../../include/lammp/impl/tmp_alloc.h"
19#include "../../../include/lammp/lmmpn.h"
20#include "../../../include/lammp/numth.h"
54 1, 3, 9, 27, 81, 243, 729, 2187,
55 6561, 19683, 59049, 177147, 531441, 1594323, 4782969, 14348907,
56 43046721, 129140163, 387420489, 1162261467, 3486784401, 10460353203, 31381059609, 94143178827,
57 282429536481,847288609443,2541865828329,7625597484987,22876792454961,68630377364883,205891132094649,617673396283947,
64 while ((
exp & (0x1full << ((
i--) * 5))) == 0);
65 for (++
i;
i >= 0; --
i) {
69 rn -= (
dst[
rn - 1] == 0) ? 1 : 0;
73 rn -= (
sq[
rn - 1] == 0) ? 1 : 0;
77 rn -= (
dst[
rn - 1] == 0) ? 1 : 0;
81 rn -= (
sq[
rn - 1] == 0) ? 1 : 0;
85 rn -= (
dst[
rn - 1] == 0) ? 1 : 0;
89 rn -= (
sq[
rn - 1] == 0) ? 1 : 0;
96#define define_1_npow_1_(_n_) \
97 static mp_size_t lmmp_##_n_##pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp) { \
99 static const mp_limb_t tab[16] = { \
102 (mp_limb_t)_n_ * _n_, \
103 (mp_limb_t)_n_ * _n_ * _n_, \
104 (mp_limb_t)_n_ * _n_ * _n_ * _n_, \
105 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_, \
106 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
107 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
108 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
109 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
110 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
111 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
112 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
113 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
114 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
115 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_}; \
117 mp_size_t sqn = (rn + 2) >> 1; \
118 mp_ptr restrict sq = TALLOC_TYPE(sqn, mp_limb_t); \
122 while ((exp & (0xfull << ((i--) * 4))) == 0); \
123 for (++i; i >= 0; --i) { \
124 mp_size_t p = (exp & (0xfull << (i * 4))) >> (i * 4); \
125 dst[rn] = lmmp_mul_1_(dst, dst, rn, tab[p]); \
127 rn -= (dst[rn - 1] == 0) ? 1 : 0; \
129 lmmp_sqr_(sq, dst, rn); \
131 rn -= (sq[rn - 1] == 0) ? 1 : 0; \
133 lmmp_sqr_(dst, sq, rn); \
135 rn -= (dst[rn - 1] == 0) ? 1 : 0; \
137 lmmp_sqr_(sq, dst, rn); \
139 rn -= (sq[rn - 1] == 0) ? 1 : 0; \
141 lmmp_sqr_(dst, sq, rn); \
143 rn -= (dst[rn - 1] == 0) ? 1 : 0; \
162 rn -=
dst[
rn - 1] == 0 ? 1 : 0;
172 rn -=
dst[
rn - 1] == 0 ? 1 : 0;
183 rn -=
dst[
rn - 1] == 0 ? 1 : 0;
194 rn -=
dst[
rn - 1] == 0 ? 1 : 0;
204 rn -=
dst[
rn - 1] == 0 ? 1 : 0;
264 while ((
exp & (0x7ull << ((
i--) * 3))) == 0);
265 for (++
i;
i >= 0; --
i) {
269 rn -= (
dst[
rn - 1] == 0) ? 1 : 0;
273 rn -= (
sq[
rn - 1] == 0) ? 1 : 0;
276 rn -= (
dst[
rn - 1] == 0) ? 1 : 0;
279 rn -= (
sq[
rn - 1] == 0) ? 1 : 0;
295 tab[2][0] =
tab[1][0] * base;
297 tab[3][0] =
tab[2][0] * base;
309 while ((
exp & (0x7ull << ((
i--) * 3))) == 0);
310 for (++
i;
i >= 0; --
i) {
319 rn -= (
dst[
rn - 1] == 0) ? 1 : 0;
324 rn -= (
sq[
rn - 1] == 0) ? 1 : 0;
327 rn -= (
dst[
rn - 1] == 0) ? 1 : 0;
330 rn -= (
sq[
rn - 1] == 0) ? 1 : 0;
339 lmmp_mul_basecase_(dst, sq, rn, b##i, b##i##n); \
341 lmmp_mul_basecase_(dst, b##i, b##i##n, sq, rn); \
343 rn -= (dst[rn - 1] == 0) ? 1 : 0;
379 while ((
exp & (0x7ull << ((
i--) * 3))) == 0);
380 for (++
i;
i >= 0; --
i) {
411 rn -= (
sq[
rn - 1] == 0) ? 1 : 0;
414 rn -= (
dst[
rn - 1] == 0) ? 1 : 0;
417 rn -= (
sq[
rn - 1] == 0) ? 1 : 0;
464 while ((
exp & (0x7ull << ((
i--) * 3))) == 0);
465 for (++
i;
i >= 0; --
i) {
497 rn -= (
sq[
rn - 1] == 0) ? 1 : 0;
500 rn -= (
dst[
rn - 1] == 0) ? 1 : 0;
503 rn -= (
sq[
rn - 1] == 0) ? 1 : 0;
550 rn -= (
dst[
rn - 1] == 0) ? 1 : 0;
#define lmmp_tailing_zeros_
#define lmmp_copy(dst, src, n)
#define lmmp_zero(dst, n)
const mp_limb_t * mp_srcptr
#define lmmp_param_assert(x)
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]
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)
Copyright (C) 2026 HJimmyK(Jericho Knox)
mp_size_t lmmp_u32_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
#define TALLOC_TYPE(n, type)