7#include "../../include/lammp/impl/base_table.h"
8#include "../../include/lammp/impl/mparam.h"
9#include "../../include/lammp/impl/tmp_alloc.h"
10#include "../../include/lammp/lmmpn.h"
19 }
while (numa[--na] == 0);
55 while (i && (msbyte =
lmmp_mulh_(frac, base)) == 0) {
91 if (na >= np + zeros) {
92 mp_limb_t ah = 0, al = numa[na - 1] << cnt;
98 adjust = (ah || al >= p[np - 1]);
102 if (na + adjust <= np + zeros) {
113 mp_ptr q = tpq, r = numa - zeros;
126 while (nq && q[nq - 1] == 0) --nq;
130 while (nr && r[nr - 1] == 0) --nr;
135 while (digitsl != pdigits) {
141 digits = digitsl + digitsh;
151 }
while (numa[--na] == 0);
159 int mask = (1 << cnt) - 1;
161 digits = (bits - 1) / cnt + 1;
163 int bitpos = digits * cnt -
LIMB_BITS * (na - 1);
166 while ((bitpos -= cnt) >= 0) {
167 *--dst = curlimb >> bitpos & mask;
172 curlimb = numa[na - 1];
174 *--dst = (prevlimb | curlimb >> bitpos) & mask;
194 bexp = (bexp + 1) >> 1;
205 alloc_size += npow + 1;
214 alloc_size += npow * 2;
219 for (
int i = 0; i < 2; ++i) {
225 powers[i].
digits = digitspl * (i + 1);
226 powers[i].
base = base;
232 for (
int i = 2; i < cpow; ++i) {
236 np -=
tp[np - 1] == 0;
237 if (bexp + 1 < exps[cpow - 1 - i]) {
253 powers[i].
zeros = zeros;
254 powers[i].
digits = digitspl * (bexp + 1);
255 powers[i].
base = base;
259 for (
int i = 1; i < cpow; ++i) {
278 if (powers[i].norm_cnt = cnt)
const mp_base_t lmmp_bases_table[255]
#define lmmp_copy(dst, src, n)
const mp_limb_t * mp_srcptr
#define lmmp_param_assert(x)
mp_limb_t lmmp_div_s_(mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
除法运算
static mp_size_t lmmp_div_inv_size_(mp_size_t nq, mp_size_t nb)
计算预计算逆元的尺寸
mp_limb_t lmmp_div_1_(mp_ptr dstq, mp_srcptr numa, mp_size_t na, mp_limb_t x)
单精度数除法
int lmmp_leading_zeros_(mp_limb_t x)
计算一个单精度数(limb)中前导零的个数
int lmmp_tailing_zeros_(mp_limb_t x)
计算一个单精度数(limb)中末尾零的个数
void lmmp_inv_prediv_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t ni)
除法前的逆元预计算,[dst,ni] = invappr( (ni+1 MSLs of numa) + 1 ) / B
mp_limb_t lmmp_shr_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr)
大数右移操作 [dst,na] = [numa,na] >> shr,dst的高shr位填充0
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_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
mp_limb_t lmmp_div_mulinv_(mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb, mp_srcptr invappr, mp_size_t ni)
乘法逆元除法
mp_size_t lmmp_from_str_len_(const mp_byte_t *src, mp_size_t len, int base)
计算字符串转大数所需的 limb 缓冲区长度
#define DIV_MULINV_L_THRESHOLD
#define TO_STR_DIVIDE_THRESHOLD
#define TO_STR_BASEPOW_THRESHOLD
#define BALLOC_TYPE(n, type)
mp_size_t lmmp_to_str_(mp_byte_t *dst, mp_srcptr numa, mp_size_t na, int base)
大数转字符串操作 [numa,na,B] to [dst,return value,base]
static mp_size_t lmmp_to_str_basecase_(mp_byte_t *dst, mp_srcptr numa, mp_size_t na, int base)
mp_size_t lmmp_to_str_len_(mp_srcptr numa, mp_size_t na, int base)
计算大数转换为字符串,字符串需要的缓冲区长度
static mp_size_t lmmp_to_str_divide_(mp_byte_t *dst, mp_ptr numa, mp_size_t na, mp_basepow_t *pow, mp_ptr tpq)