7#include "../../include/lammp/impl/mparam.h"
8#include "../../include/lammp/impl/tmp_alloc.h"
9#include "../../include/lammp/impl/base_table.h"
10#include "../../include/lammp/lmmpn.h"
19 }
while (src[--len] == 0);
36 for (
mp_size_t j = 1; j < digitspl; ++j) {
37 curlimb = curlimb * base + src[--i];
43 curlimb = curlimb * base + src[--i];
93 while (llen && src[llen - 1] == 0) --llen;
120 limbs = nh + np + zeros;
121 limbs -= dst[limbs - 1] == 0;
132 }
while (src[--len] == 0);
145 curlimb |= curdigit << bitpos;
148 dst[limbs] = curlimb;
151 curlimb = curdigit >> (bitspd - bitpos);
153 }
while (++src != srcend);
155 dst[limbs] = curlimb;
165 mp_size_t bexp, lexp = (len - 1) / digitspl + 1;
174 for (
int i = cpow; i > 0; --i) {
176 bexp = ((lexp - 1) >> i) + 1;
194 for (
int i = 0; i < 2; ++i) {
200 powers[i].
digits = digitspl * (i + 1);
201 powers[i].
base = base;
206 for (
int i = 2; i < cpow; ++i) {
209 np -=
tp[np - 1] == 0;
210 bexp = (lexp - 1) >> (cpow - i);
226 powers[i].
zeros = zeros;
227 powers[i].
digits = digitspl * (bexp + 1);
228 powers[i].
base = base;
232 for (
int i = 1; i < cpow; ++i) {
const mp_base_t lmmp_bases_table[255]
mp_size_t lmmp_from_str_(mp_ptr dst, const mp_byte_t *src, mp_size_t len, int base)
字符串转大数操作 [src,len,base] to [dst,return value,B]
static mp_size_t lmmp_from_str_basecase_(mp_ptr dst, const mp_byte_t *src, mp_size_t len, int base)
static mp_size_t lmmp_from_str_divide_(mp_ptr dst, const mp_byte_t *src, mp_size_t len, mp_basepow_t *pow, mp_ptr tp)
mp_size_t lmmp_from_str_len_(const mp_byte_t *src, mp_size_t len, int base)
计算字符串转大数所需的 limb 缓冲区长度
#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)中末尾零的个数
static mp_limb_t lmmp_add_1_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_limb_t x)
大数加单精度数静态内联函数 [dst,na]=[numa,na]+x
#define lmmp_inc(p)
大数加1宏(预期无进位)
void lmmp_mul_(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_mulh_(mp_limb_t a, mp_limb_t b)
计算两个64位无符号整数相乘的高位结果 (a*b)/2^64
int lmmp_limb_bits_(mp_limb_t x)
计算满足 2^k > x 的最小自然数k
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
mp_limb_t lmmp_add_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
无进位的n位加法 [dst,n] = [numa,n] + [numb,n]
#define FROM_STR_BASEPOW_THRESHOLD
#define FROM_STR_DIVIDE_THRESHOLD
#define BALLOC_TYPE(n, type)