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"
19 }
else if (exp == 2) {
22 rn -= (dst[rn - 1] == 0);
41 rn -= (dst[rn - 1] == 0);
45 return lmmp_pow_1_(dst, rn, base[0], exp) + base_tz;
71 for (; i <= tz; i += 2) {
74 rn -= (dst[rn - 1] == 0);
77 rn -= (sq[rn - 1] == 0);
81 rn -= (dst[rn - 1] == 0);
91 for (; i <= tz; i += 2) {
94 rn -= (sq[rn - 1] == 0);
97 rn -= (dst[rn - 1] == 0);
#define lmmp_copy(dst, src, n)
#define lmmp_zero(dst, n)
const mp_limb_t * mp_srcptr
#define lmmp_param_assert(x)
int lmmp_tailing_zeros_(mp_limb_t x)
计算一个单精度数(limb)中末尾零的个数
void lmmp_sqr_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
大数平方操作 [dst,2*na] = [numa,na]^2
int lmmp_limb_bits_(mp_limb_t x)
计算满足 2^k > x 的最小自然数k
int lmmp_limb_popcnt_(mp_limb_t x)
计算一个64位无符号整数中1的个数
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 POW_WIN2_EXP_THRESHOLD
#define POW_1_EXP_THRESHOLD
#define POW_WIN2_N_THRESHOLD
mp_size_t lmmp_pow_win2_(mp_ptr dst, mp_size_t rn, mp_srcptr base, mp_size_t n, ulong exp)
计算幂次方2比特窗口快速幂算法 [dst,rn] = [base,n] ^ exp
mp_size_t lmmp_pow_1_(mp_ptr dst, mp_size_t rn, mp_limb_t base, ulong exp)
计算幂次方 [dst,rn] = [base,1] ^ exp
mp_size_t lmmp_pow_basecase_(mp_ptr dst, mp_size_t rn, mp_srcptr base, mp_size_t n, ulong exp)
计算奇数次幂算法 [dst,rn] = [base,n] ^ exp
static mp_size_t lmmp_pow_size_(mp_srcptr base, mp_size_t n, ulong exp)
计算幂次方需要的limb缓冲区长度 [base,n] ^ exp
mp_size_t lmmp_pow_(mp_ptr restrict dst, mp_size_t rn, mp_srcptr restrict base, mp_size_t n, ulong exp)
#define TALLOC_TYPE(n, type)