|
LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
|
lmmpn.h 的引用(Include)关系图:
此图展示该文件直接或间接的被哪些文件引用了:宏定义 | |
| #define | INLINE_ static inline |
| #define | LMMP_ADDCB_(r, x, y) ((r) < (y)) |
| #define | LMMP_AORS_(FUNCTION, TEST) |
| #define | LMMP_AORS_1_(OP, CB) |
| #define | lmmp_dec(p) |
| 大数减1宏(预期无借位) | |
| #define | lmmp_dec_1(p, dec) |
| 大数减指定值宏(预期无借位) | |
| #define | lmmp_inc(p) |
| 大数加1宏(预期无进位) | |
| #define | lmmp_inc_1(p, inc) |
| 大数加指定值宏(预期无进位) | |
| #define | LMMP_SUBCB_(r, x, y) ((x) < (y)) |
函数 | |
| static mp_limb_t | lmmp_add_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| 大数加法静态内联函数 [dst,na]=[numa,na]+[numb,nb] | |
| 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 | |
| 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] | |
| mp_limb_t | lmmp_add_n_sub_n_ (mp_ptr dsta, mp_ptr dstb, mp_srcptr numa, mp_srcptr numb, mp_size_t n) |
| 同时执行n位加法和减法 ([dsta,n],[dstb,n]) = ([numa,n]+[numb,n],[numa,n]-[numb,n]) | |
| mp_limb_t | lmmp_add_nc_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c) |
| 带进位的n位加法 [dst,n] = [numa,n] + [numb,n] + c | |
| mp_limb_t | lmmp_addmul_1_ (mp_ptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t b) |
| 大数乘以单limb并累加操作 [numa,n] += [numb,n] * b | |
| mp_limb_t | lmmp_addshl1_n_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n) |
| 加法结合左移1位操作 [dst,n] = [numa,n] + ([numb,n] << 1) | |
| void | lmmp_bninv_ (mp_ptr dstq, mp_srcptr numa, mp_size_t na, mp_size_t ni) |
| 精确逆元计算 [dstq,na+ni+2] = B^(2*(na+ni)) / ([numa,na] * B^ni) | |
| static int | lmmp_cmp_ (mp_srcptr numa, mp_srcptr numb, mp_size_t n) |
| 大数比较函数(内联) | |
| void | lmmp_div_ (mp_ptr dstq, mp_ptr dstr, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| 大数除法和取模操作 | |
| mp_limb_t | lmmp_div_1_ (mp_ptr dstq, mp_srcptr numa, mp_size_t na, mp_limb_t x) |
| 单精度数除法 | |
| mp_limb_t | lmmp_div_1_s_ (mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_limb_t x) |
| 单精度数除法(除数为1个limb) | |
| void | lmmp_div_2_ (mp_ptr dstq, mp_srcptr numa, mp_size_t na, mp_ptr numb) |
| 双精度数除法 (除数为2个limb) | |
| mp_limb_t | lmmp_div_2_s_ (mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb) |
| 双精度数除法(除数为2个limb) | |
| mp_limb_t | lmmp_div_3_2_ (mp_ptr numa, mp_srcptr numb, mp_limb_t inv21) |
| 3/2位除法运算 [numa,2]=[numa,3] mod [numb,2] | |
| mp_limb_t | lmmp_div_basecase_ (mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb, mp_limb_t inv21) |
| 基础除法运算 | |
| mp_limb_t | lmmp_div_divide_ (mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb, mp_limb_t inv21) |
| 分治除法运算 | |
| static mp_size_t | lmmp_div_inv_size_ (mp_size_t nq, mp_size_t nb) |
| 计算预计算逆元的尺寸 | |
| 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_limb_t | lmmp_div_s_ (mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| 除法运算 | |
| static bool | lmmp_endian (void) |
| 运行时判断端序 | |
| mp_bitcnt_t | lmmp_extract_bits_ (mp_srcptr num, mp_size_t n, mp_limb_t *ext, int bits) |
| 提取高位指定位数,并返回低位bits位数 | |
| mp_size_t | lmmp_fft_next_size_ (mp_size_t n) |
| 计算满足 >=n 的最小费马/梅森乘法可行尺寸 | |
| 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] | |
| mp_size_t | lmmp_from_str_len_ (const mp_byte_t *src, mp_size_t len, int base) |
| 计算字符串转大数所需的 limb 缓冲区长度 | |
| void | lmmp_inv_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t nf) |
| 大数求逆操作 [dst,na+nf+1] = (B^(2*(na+nf)) - 1) / ([numa,na]*B^nf) + [0|-1] | |
| mp_limb_t | lmmp_inv_1_ (mp_limb_t x) |
| 1阶逆元计算 (inv1) | |
| mp_limb_t | lmmp_inv_2_1_ (mp_limb_t xh, mp_limb_t xl) |
| 2-1阶逆元计算 (inv21) | |
| void | lmmp_inv_basecase_ (mp_ptr dst, mp_srcptr numa, mp_size_t na) |
| 近似逆元计算 | |
| 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 | |
| void | lmmp_invappr_ (mp_ptr dst, mp_srcptr numa, mp_size_t na) |
| 近似逆元计算 (invappr) | |
| void | lmmp_invappr_newton_ (mp_ptr dst, mp_srcptr numa, mp_size_t na) |
| 近似逆元计算(牛顿迭代法) | |
| int | lmmp_leading_zeros_ (mp_limb_t x) |
| 计算一个单精度数(limb)中前导零的个数 | |
| 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_mod_1_ (mp_srcptr numa, mp_size_t na, mp_limb_t x) |
| 单精度数取余 | |
| void | lmmp_mod_2_ (mp_srcptr numa, mp_size_t na, mp_ptr numb) |
| 双精度数取余 (除数为2个limb) | |
| 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] | |
| 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 | |
| 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] | |
| void | lmmp_mul_fermat_ (mp_ptr dst, mp_size_t rn, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| 费马数模乘法 [dst,rn+1]=[numa,na]*[numb,nb] mod B^rn+1 | |
| void | lmmp_mul_fft_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| FFT乘法运算 [dst,na+nb] = [numa,na] * [numb,nb] | |
| void | lmmp_mul_fft_unbalance_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| FFT不平衡乘法运算 [dst,na+nb] = [numa,na] * [numb,nb] | |
| void | lmmp_mul_mersenne_ (mp_ptr dst, mp_size_t rn, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| 梅森数模乘法 [dst,rn] = [numa,na]*[numb,nb] mod B^rn-1 | |
| void | lmmp_mul_n_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n) |
| 等长大数乘法操作 [dst,2*n] = [numa,n] * [numb,n] | |
| void | lmmp_mul_toom22_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| Toom-22乘法运算 [dst,na+nb] = [numa,na] * [numb,nb] | |
| void | lmmp_mul_toom32_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| Toom-32乘法运算 [dst,na+nb] = [numa,na] * [numb,nb] | |
| void | lmmp_mul_toom33_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| Toom-33乘法运算 [dst,na+nb] = [numa,na] * [numb,nb] | |
| void | lmmp_mul_toom42_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| Toom-42乘法运算 [dst,na+nb] = [numa,na] * [numb,nb] | |
| void | lmmp_mul_toom42_unbalance_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| Toom-42不平衡乘法运算 [dst,na+nb] = [numa,na] * [numb,nb] | |
| void | lmmp_mul_toom43_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| Toom-43乘法运算 [dst,na+nb] = [numa,na] * [numb,nb] | |
| void | lmmp_mul_toom44_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| Toom-44乘法运算 [dst,na+nb] = [numa,na] * [numb,nb] | |
| void | lmmp_mul_toom52_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| Toom-52乘法运算 [dst,na+nb] = [numa,na] * [numb,nb] | |
| void | lmmp_mul_toom53_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| Toom-53乘法运算 [dst,na+nb] = [numa,na] * [numb,nb] | |
| void | lmmp_mul_toom62_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| Toom-62乘法运算 [dst,na+nb] = [numa,na] * [numb,nb] | |
| void | lmmp_mul_toom62_unbalance_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| Toom-62不平衡乘法运算 [dst,na+nb] = [numa,na] * [numb,nb] | |
| mp_limb_t | lmmp_mulh_ (mp_limb_t a, mp_limb_t b) |
| 计算两个64位无符号整数相乘的高位结果 (a*b)/2^64 | |
| void | lmmp_mullh_ (mp_limb_t a, mp_limb_t b, mp_ptr dst) |
| 计算两个64位无符号整数相乘的128位结果 (a*b) | |
| void | lmmp_mullo_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n) |
| 低位乘法 [dst,n] = [numa,n] * [numb,n] mod B^n | |
| void | lmmp_mullo_dc_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_ptr tp, mp_size_t n) |
| 低位乘法 [dst,n] = [numa,n] * [numb,n] mod B^n | |
| void | lmmp_mullo_fft_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_ptr scratch) |
| 低位FFT乘法 [dst,n] = [numa,n] * [numb,n] mod B^n | |
| void | lmmp_not_ (mp_ptr dst, mp_srcptr numa, mp_size_t na) |
| 大数按位取反操作 [dst,na] = ~[numa,na] (对每个limb执行按位非操作) | |
| 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_shl_c_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shl, mp_limb_t c) |
| 带进位的大数左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充c的低shl位 | |
| mp_limb_t | lmmp_shlnot_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shl) |
| 左移后按位取反操作 [dst,na] = ~([numa,na] << shl),dst的低shl位填充1 | |
| mp_limb_t | lmmp_shr1add_n_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n) |
| 加法后右移1位 [dst,n] = ([numa,n] + [numb,n]) >> 1 | |
| mp_limb_t | lmmp_shr1add_nc_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c) |
| 带进位加法后右移1位 [dst,n] = ([numa,n] + [numb,n] + c) >> 1 | |
| mp_limb_t | lmmp_shr1sub_n_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n) |
| 减法后右移1位 [dst,n] = ([numa,n] - [numb,n]) >> 1 | |
| mp_limb_t | lmmp_shr1sub_nc_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c) |
| 带借位减法后右移1位 [dst,n] = ([numa,n] - [numb,n] - c) >> 1 | |
| 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 | |
| mp_limb_t | lmmp_shr_c_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr, mp_limb_t c) |
| 带进位的大数右移操作 [dst,na] = [numa,na]>>shr,dst的高shr位填充c的高shr位 | |
| void | lmmp_sqr_ (mp_ptr dst, mp_srcptr numa, mp_size_t na) |
| 大数平方操作 [dst,2*na] = [numa,na]^2 | |
| void | lmmp_sqr_basecase_ (mp_ptr dst, mp_srcptr numa, mp_size_t na) |
| 基础平方运算 [dst,2*na] = [numa,na]^2 | |
| void | lmmp_sqr_toom2_ (mp_ptr dst, mp_srcptr numa, mp_size_t na) |
| Toom-2平方运算 [dst,2*na] = [numa,na]^2 | |
| void | lmmp_sqr_toom3_ (mp_ptr dst, mp_srcptr numa, mp_size_t na) |
| Toom-3平方运算 [dst,2*na] = [numa,na]^2 | |
| void | lmmp_sqr_toom4_ (mp_ptr pp, mp_srcptr ap, mp_size_t an) |
| Toom-4平方运算 [dst,2*na] = [numa,na]^2 | |
| void | lmmp_sqrlo_dc_ (mp_ptr dst, mp_srcptr numa, mp_ptr tp, mp_size_t n) |
| 低位平方 [dst,n] = [numa,n]^2 mod B^n | |
| void | lmmp_sqrt_ (mp_ptr dsts, mp_ptr dstr, mp_srcptr numa, mp_size_t na, mp_size_t nf) |
| 大数平方根和取余操作 | |
| static mp_limb_t | lmmp_sub_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb) |
| 大数减法静态内联函数 [dst,na]=[numa,na]-[numb,nb] | |
| static mp_limb_t | lmmp_sub_1_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_limb_t x) |
| 大数减单精度数静态内联函数 [dst,na]=[numa,na]-x | |
| mp_limb_t | lmmp_sub_n_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n) |
| 无借位的n位减法 [dst,n] = [numa,n] - [numb,n] | |
| mp_limb_t | lmmp_sub_nc_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c) |
| 带借位的n位减法 [dst,n] = [numa,n] - [numb,n] - c | |
| mp_limb_t | lmmp_submul_1_ (mp_ptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t b) |
| 大数乘以单limb并累减操作 [numa,n] -= [numb,n] * b | |
| mp_limb_t | lmmp_subshl1_n_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n) |
| 减法结合左移1位操作 [dst,n] = [numa,n] - ([numb,n] << 1) | |
| int | lmmp_tailing_zeros_ (mp_limb_t x) |
| 计算一个单精度数(limb)中末尾零的个数 | |
| 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] | |
| mp_size_t | lmmp_to_str_len_ (mp_srcptr numa, mp_size_t na, int base) |
| 计算大数转换为字符串,字符串需要的缓冲区长度 | |
| static int | lmmp_zero_q_ (mp_srcptr p, mp_size_t n) |
| 大数判零函数(内联) | |
| #define LMMP_AORS_ | ( | FUNCTION, | |
| TEST | |||
| ) |
| #define LMMP_AORS_1_ | ( | OP, | |
| CB | |||
| ) |
| #define lmmp_dec | ( | p | ) |
| #define lmmp_dec_1 | ( | p, | |
| dec | |||
| ) |
| #define lmmp_inc | ( | p | ) |
| #define lmmp_inc_1 | ( | p, | |
| inc | |||
| ) |
|
inlinestatic |
大数加法静态内联函数 [dst,na]=[numa,na]+[numb,nb]
| dst | 输出结果缓冲区,存储numa + numb |
| numa | 第一个加数,长度为na |
| na | 第一个加数的 limb 长度 |
| numb | 第二个加数,长度为nb |
| nb | 第二个加数的 limb 长度 |
引用了 lmmp_add_n_() , 以及 LMMP_AORS_.
被这些函数引用 lmmp_add_signed_(), lmmp_invsqrt_newton_(), lmmp_mul_fermat_recombine_(), lmmp_mul_fft_(), lmmp_mul_fft_cache_(), lmmp_mul_mersenne_(), lmmp_mul_mersenne_single_(), lmmp_mul_toom22_(), lmmp_mul_toom32_(), lmmp_mul_toom33_(), lmmp_mul_toom42_(), lmmp_mul_toom42_cache_(), lmmp_mul_toom42_cache_init_(), lmmp_mul_toom43_(), lmmp_mul_toom52_(), lmmp_mul_toom53_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_init_(), lmmp_mullo_fft_(), lmmp_sqr_toom2_(), lmmp_sqr_toom3_(), lmmp_toom_eval_dgr3_pm1_(), lmmp_toom_eval_dgr3_pm2_() , 以及 lmmp_toom_eval_pm1_().
函数调用图:
这是这个函数的调用关系图:大数加单精度数静态内联函数 [dst,na]=[numa,na]+x
| dst | 输出结果缓冲区,存储numa + x |
| numa | 被加数,长度为na |
| na | 被加数的 limb 长度 |
| x | 加数(单个 limb ) |
引用了 LMMP_ADDCB_ , 以及 LMMP_AORS_1_.
被这些函数引用 lmmp_from_str_basecase_(), lmmp_inv_prediv_(), lmmp_mul_fermat_recombine_(), lmmp_mul_mersenne_(), lmmp_mul_mersenne_single_(), lmmp_mul_toom32_(), lmmp_mul_toom33_(), lmmp_mul_toom42_(), lmmp_mul_toom42_cache_(), lmmp_mul_toom42_cache_init_(), lmmp_mul_toom43_(), lmmp_sqr_toom3_(), lmmp_sqrt_divide_() , 以及 lmmp_toom_eval_pm2_().
这是这个函数的调用关系图:无进位的n位加法 [dst,n] = [numa,n] + [numb,n]
| dst | 结果输出指针 |
| numa | 第一个加数指针 |
| numb | 第二个加数指针 |
| n | limb长度 |
引用了 a0, a1, a2, a3, b0, b1, b2, b3, r0, r1, r2 , 以及 r3.
被这些函数引用 lmmp_add_(), lmmp_binvert_n_dc_(), lmmp_div_(), lmmp_div_basecase_(), lmmp_div_divide_n_(), lmmp_div_mulinv_(), lmmp_div_s_(), lmmp_from_str_divide_(), lmmp_invappr_newton_(), lmmp_mul_(), lmmp_mul_fft_unbalance_(), lmmp_mul_toom22_(), lmmp_mul_toom32_(), lmmp_mul_toom33_(), lmmp_mul_toom42_(), lmmp_mul_toom42_cache_(), lmmp_mul_toom42_cache_init_(), lmmp_mul_toom42_unbalance_(), lmmp_mul_toom43_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_(), lmmp_mul_toom62_cache_init_(), lmmp_mul_toom62_unbalance_(), lmmp_mullo_dc_(), lmmp_sqr_toom2_(), lmmp_sqrlo_dc_(), lmmp_sqrt_divide_(), lmmp_toom_eval_dgr3_pm1_(), lmmp_toom_eval_dgr3_pm2_(), lmmp_toom_eval_pm1_(), lmmp_toom_interp5_(), lmmp_toom_interp6_() , 以及 lmmp_toom_interp7_().
这是这个函数的调用关系图:| mp_limb_t lmmp_add_n_sub_n_ | ( | mp_ptr | dsta, |
| mp_ptr | dstb, | ||
| mp_srcptr | numa, | ||
| mp_srcptr | numb, | ||
| mp_size_t | n | ||
| ) |
同时执行n位加法和减法 ([dsta,n],[dstb,n]) = ([numa,n]+[numb,n],[numa,n]-[numb,n])
| dsta | 加法结果输出指针 |
| dstb | 减法结果输出指针 |
| numa | 第一个操作数指针(被加数/被减数) |
| numb | 第二个操作数指针(加数/减数) |
| n | limb长度 |
在文件 add_n_sub_n.c 第 10 行定义.
引用了 lmmp_add_nc_(), lmmp_copy, LMMP_MIN, lmmp_sub_nc_(), PART_SIZE , 以及 tp.
被这些函数引用 lmmp_mul_toom32_(), lmmp_mul_toom33_(), lmmp_mul_toom42_(), lmmp_mul_toom42_cache_(), lmmp_mul_toom42_cache_init_(), lmmp_mul_toom43_(), lmmp_mul_toom52_(), lmmp_mul_toom53_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_init_(), lmmp_sqr_toom3_(), lmmp_toom_eval_dgr3_pm1_(), lmmp_toom_eval_dgr3_pm2_(), lmmp_toom_eval_pm1_() , 以及 lmmp_toom_eval_pm2_().
函数调用图:
这是这个函数的调用关系图:带进位的n位加法 [dst,n] = [numa,n] + [numb,n] + c
| dst | 结果输出指针 |
| numa | 第一个加数指针 |
| numb | 第二个加数指针 |
| n | limb长度 |
| c | 初始进位值 [0|1] |
引用了 a0, a1, a2, a3, b0, b1, b2, b3, r0, r1, r2 , 以及 r3.
被这些函数引用 lmmp_add_n_sub_n_(), lmmp_fft_bfy_(), lmmp_ifft_bfy_() , 以及 lmmp_invappr_newton_().
这是这个函数的调用关系图:大数乘以单limb并累加操作 [numa,n] += [numb,n] * b
| numa | 被加数指针(结果也存储在此) |
| numb | 乘数指针 |
| n | limb长度 |
| b | 乘数 |
被这些函数引用 lmmp_mul_toom62_(), lmmp_mul_toom62_cache_(), lmmp_mul_toom62_cache_init_(), lmmp_sqrt_() , 以及 lmmp_toom_interp7_().
这是这个函数的调用关系图:加法结合左移1位操作 [dst,n] = [numa,n] + ([numb,n] << 1)
| dst | 结果输出指针 |
| numa | 被加数指针 |
| numb | 加数指针(先左移1位) |
| n | limb长度 |
引用了 LIMB_BITS.
被这些函数引用 lmmp_mul_toom33_(), lmmp_mul_toom42_(), lmmp_mul_toom42_cache_(), lmmp_mul_toom42_cache_init_(), lmmp_mul_toom44_(), lmmp_mul_toom53_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_(), lmmp_mul_toom62_cache_init_(), lmmp_sqr_toom3_(), lmmp_sqr_toom4_(), lmmp_sqrlo_dc_() , 以及 lmmp_sqrt_divide_().
这是这个函数的调用关系图:精确逆元计算 [dstq,na+ni+2] = B^(2*(na+ni)) / ([numa,na] * B^ni)
| dstq | 输出商的缓冲区,长度至少为na+ni+2 |
| numa | 输入被除数(长度na) |
| na | 被除数的 limb 长度 |
| ni | 精度因子 |
大数比较函数(内联)
| numa | 第一个大数,长度为n |
| numb | 第二个大数,长度为n |
| n | 大数的单精度数(limb)长度 |
引用了 lmmp_param_assert.
被这些函数引用 lmmp_add_signed_(), lmmp_div_(), lmmp_div_basecase_(), lmmp_div_mulinv_(), lmmp_div_s_(), lmmp_gcd_basecase_(), lmmp_gcd_lehmer_(), lmmp_invappr_newton_(), lmmp_lehmer_mul_(), lmmp_mul_toom22_(), lmmp_mul_toom32_(), lmmp_mul_toom33_(), lmmp_mul_toom42_(), lmmp_mul_toom42_cache_(), lmmp_mul_toom42_cache_init_(), lmmp_mul_toom43_(), lmmp_mul_toom52_(), lmmp_mul_toom53_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_init_(), lmmp_sqr_toom2_(), lmmp_sqr_toom3_(), lmmp_toom_eval_dgr3_pm1_(), lmmp_toom_eval_dgr3_pm2_(), lmmp_toom_eval_pm1_(), lmmp_toom_eval_pm2_() , 以及 try_div_().
这是这个函数的调用关系图:| void lmmp_div_ | ( | mp_ptr | dstq, |
| mp_ptr | dstr, | ||
| mp_srcptr | numa, | ||
| mp_size_t | na, | ||
| mp_srcptr | numb, | ||
| mp_size_t | nb | ||
| ) |
大数除法和取模操作
| dstq | 商结果输出指针(NULL表示不计算商) |
| dstr | 余数结果输出指针(NULL表示不计算余数) |
| numa | 被除数指针 |
| na | 被除数的 limb 长度 |
| numb | 除数指针 |
| nb | 除数的 limb 长度 |
引用了 DIV_DIVIDE_THRESHOLD, DIV_MULINV_L_THRESHOLD, DIV_MULINV_N_THRESHOLD, LIMB_BITS, LIMB_MAX, lmmp_add_n_(), lmmp_cmp_(), lmmp_copy, lmmp_dec, lmmp_div_1_(), lmmp_div_1_s_(), lmmp_div_2_(), lmmp_div_2_s_(), lmmp_div_basecase_(), lmmp_div_divide_(), lmmp_div_inv_size_(), lmmp_div_mulinv_(), lmmp_inv_2_1_(), lmmp_inv_prediv_(), lmmp_leading_zeros_(), lmmp_mul_(), lmmp_shl_(), lmmp_shr_(), lmmp_sub_n_(), lmmp_sub_nc_(), lmmp_submul_1_(), TALLOC_TYPE, TEMP_DECL, TEMP_FREE , 以及 tp.
被这些函数引用 lmmp_bninv_(), lmmp_gcd_basecase_(), lmmp_gcd_lehmer_(), lmmp_trialdiv_() , 以及 try_div_().
函数调用图:
这是这个函数的调用关系图:单精度数除法
| dstq | 输出商的缓冲区(可为NULL,此时仅计算余数) |
| numa | 输入被除数,长度为na |
| na | 被除数的 limb 长度 |
| x | 除数(单个 limb ) |
引用了 _udiv_qrnnd_preinv, LIMB_BITS, lmmp_inv_1_(), lmmp_leading_zeros_() , 以及 lmmp_mod_1_().
被这些函数引用 lmmp_bninv_(), lmmp_div_(), lmmp_odd_nCr_uint_(), lmmp_odd_nCr_ushort_() , 以及 lmmp_to_str_basecase_().
函数调用图:
这是这个函数的调用关系图:单精度数除法(除数为1个limb)
| dstq | 输出商的缓冲区,长度至少为na-1 |
| numa | 输入被除数(长度na),运算后存储余数(长度1) |
| na | 被除数的 limb 长度 |
| x | 除数(单个 limb ) |
被这些函数引用 lmmp_div_(), lmmp_div_s_(), mont63_R2() , 以及 mont64_R2().
这是这个函数的调用关系图:双精度数除法 (除数为2个limb)
| dstq | 输出商的缓冲区,长度至少为na-1 |
| numa | 输入被除数(长度na) |
| na | 被除数的 limb 长度 |
| numb | 输入除数(长度2)[numb,2]=[numa,na] mod [numb,2] |
引用了 _u128cmp, _u128sub, _udiv_qr_3by2, a0, a1, a2, b0, b1, LIMB_BITS, lmmp_inv_2_1_(), lmmp_leading_zeros_(), r0 , 以及 r1.
被这些函数引用 lmmp_bninv_() , 以及 lmmp_div_().
函数调用图:
这是这个函数的调用关系图:双精度数除法(除数为2个limb)
| dstq | 输出商的缓冲区,长度至少为na-2 |
| numa | 输入被除数(长度na),运算后存储余数(长度2) |
| na | 被除数的 limb 长度 |
| numb | 输入除数,长度为2 |
被这些函数引用 lmmp_div_(), lmmp_div_s_() , 以及 lmmp_inv_basecase_().
这是这个函数的调用关系图:3/2位除法运算 [numa,2]=[numa,3] mod [numb,2]
| numa | 输入被除数(长度3),运算后存储余数(长度2) |
| numb | 输入除数(长度2) |
| inv21 | 除数的2-1阶逆元(提前计算好的inv21([numb,2])) |
被这些函数引用 lmmp_div_basecase_().
这是这个函数的调用关系图:| mp_limb_t lmmp_div_basecase_ | ( | mp_ptr | dstq, |
| mp_ptr | numa, | ||
| mp_size_t | na, | ||
| mp_srcptr | numb, | ||
| mp_size_t | nb, | ||
| mp_limb_t | inv21 | ||
| ) |
基础除法运算
| dstq | 输出商的缓冲区,长度至少为na-nb |
| numa | 输入被除数(长度na),运算后存储余数(长度nb) |
| na | 被除数的单精度数(limb)长度 |
| numb | 输入除数,长度为nb |
| nb | 除数的单精度数(limb)长度 |
| inv21 | 除数的2-1阶逆元(inv21([numb+nb-2,2])) |
在文件 div_basecase.c 第 10 行定义.
引用了 LIMB_B_2, LIMB_MAX, lmmp_add_n_(), lmmp_cmp_(), lmmp_div_3_2_(), lmmp_param_assert, lmmp_sub_n_() , 以及 lmmp_submul_1_().
被这些函数引用 lmmp_bninv_appr_newton_(), lmmp_div_(), lmmp_div_divide_n_(), lmmp_div_s_() , 以及 lmmp_inv_basecase_().
函数调用图:
这是这个函数的调用关系图:| mp_limb_t lmmp_div_divide_ | ( | mp_ptr | dstq, |
| mp_ptr | numa, | ||
| mp_size_t | na, | ||
| mp_srcptr | numb, | ||
| mp_size_t | nb, | ||
| mp_limb_t | inv21 | ||
| ) |
分治除法运算
| dstq | 输出商的缓冲区,长度至少为na-nb |
| numa | 输入被除数(长度na),运算后存储余数(长度nb) |
| na | 被除数的单精度数(limb)长度 |
| numb | 输入除数,长度为nb |
| nb | 除数的单精度数(limb)长度 |
| inv21 | 除数的2-1阶逆元(inv21([numb+nb-2,2])) |
在文件 div_divide.c 第 53 行定义.
引用了 LIMB_B_2, lmmp_div_divide_n_(), lmmp_div_s_(), lmmp_param_assert, TALLOC_TYPE, TEMP_DECL, TEMP_FREE , 以及 tp.
被这些函数引用 lmmp_div_(), lmmp_div_s_() , 以及 lmmp_inv_basecase_().
函数调用图:
这是这个函数的调用关系图:计算预计算逆元的尺寸
| nq | 商的 limb 长度 |
| nb | 除数的 limb 长度 |
被这些函数引用 lmmp_div_(), lmmp_div_s_() , 以及 lmmp_to_str_().
这是这个函数的调用关系图:| 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 | ||
| ) |
乘法逆元除法
| dstq | 输出商的缓冲区,长度至少为na-nb |
| numa | 输入被除数(长度na),运算后存储余数(长度nb) |
| na | 被除数的 limb 长度 |
| numb | 输入除数,长度为nb |
| nb | 除数的 limb 长度 |
| invappr | 预计算的近似逆元,长度为ni |
| ni | 预计算逆元的 limb 长度 |
在文件 div_mulinv.c 第 36 行定义.
引用了 DIV_MULINV_MODM_THRESHOLD, LIMB_B_2, lmmp_add_n_(), lmmp_assert, lmmp_cmp_(), lmmp_fft_next_size_(), lmmp_inc, LMMP_MIN, lmmp_mul_(), lmmp_mul_mersenne_(), lmmp_mul_n_(), lmmp_param_assert, lmmp_sub_1_(), lmmp_sub_n_(), lmmp_sub_nc_(), TALLOC_TYPE, TEMP_DECL, TEMP_FREE , 以及 tp.
被这些函数引用 lmmp_div_(), lmmp_div_s_() , 以及 lmmp_to_str_divide_().
函数调用图:
这是这个函数的调用关系图:除法运算
| dstq | 输出商的缓冲区,长度至少为na-nb |
| numa | 输入被除数(长度na),运算后存储余数(长度nb) |
| na | 被除数的 limb 长度 |
| numb | 输入除数,长度为nb |
| nb | 除数的 limb 长度 |
引用了 DIV_DIVIDE_THRESHOLD, DIV_MULINV_L_THRESHOLD, DIV_MULINV_N_THRESHOLD, lmmp_add_n_(), lmmp_cmp_(), lmmp_div_1_s_(), lmmp_div_2_s_(), lmmp_div_basecase_(), lmmp_div_divide_(), lmmp_div_inv_size_(), lmmp_div_mulinv_(), lmmp_div_s_(), lmmp_inv_2_1_(), lmmp_inv_prediv_(), lmmp_mul_(), lmmp_sub_1_(), lmmp_sub_n_(), TALLOC_TYPE, TEMP_DECL, TEMP_FREE , 以及 tp.
被这些函数引用 lmmp_div_divide_(), lmmp_div_s_(), lmmp_invsqrt_newton_(), lmmp_sqrt_divide_() , 以及 lmmp_to_str_divide_().
函数调用图:
这是这个函数的调用关系图:
|
inlinestatic |
| mp_bitcnt_t lmmp_extract_bits_ | ( | mp_srcptr | num, |
| mp_size_t | n, | ||
| mp_limb_t * | ext, | ||
| int | bits | ||
| ) |
提取高位指定位数,并返回低位bits位数
| num | 待提取的大数指针 |
| n | num的 limb 长度 |
| bits | 待提取的位数(1-64) |
| ext | 提取结果输出指针 |
计算满足 >=n 的最小费马/梅森乘法可行尺寸
| n | 输入的目标尺寸 |
计算满足 >=n 的最小费马/梅森乘法可行尺寸
| n | - 原始长度 |
引用了 k, lmmp_debug_assert, lmmp_fft_best_k_() , 以及 LOG2_LIMB_BITS.
被这些函数引用 binvert_mulhi_(), lmmp_div_mulinv_(), lmmp_invappr_newton_(), lmmp_invsqrt_newton_(), lmmp_mul_fft_(), lmmp_mul_fft_unbalance_() , 以及 lmmp_mullo_fft_().
函数调用图:
这是这个函数的调用关系图:字符串转大数操作 [src,len,base] to [dst,return value,B]
| dst | 大数结果输出指针 |
| src | 字符串源指针 |
| len | 字符串长度 |
| base | 字符串的进制基数 |
在文件 from_str.c 第 128 行定义.
引用了 BALLOC_TYPE, mp_basepow_t::base, mp_basepow_t::digits, mp_base_t::digits_in_limb, FROM_STR_BASEPOW_THRESHOLD, mp_base_t::large_base, LIMB_BITS, lmmp_bases_table, lmmp_copy, lmmp_from_str_basecase_(), lmmp_from_str_divide_(), lmmp_from_str_len_(), lmmp_limb_bits_(), lmmp_mul_1_(), LMMP_POW2_Q, lmmp_sqr_(), lmmp_tailing_zeros_(), mp_basepow_t::np, mp_basepow_t::p, TEMP_DECL, TEMP_FREE, tp , 以及 mp_basepow_t::zeros.
函数调用图:计算字符串转大数所需的 limb 缓冲区长度
| src | 输入字符串指针 |
| len | 字符串长度 |
| base | 字符串的基数(2~256) |
在文件 from_str.c 第 13 行定义.
引用了 lmmp_bases_table, lmmp_mulh_() , 以及 lmmp_param_assert.
被这些函数引用 lmmp_from_str_(), lmmp_from_str_divide_() , 以及 lmmp_to_str_().
函数调用图:
这是这个函数的调用关系图:大数求逆操作 [dst,na+nf+1] = (B^(2*(na+nf)) - 1) / ([numa,na]*B^nf) + [0|-1]
| dst | 逆元结果输出指针 |
| numa | 源操作数指针 |
| na | 操作数的 limb 长度 |
| nf | 精度因子 |
引用了 LIMB_BITS, lmmp_copy, lmmp_invappr_(), lmmp_leading_zeros_(), lmmp_param_assert, lmmp_shl_(), lmmp_shr_c_(), lmmp_zero, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.
函数调用图:1阶逆元计算 (inv1)
| x | 输入的64位无符号整数,最高位为1(MSB(x)=1) |
引用了 LIMB_BITS, LIMB_MAX , 以及 LLIMB_MASK.
被这些函数引用 lmmp_div_1_(), lmmp_div_1_s_(), lmmp_inv_basecase_(), lmmp_mod_1_() , 以及 lmmp_mulmod_ulong_().
这是这个函数的调用关系图:2-1阶逆元计算 (inv21)
| xh | 输入数的高64位部分 |
| xl | 输入数的低64位部分 |
引用了 _umul64to128_(), LIMB_BITS, LIMB_MAX , 以及 LLIMB_MASK.
被这些函数引用 lmmp_bninv_appr_newton_(), lmmp_div_(), lmmp_div_2_(), lmmp_div_2_s_(), lmmp_div_s_(), lmmp_inv_basecase_() , 以及 lmmp_mod_2_().
函数调用图:
这是这个函数的调用关系图:近似逆元计算
| dst | 输出结果缓冲区,长度为na |
| numa | 输入操作数,长度为na |
| na | 输入操作数的 limb 长度 |
引用了 DIV_DIVIDE_THRESHOLD, LIMB_B_2, LIMB_MAX, lmmp_div_2_s_(), lmmp_div_basecase_(), lmmp_div_divide_(), lmmp_inv_1_(), lmmp_inv_2_1_(), lmmp_not_(), lmmp_param_assert, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.
被这些函数引用 lmmp_invappr_() , 以及 lmmp_invappr_newton_().
函数调用图:
这是这个函数的调用关系图:除法前的逆元预计算,[dst,ni] = invappr( (ni+1 MSLs of numa) + 1 ) / B
| dst | 输出预计算逆元的缓冲区,长度为ni |
| numa | 输入操作数,长度为na |
| na | 输入操作数的 limb 长度 |
| ni | 预计算逆元的目标尺寸 |
在文件 div_mulinv.c 第 11 行定义.
引用了 LIMB_B_2, lmmp_add_1_(), lmmp_copy, lmmp_invappr_(), lmmp_param_assert, lmmp_zero, TALLOC_TYPE, TEMP_DECL, TEMP_FREE , 以及 tp.
被这些函数引用 lmmp_div_(), lmmp_div_s_() , 以及 lmmp_to_str_().
函数调用图:
这是这个函数的调用关系图:近似逆元计算 (invappr)
| dst | 输出结果缓冲区,长度为na |
| numa | 输入操作数,长度为na |
| na | 输入操作数的 limb 长度 |
引用了 INV_NEWTON_THRESHOLD, lmmp_inv_basecase_() , 以及 lmmp_invappr_newton_().
被这些函数引用 lmmp_inv_() , 以及 lmmp_inv_prediv_().
函数调用图:
这是这个函数的调用关系图:近似逆元计算(牛顿迭代法)
| dst | 输出结果缓冲区,长度为na |
| numa | 输入操作数,长度为na |
| na | 输入操作数的 limb 长度 |
引用了 INV_MODM_THRESHOLD, INV_NEWTON_THRESHOLD, LIMB_B_2, LIMB_BITS, LIMB_MAX, lmmp_add_n_(), lmmp_add_nc_(), lmmp_assert, lmmp_cmp_(), lmmp_dec, lmmp_dec_1, lmmp_fft_next_size_(), lmmp_inc, lmmp_inv_basecase_(), lmmp_mul_(), lmmp_mul_mersenne_(), lmmp_mul_n_(), lmmp_not_(), lmmp_param_assert, lmmp_sub_n_(), lmmp_sub_nc_(), TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.
被这些函数引用 lmmp_invappr_().
函数调用图:
这是这个函数的调用关系图:| int lmmp_leading_zeros_ | ( | mp_limb_t | x | ) |
计算一个单精度数(limb)中前导零的个数
| x | 输入的64位无符号整数 |
被这些函数引用 lmmp_bninv_(), lmmp_div_(), lmmp_div_1_(), lmmp_div_2_(), lmmp_inv_(), lmmp_mod_1_(), lmmp_mod_2_(), lmmp_mulmod_ulong_(), lmmp_pow_basecase_(), lmmp_sqrt_(), lmmp_sqrt_newton_(), lmmp_to_str_() , 以及 mont63_R2().
这是这个函数的调用关系图:| int lmmp_limb_bits_ | ( | mp_limb_t | x | ) |
计算满足 2^k > x 的最小自然数k
| x | 输入的64位无符号整数 |
引用了 k.
被这些函数引用 lmmp_extract_bits_(), lmmp_from_str_(), lmmp_lehmer_extract_(), lmmp_pow_(), lmmp_to_str_() , 以及 lmmp_to_str_len_().
这是这个函数的调用关系图:| int lmmp_limb_popcnt_ | ( | mp_limb_t | x | ) |
计算一个64位无符号整数中1的个数
| x | 输入的64位无符号整数 |
引用了 k.
被这些函数引用 lmmp_factorial_size_(), lmmp_multinomial_(), lmmp_nCr_size_(), lmmp_nPr_size_() , 以及 lmmp_pow_().
这是这个函数的调用关系图:单精度数取余
| numa | 输入被除数,长度为na |
| na | 被除数的 limb 长度 |
| x | 除数(单个 limb ) |
引用了 _udiv_qrnnd_preinv, LIMB_BITS, lmmp_inv_1_() , 以及 lmmp_leading_zeros_().
被这些函数引用 lmmp_div_1_(), lmmp_gcd_1_() , 以及 lmmp_trialdiv_short_().
函数调用图:
这是这个函数的调用关系图:双精度数取余 (除数为2个limb)
| numa | 输入被除数(长度na) |
| na | 被除数的 limb 长度 |
| numb | 输入除数(长度2)[numb,2]=[numa,na] mod [numb,2] |
引用了 _u128cmp, _u128sub, _udiv_qr_3by2, a0, a1, a2, b0, b1, LIMB_BITS, lmmp_inv_2_1_(), lmmp_leading_zeros_(), r0 , 以及 r1.
被这些函数引用 lmmp_gcd_2_().
函数调用图:
这是这个函数的调用关系图:不等长大数乘法操作 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 乘积结果输出指针(需要 na+nb 的 limb 长度) |
| numa | 第一个乘数指针(较长的操作数) |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个乘数指针(较短的操作数) |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_bninv_appr_newton_(), lmmp_div_(), lmmp_div_divide_n_(), lmmp_div_mulinv_(), lmmp_div_s_(), lmmp_elem_mul_ulong_(), lmmp_from_str_divide_(), lmmp_invappr_newton_(), lmmp_invsqrt_newton_(), lmmp_mul_fft_unbalance_(), lmmp_mul_signed_(), lmmp_mul_toom22_(), lmmp_mul_toom32_(), lmmp_mul_toom33_(), lmmp_mul_toom42_(), lmmp_mul_toom42_cache_(), lmmp_mul_toom42_cache_init_(), lmmp_mul_toom42_unbalance_(), lmmp_mul_toom43_(), lmmp_mul_toom44_(), lmmp_mul_toom52_(), lmmp_mul_toom53_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_(), lmmp_mul_toom62_cache_init_(), lmmp_mul_toom62_unbalance_(), lmmp_num_heap_mul_(), lmmp_pow_win2_(), lmmp_sqrt_newton_() , 以及 pow_nPr_().
这是这个函数的调用关系图:大数乘以单limb操作 [dst,na] = [numa,na] * x
| dst | 结果输出指针 |
| numa | 被乘数指针 |
| na | 操作数的位数(limb数量) |
| x | 单个limb乘数 |
被这些函数引用 lmmp_3pow_1_(), lmmp_elem_mul_ulong_(), lmmp_from_str_(), lmmp_from_str_basecase_(), lmmp_lehmer_mul_(), lmmp_mullo_dc_(), lmmp_odd_nCr_uint_(), lmmp_odd_nCr_ushort_(), lmmp_pow_(), lmmp_sqrlo_dc_(), lmmp_to_str_(), lmmp_u32_pow_1_(), lmmp_u64_pow_1_() , 以及 lmmp_u8_pow_1_().
这是这个函数的调用关系图:基础乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_mul_(), lmmp_mul_n_(), lmmp_u16_pow_1_() , 以及 lmmp_vec_elem_mul_().
这是这个函数的调用关系图:| void lmmp_mul_fermat_ | ( | mp_ptr | dst, |
| mp_size_t | rn, | ||
| mp_srcptr | numa, | ||
| mp_size_t | na, | ||
| mp_srcptr | numb, | ||
| mp_size_t | nb | ||
| ) |
费马数模乘法 [dst,rn+1]=[numa,na]*[numb,nb] mod B^rn+1
| dst | 输出结果缓冲区,长度至少为 rn+1 |
| rn | 模运算的阶数参数,rn = lmmp_fft_next_size_((na + nb + 1) >> 1) |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
引用了 k, fft_memstack::lenw, LIMB_BITS, LIMB_BYTES, lmmp_debug_assert, lmmp_dec, lmmp_fft_(), lmmp_fft_best_k_(), lmmp_fft_extract_coef_(), lmmp_fft_memstack_(), lmmp_fft_shl_coef_(), lmmp_ifft_(), LMMP_MIN, lmmp_mul_fermat_recombine_(), lmmp_mul_fermat_recurse_(), lmmp_zero, lmmp_zero_q_(), fft_memstack::maxdepth, fft_memstack::temp_coef , 以及 fft_memstack::tempdepth.
被这些函数引用 lmmp_mul_fft_() , 以及 lmmp_mullo_fft_().
函数调用图:
这是这个函数的调用关系图:FFT乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
引用了 ALLOC_TYPE, LIMB_BITS, lmmp_add_(), lmmp_assert, lmmp_dec_1, lmmp_fft_next_size_(), lmmp_free(), lmmp_inc, lmmp_mul_fermat_(), lmmp_mul_mersenne_(), lmmp_param_assert, lmmp_shr1add_nc_(), lmmp_sub_(), lmmp_sub_1_(), lmmp_sub_n_(), lmmp_sub_nc_() , 以及 tp.
被这些函数引用 lmmp_mul_(), lmmp_mul_n_() , 以及 lmmp_sqr_().
函数调用图:
这是这个函数的调用关系图:| void lmmp_mul_fft_unbalance_ | ( | mp_ptr | dst, |
| mp_srcptr | numa, | ||
| mp_size_t | na, | ||
| mp_srcptr | numb, | ||
| mp_size_t | nb | ||
| ) |
FFT不平衡乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| hn | FFT模域参数 |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_mul_().
这是这个函数的调用关系图:| void lmmp_mul_mersenne_ | ( | mp_ptr | dst, |
| mp_size_t | rn, | ||
| mp_srcptr | numa, | ||
| mp_size_t | na, | ||
| mp_srcptr | numb, | ||
| mp_size_t | nb | ||
| ) |
梅森数模乘法 [dst,rn] = [numa,na]*[numb,nb] mod B^rn-1
| dst | 输出结果缓冲区,长度至少为 rn |
| rn | 模运算的阶数参数,rn = lmmp_fft_next_size_((na + nb + 1) >> 1) |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
引用了 k, fft_memstack::lenw, LIMB_BITS, LIMB_BYTES, lmmp_add_(), lmmp_add_1_(), lmmp_copy, lmmp_debug_assert, lmmp_dec, lmmp_fft_(), lmmp_fft_best_k_(), lmmp_fft_extract_coef_(), lmmp_fft_memstack_(), lmmp_fft_shr_coef_(), lmmp_ifft_(), LMMP_MIN, lmmp_mul_fermat_recurse_(), lmmp_shl_(), lmmp_zero, fft_memstack::maxdepth, fft_memstack::temp_coef , 以及 fft_memstack::tempdepth.
被这些函数引用 binvert_mulhi_(), lmmp_div_mulinv_(), lmmp_invappr_newton_(), lmmp_invsqrt_newton_(), lmmp_mul_fft_() , 以及 lmmp_mullo_fft_().
函数调用图:
这是这个函数的调用关系图:等长大数乘法操作 [dst,2*n] = [numa,n] * [numb,n]
| dst | 乘积结果输出指针(需要 2*n 的 limb 长度) |
| numa | 第一个乘数指针 |
| numb | 第二个乘数指针 |
| n | limb长度 |
引用了 lmmp_mul_basecase_(), lmmp_mul_fft_(), lmmp_mul_toom22_(), lmmp_mul_toom33_(), lmmp_mul_toom44_(), MUL_FFT_THRESHOLD, MUL_TOOM22_THRESHOLD, MUL_TOOM33_THRESHOLD , 以及 MUL_TOOM44_THRESHOLD.
被这些函数引用 binvert_mulhi_(), lmmp_div_mulinv_(), lmmp_invappr_newton_(), lmmp_invsqrt_newton_(), lmmp_mul_(), lmmp_mul_fermat_recurse_(), lmmp_mul_toom22_(), lmmp_mul_toom32_(), lmmp_mul_toom33_(), lmmp_mul_toom42_(), lmmp_mul_toom42_cache_(), lmmp_mul_toom42_cache_init_(), lmmp_mul_toom43_(), lmmp_mul_toom44_(), lmmp_mul_toom52_(), lmmp_mul_toom53_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_(), lmmp_mul_toom62_cache_init_() , 以及 lmmp_mullo_dc_().
函数调用图:
这是这个函数的调用关系图:Toom-22乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_mul_() , 以及 lmmp_mul_n_().
这是这个函数的调用关系图:Toom-32乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_mul_().
这是这个函数的调用关系图:Toom-33乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_mul_() , 以及 lmmp_mul_n_().
这是这个函数的调用关系图:Toom-42乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_mul_().
这是这个函数的调用关系图:| void lmmp_mul_toom42_unbalance_ | ( | mp_ptr | dst, |
| mp_srcptr | numa, | ||
| mp_size_t | na, | ||
| mp_srcptr | numb, | ||
| mp_size_t | nb | ||
| ) |
Toom-42不平衡乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_mul_().
这是这个函数的调用关系图:Toom-43乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_mul_().
这是这个函数的调用关系图:Toom-44乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_mul_() , 以及 lmmp_mul_n_().
这是这个函数的调用关系图:Toom-52乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_mul_().
这是这个函数的调用关系图:Toom-53乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_mul_().
这是这个函数的调用关系图:Toom-62乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_mul_().
这是这个函数的调用关系图:| void lmmp_mul_toom62_unbalance_ | ( | mp_ptr | dst, |
| mp_srcptr | numa, | ||
| mp_size_t | na, | ||
| mp_srcptr | numb, | ||
| mp_size_t | nb | ||
| ) |
Toom-62不平衡乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 lmmp_mul_().
这是这个函数的调用关系图:计算两个64位无符号整数相乘的高位结果 (a*b)/2^64
| a | 第一个64位无符号整数 |
| b | 第二个64位无符号整数 |
被这些函数引用 lmmp_from_str_len_(), lmmp_to_str_basecase_() , 以及 lmmp_to_str_len_().
这是这个函数的调用关系图:计算两个64位无符号整数相乘的128位结果 (a*b)
| dst | 输出结果缓冲区,存储乘积结果,长度为 2 |
| a | 第一个64位无符号整数 |
| b | 第二个64位无符号整数 |
被这些函数引用 lmmp_u16_pow_1_(), lmmp_u32_pow_1_() , 以及 lmmp_u64_pow_1_().
这是这个函数的调用关系图:低位乘法 [dst,n] = [numa,n] * [numb,n] mod B^n
| dst | 输出结果缓冲区,长度至少为 n |
| numa | 第一个输入操作数,长度为 n |
| numb | 第二个输入操作数,长度为 n |
| n | limb长度 |
低位乘法 [dst,n] = [numa,n] * [numb,n] mod B^n
| dst | 输出结果缓冲区,长度至少为 n |
| numa | 第一个输入操作数,长度为 n |
| numb | 第二个输入操作数,长度为 n |
| tp | 临时缓冲区,长度至少为 2*n |
| n | limb长度 |
被这些函数引用 lmmp_mullo_n_().
这是这个函数的调用关系图:低位FFT乘法 [dst,n] = [numa,n] * [numb,n] mod B^n
| dst | 输出结果缓冲区,长度至少为 n |
| numa | 第一个输入操作数,长度为 n |
| numb | 第二个输入操作数,长度为 n |
| scratch | 临时缓冲区,长度至少为 2*n |
| n | 缓冲区 limb 长度 |
引用了 ALLOC_TYPE, LIMB_BITS, lmmp_add_(), lmmp_assert, lmmp_copy, lmmp_dec_1, lmmp_fft_next_size_(), lmmp_free(), lmmp_inc, lmmp_mul_fermat_(), lmmp_mul_mersenne_(), lmmp_param_assert, lmmp_shr1add_nc_(), lmmp_sub_(), lmmp_sub_1_(), lmmp_sub_n_(), lmmp_sub_nc_(), scratch , 以及 tp.
被这些函数引用 lmmp_mullo_(), lmmp_mullo_n_() , 以及 lmmp_sqrlo_n_().
函数调用图:
这是这个函数的调用关系图:大数按位取反操作 [dst,na] = ~[numa,na] (对每个limb执行按位非操作)
| dst | 结果输出指针 |
| numa | 源操作数指针 |
| na | limb长度 |
被这些函数引用 lmmp_binvert_n_dc_(), lmmp_fft_shl_coef_(), lmmp_inv_basecase_(), lmmp_invappr_newton_() , 以及 lmmp_invsqrt_newton_().
这是这个函数的调用关系图:大数左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充0
| dst | 结果输出指针 |
| numa | 源操作数指针 |
| na | limb长度 |
| shl | 左移的位数 (0~63) |
被这些函数引用 lmmp_10pow_1_(), lmmp_12pow_1_(), lmmp_14pow_1_(), lmmp_6pow_1_(), lmmp_arith_seqprod_(), lmmp_bninv_(), lmmp_bninv_appr_newton_(), lmmp_div_(), lmmp_factorial_(), lmmp_fft_shl_coef_(), lmmp_inv_(), lmmp_mul_fermat_recombine_(), lmmp_mul_mersenne_(), lmmp_mul_mersenne_single_(), lmmp_mul_toom43_(), lmmp_mul_toom44_(), lmmp_mul_toom53_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_(), lmmp_mul_toom62_cache_init_(), lmmp_multinomial_(), lmmp_nCr_(), lmmp_nPr_(), lmmp_pow_1_(), lmmp_sqr_toom4_(), lmmp_sqrt_(), lmmp_sqrt_newton_(), lmmp_to_str_(), lmmp_to_str_divide_(), lmmp_toom_eval_dgr3_pm2_(), lmmp_toom_eval_pm2_(), lmmp_toom_interp5_(), lmmp_toom_interp6_(), lmmp_toom_interp7_() , 以及 pow_nPr_().
这是这个函数的调用关系图:带进位的大数左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充c的低shl位
| dst | 结果输出指针 |
| numa | 源操作数指针 |
| na | limb长度 |
| shl | 左移的位数 (0~63) |
| c | 进位值(其高(64-shl)位必须为0) |
被这些函数引用 lmmp_fft_bfy_().
这是这个函数的调用关系图:左移后按位取反操作 [dst,na] = ~([numa,na] << shl),dst的低shl位填充1
| dst | 结果输出指针 |
| numa | 源操作数指针 |
| na | limb长度 |
| shl | 左移的位数 (0~63) |
被这些函数引用 lmmp_fft_shl_coef_() , 以及 lmmp_invsqrt_newton_().
这是这个函数的调用关系图:加法后右移1位 [dst,n] = ([numa,n] + [numb,n]) >> 1
| dst | 结果输出指针 |
| numa | 第一个加数指针 |
| numb | 第二个加数指针 |
| n | limb长度 |
引用了 LIMB_BITS.
被这些函数引用 lmmp_mul_toom32_(), lmmp_toom_interp5_(), lmmp_toom_interp6_() , 以及 lmmp_toom_interp7_().
这是这个函数的调用关系图:带进位加法后右移1位 [dst,n] = ([numa,n] + [numb,n] + c) >> 1
| dst | 结果输出指针 |
| numa | 第一个加数指针 |
| numb | 第二个加数指针 |
| n | limb长度 |
| c | 初始进位值 [0|1] |
引用了 LIMB_BITS.
被这些函数引用 lmmp_mul_fft_(), lmmp_mul_fft_cache_() , 以及 lmmp_mullo_fft_().
这是这个函数的调用关系图:减法后右移1位 [dst,n] = ([numa,n] - [numb,n]) >> 1
| dst | 结果输出指针 |
| numa | 被减数指针 |
| numb | 减数指针 |
| n | 操作数的位数(limb数量) |
引用了 LIMB_BITS.
被这些函数引用 lmmp_mul_toom32_(), lmmp_toom_interp5_(), lmmp_toom_interp6_() , 以及 lmmp_toom_interp7_().
这是这个函数的调用关系图:带借位减法后右移1位 [dst,n] = ([numa,n] - [numb,n] - c) >> 1
| dst | 结果输出指针 |
| numa | 被减数指针 |
| numb | 减数指针 |
| n | limb长度 |
| c | 初始借位值 [0|1] |
引用了 LIMB_BITS.
大数右移操作 [dst,na] = [numa,na] >> shr,dst的高shr位填充0
| dst | 结果输出指针 |
| numa | 源操作数指针 |
| na | limb长度 |
| shr | 右移的位数 (0~63) |
被这些函数引用 lmmp_bninv_(), lmmp_div_(), lmmp_fft_extract_coef_(), lmmp_invsqrt_newton_(), lmmp_sqrt_(), lmmp_sqrt_newton_(), lmmp_to_str_divide_(), lmmp_toom_interp6_() , 以及 lmmp_toom_interp7_().
这是这个函数的调用关系图:带进位的大数右移操作 [dst,na] = [numa,na]>>shr,dst的高shr位填充c的高shr位
| dst | 结果输出指针 |
| numa | 源操作数指针 |
| na | limb长度 |
| shr | 右移的位数 (0~63) |
| c | 进位值(其低(64-shr)位必须为0) |
被这些函数引用 lmmp_ifft_bfy_(), lmmp_inv_() , 以及 lmmp_sqrt_divide_().
这是这个函数的调用关系图:大数平方操作 [dst,2*na] = [numa,na]^2
| dst | 平方结果输出指针(需要2*na的limb长度) |
| numa | 源操作数指针 |
| na | limb长度 |
引用了 lmmp_mul_fft_(), lmmp_sqr_basecase_(), lmmp_sqr_toom2_(), lmmp_sqr_toom3_(), lmmp_sqr_toom4_(), MUL_FFT_THRESHOLD, MUL_TOOM22_THRESHOLD, MUL_TOOM33_THRESHOLD , 以及 MUL_TOOM44_THRESHOLD.
被这些函数引用 lmmp_3pow_1_(), lmmp_9pow_1_(), lmmp_bninv_appr_newton_(), lmmp_factors_mul_(), lmmp_from_str_(), lmmp_invsqrt_newton_(), lmmp_mul_(), lmmp_mul_fermat_recurse_(), lmmp_pow_(), lmmp_pow_basecase_(), lmmp_pow_win2_(), lmmp_remove_(), lmmp_sqr_signed_(), lmmp_sqr_toom2_(), lmmp_sqr_toom3_(), lmmp_sqr_toom4_(), lmmp_sqrlo_dc_(), lmmp_sqrt_divide_(), lmmp_to_str_(), lmmp_u16_pow_1_(), lmmp_u32_pow_1_(), lmmp_u64_pow_1_() , 以及 lmmp_u8_pow_1_().
函数调用图:
这是这个函数的调用关系图:基础平方运算 [dst,2*na] = [numa,na]^2
| dst | 输出结果缓冲区,长度至少为2*na |
| numa | 输入操作数,长度为na |
| na | 输入操作数的 limb 长度 |
被这些函数引用 lmmp_sqr_(), lmmp_u32_pow_1_() , 以及 lmmp_u64_pow_1_().
这是这个函数的调用关系图:Toom-2平方运算 [dst,2*na] = [numa,na]^2
| dst | 输出结果缓冲区,长度至少为 2*na |
| numa | 输入操作数,长度为na |
| na | 输入操作数的 limb 长度 |
被这些函数引用 lmmp_sqr_().
这是这个函数的调用关系图:Toom-3平方运算 [dst,2*na] = [numa,na]^2
| dst | 输出结果缓冲区,长度至少为2*na |
| numa | 输入操作数,长度为na |
| na | 输入操作数的单精度数(limb)长度 |
被这些函数引用 lmmp_sqr_().
这是这个函数的调用关系图:Toom-4平方运算 [dst,2*na] = [numa,na]^2
| dst | 输出结果缓冲区,长度至少为2*na |
| numa | 输入操作数,长度为na |
| na | 输入操作数的单精度数(limb)长度 |
被这些函数引用 lmmp_sqr_().
这是这个函数的调用关系图:低位平方 [dst,n] = [numa,n]^2 mod B^n
| dst | 输出结果缓冲区,长度至少为 n |
| numa | 第一个输入操作数,长度为 n |
| tp | 临时缓冲区,长度至少为 2*n |
| n | limb长度 |
被这些函数引用 lmmp_sqrlo_n_().
这是这个函数的调用关系图:大数平方根和取余操作
| dsts | 平方根结果输出指针 |
| dstr | 余数结果输出指针(NULL表示不计算余数) |
| numa | 源操作数指针 |
| na | 操作数的 limb 长度 |
| nf | 精度因子 |
引用了 LIMB_BITS, lmmp_addmul_1_(), lmmp_copy, lmmp_debug_assert, lmmp_leading_zeros_(), lmmp_shl_(), lmmp_shr_(), lmmp_sqrt_1_(), lmmp_sqrt_divide_(), lmmp_sqrt_newton_(), lmmp_sub_1_(), lmmp_submul_1_(), lmmp_zero, SQRT_NEWTON_THRESHOLD, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.
函数调用图:
|
inlinestatic |
大数减法静态内联函数 [dst,na]=[numa,na]-[numb,nb]
| dst | 输出结果缓冲区,存储numa - numb |
| numa | 被减数,长度为na |
| na | 被减数的 limb 长度 |
| numb | 减数,长度为nb |
| nb | 减数的 limb 长度 |
引用了 LMMP_AORS_ , 以及 lmmp_sub_n_().
被这些函数引用 lmmp_add_signed_(), lmmp_lehmer_mul_(), lmmp_mul_fermat_recombine_(), lmmp_mul_fft_(), lmmp_mul_fft_cache_(), lmmp_mul_toom22_(), lmmp_mul_toom32_(), lmmp_mul_toom52_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_init_(), lmmp_mullo_fft_() , 以及 lmmp_toom_interp7_().
函数调用图:
这是这个函数的调用关系图:大数减单精度数静态内联函数 [dst,na]=[numa,na]-x
| dst | 输出结果缓冲区,存储numa - x |
| numa | 被减数,长度为na |
| na | 被减数的 limb 长度 |
| x | 减数(单个 limb ) |
引用了 LMMP_AORS_1_ , 以及 LMMP_SUBCB_.
被这些函数引用 lmmp_div_divide_n_(), lmmp_div_mulinv_(), lmmp_div_s_(), lmmp_mul_fft_(), lmmp_mul_fft_cache_(), lmmp_mul_toom32_(), lmmp_mul_toom42_(), lmmp_mul_toom42_cache_init_(), lmmp_mullo_fft_(), lmmp_sqrt_() , 以及 lmmp_sqrt_divide_().
这是这个函数的调用关系图:无借位的n位减法 [dst,n] = [numa,n] - [numb,n]
| dst | 结果输出指针 |
| numa | 被减数指针 |
| numb | 减数指针 |
| n | limb长度 |
引用了 a0, a1, a2, a3, b0, b1, b2, b3, r0, r1, r2 , 以及 r3.
被这些函数引用 lmmp_bninv_appr_newton_(), lmmp_div_(), lmmp_div_basecase_(), lmmp_div_divide_n_(), lmmp_div_mulinv_(), lmmp_div_s_(), lmmp_invappr_newton_(), lmmp_mul_fermat_recurse_(), lmmp_mul_fft_(), lmmp_mul_fft_cache_(), lmmp_mul_toom22_(), lmmp_mul_toom32_(), lmmp_mul_toom52_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_init_(), lmmp_mullo_fft_(), lmmp_sqr_toom2_(), lmmp_sqrt_divide_(), lmmp_sub_(), lmmp_toom_interp5_(), lmmp_toom_interp6_() , 以及 lmmp_toom_interp7_().
这是这个函数的调用关系图:带借位的n位减法 [dst,n] = [numa,n] - [numb,n] - c
| dst | 结果输出指针 |
| numa | 被减数指针 |
| numb | 减数指针 |
| n | limb长度 |
| c | 初始借位值 [0|1] |
引用了 a0, a1, a2, a3, b0, b1, b2, b3, r0, r1, r2 , 以及 r3.
被这些函数引用 lmmp_add_n_sub_n_(), lmmp_div_(), lmmp_div_mulinv_(), lmmp_fft_bfy_(), lmmp_ifft_bfy_(), lmmp_invappr_newton_(), lmmp_mul_fft_(), lmmp_mul_fft_cache_() , 以及 lmmp_mullo_fft_().
这是这个函数的调用关系图:大数乘以单limb并累减操作 [numa,n] -= [numb,n] * b
| numa | 被减数指针(结果也存储在此) |
| numb | 乘数指针 |
| n | limb长度 |
| b | 乘数 |
被这些函数引用 lmmp_div_(), lmmp_div_basecase_(), lmmp_sqrt_() , 以及 lmmp_toom_interp7_().
这是这个函数的调用关系图:减法结合左移1位操作 [dst,n] = [numa,n] - ([numb,n] << 1)
| dst | 结果输出指针 |
| numa | 被减数指针 |
| numb | 减数指针(先左移1位) |
| n | limb长度 |
引用了 LIMB_BITS.
| int lmmp_tailing_zeros_ | ( | mp_limb_t | x | ) |
计算一个单精度数(limb)中末尾零的个数
| x | 输入的64位无符号整数 |
被这些函数引用 lmmp_from_str_(), lmmp_gcd_11_(), lmmp_gcd_22_(), lmmp_pow_(), lmmp_pow_1_(), lmmp_to_str_() , 以及 pow_nPr_().
这是这个函数的调用关系图:大数转字符串操作 [numa,na,B] to [dst,return value,base]
| dst | 字符串结果输出指针 |
| numa | 大数源指针 |
| na | 大数的 limb 长度 |
| base | 目标字符串的进制基数 |
引用了 BALLOC_TYPE, mp_basepow_t::base, mp_basepow_t::digits, mp_base_t::digits_in_limb, DIV_MULINV_L_THRESHOLD, mp_basepow_t::invp, mp_base_t::large_base, LIMB_BITS, lmmp_bases_table, lmmp_copy, lmmp_div_inv_size_(), lmmp_from_str_len_(), lmmp_inv_prediv_(), lmmp_leading_zeros_(), lmmp_limb_bits_(), lmmp_mul_1_(), LMMP_POW2_Q, lmmp_shl_(), lmmp_sqr_(), lmmp_tailing_zeros_(), lmmp_to_str_basecase_(), lmmp_to_str_divide_(), lmmp_to_str_len_(), mp_basepow_t::ni, mp_basepow_t::np, mp_basepow_t::p, TEMP_DECL, TEMP_FREE, TO_STR_BASEPOW_THRESHOLD, tp , 以及 mp_basepow_t::zeros.
函数调用图:计算大数转换为字符串,字符串需要的缓冲区长度
| numa | 输入大数,长度为na |
| na | 大数的 limb 长度 |
| base | 目标基数(2~256) |
引用了 LIMB_BITS, lmmp_bases_table, lmmp_limb_bits_(), lmmp_mulh_() , 以及 lmmp_param_assert.
被这些函数引用 lmmp_to_str_().
函数调用图:
这是这个函数的调用关系图:大数判零函数(内联)
| p | 指向大数起始位置的指针 |
| n | 大数的单精度数(limb)长度 |
被这些函数引用 lmmp_invsqrt_newton_(), lmmp_mul_fermat_(), lmmp_mul_fermat_single_(), lmmp_mul_toom22_(), lmmp_mul_toom32_(), lmmp_mul_toom42_(), lmmp_mul_toom42_cache_init_(), lmmp_mul_toom52_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_init_() , 以及 try_div_().
这是这个函数的调用关系图: