12 {
16 if (exp == 1) {
18 return n;
19 } else if (exp == 2) {
21 rn = n << 1;
22 rn -= (dst[rn - 1] == 0);
23 return rn;
24 } else {
26 while (*base == 0) {
27 ++base_tz;
28 ++base;
29 --n;
30 }
31 base_tz *= exp;
33 dst += base_tz;
34 if (n == 1) {
36 dst[0] = base[0];
37 rn = 1;
40 ++rn;
41 rn -= (dst[rn - 1] == 0);
42 }
43 return rn + base_tz;
44 } else {
45 return lmmp_pow_1_(dst, rn, base[0], exp) + base_tz;
46 }
47 } else {
51 }
52 }
53 if (exp & 1) {
55 }
56
60 exp >>= tz;
61
62 if (tz & 1) {
63 if (exp == 1) {
65 rn = n;
66 } else {
69 }
70 int i = 2;
71 for (; i <= tz; i += 2) {
73 rn <<= 1;
74 rn -= (dst[rn - 1] == 0);
76 rn <<= 1;
77 rn -= (sq[rn - 1] == 0);
78 }
80 rn <<= 1;
81 rn -= (dst[rn - 1] == 0);
82 } else {
83 if (exp == 1) {
85 rn = n;
86 } else {
89 }
90 int i = 2;
91 for (; i <= tz; i += 2) {
93 rn <<= 1;
94 rn -= (sq[rn - 1] == 0);
96 rn <<= 1;
97 rn -= (dst[rn - 1] == 0);
98 }
99 }
101 return rn + base_tz;
102 }
103 }
104}
#define lmmp_copy(dst, src, n)
#define lmmp_zero(dst, n)
#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
#define TALLOC_TYPE(n, type)