|
LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
|
lmmpn.h 的引用(Include)关系图:
此图展示该文件直接或间接的被哪些文件引用了:宏定义 | |
| #define | INLINE_ static inline |
| Copyright (C) 2026 HJimmyK(Jericho Knox) | |
| #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)) |
Copyright (C) 2026 HJimmyK(Jericho Knox)
This file is part of LAMMP.
LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed WITHOUT ANY WARRANTY.
| #define lmmp_dec | ( | p | ) |
大数减指定值宏(预期无借位)
| p | 指向大数起始位置的指针 |
| dec | 要减的单精度数值 |
| #define lmmp_inc | ( | p | ) |
| #define lmmp_inc_1 | ( | p, | |
| inc | |||
| ) |
大数加指定值宏(预期无进位)
| 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_ , 以及 n.
被这些函数引用 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_divexact_unbalanced_(), 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, n, numb, r0, r1, r2 , 以及 r3.
被这些函数引用 lmmp_add_(), lmmp_binvert_n_dc_(), lmmp_binvert_unbalanced_(), 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长度 |
同时执行n位加法和减法 ([dsta,n],[dstb,n]) = ([numa,n]+[numb,n],[numa,n]-[numb,n])
This file is part of LAMMP.
LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed WITHOUT ANY WARRANTY.
See https://www.gnu.org/licenses/.
在文件 add_n_sub_n.c 第 20 行定义.
引用了 lmmp_add_nc_(), lmmp_copy, LMMP_MIN, lmmp_sub_nc_(), n, numb, 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] |
带进位的n位加法 [dst,n] = [numa,n] + [numb,n] + c
This file is part of LAMMP.
LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed WITHOUT ANY WARRANTY.
See https://www.gnu.org/licenses/.
引用了 a0, a1, a2, a3, b0, b1, b2, b3, c, n, numb, 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长度 |
引用了 c, LIMB_BITS, n , 以及 numb.
被这些函数引用 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, n , 以及 numb.
被这些函数引用 lmmp_add_signed_(), lmmp_cbrt_3_(), lmmp_cbrt_6_(), lmmp_div_(), lmmp_div_basecase_(), lmmp_div_mulinv_(), lmmp_div_s_(), lmmp_divexact_unbalanced_(), 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_(), n, numb, 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_(), n , 以及 t.
被这些函数引用 lmmp_bninv_(), lmmp_cbrtapprox_3_(), lmmp_cbrtapprox_6_(), lmmp_div_() , 以及 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_, n, numb, 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])) |
被这些函数引用 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])) |
被这些函数引用 lmmp_div_(), lmmp_div_s_() , 以及 lmmp_inv_basecase_().
这是这个函数的调用关系图:计算预计算逆元的尺寸
| nq | 商的 limb 长度 |
| nb | 除数的 limb 长度 |
引用了 n.
被这些函数引用 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 长度 |
被这些函数引用 lmmp_div_(), lmmp_div_s_() , 以及 lmmp_to_str_divide_().
这是这个函数的调用关系图:除法运算
| dstq | 输出商的缓冲区,长度至少为na-nb |
| numa | 输入被除数(长度na),运算后存储余数(长度nb) |
| na | 被除数的 limb 长度 |
| numb | 输入除数,长度为nb |
| nb | 除数的 limb 长度 |
被这些函数引用 lmmp_div_divide_(), lmmp_invsqrt_newton_(), lmmp_sqrt_divide_() , 以及 lmmp_to_str_divide_().
这是这个函数的调用关系图:| 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 , 以及 n.
被这些函数引用 binvert_mulhi_(), lmmp_div_mulinv_(), lmmp_invappr_newton_(), lmmp_invsqrt_newton_(), lmmp_mul_fft_(), lmmp_mul_fft_unbalance_(), lmmp_mulhi_n_() , 以及 lmmp_mullo_fft_().
函数调用图:
这是这个函数的调用关系图:字符串转大数操作 [src,len,base] to [dst,return value,B]
| dst | 大数结果输出指针 |
| src | 字符串源指针 |
| len | 字符串长度 |
| base | 字符串的进制基数 |
在文件 from_str.c 第 154 行定义.
引用了 BALLOC_TYPE, 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_param_assert, LMMP_POW2_Q, lmmp_sqr_, lmmp_tailing_zeros_, n, TEMP_DECL, TEMP_FREE , 以及 tp.
函数调用图:计算字符串转大数所需的 limb 缓冲区长度
| src | 输入字符串指针 |
| len | 字符串长度 |
| base | 字符串的基数(2~256) |
计算字符串转大数所需的 limb 缓冲区长度
This file is part of LAMMP.
LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed WITHOUT ANY WARRANTY.
See https://www.gnu.org/licenses/.
在文件 from_str.c 第 23 行定义.
引用了 lmmp_bases_table, lmmp_mulh_, lmmp_param_assert , 以及 n.
被这些函数引用 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, n, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.
函数调用图:1阶逆元计算 (inv1)
| x | 输入的64位无符号整数,最高位为1(MSB(x)=1) |
引用了 LIMB_BITS, LIMB_MAX, LLIMB_MASK , 以及 n.
被这些函数引用 lmmp_div_1_(), lmmp_div_1_s_(), lmmp_inv_basecase_(), lmmp_mod_1_() , 以及 lmmp_mulmod_ulong_().
这是这个函数的调用关系图:2-1阶逆元计算 (inv21)
| xh | 输入数的高64位部分 |
| xl | 输入数的低64位部分 |
2-1阶逆元计算 (inv21)
This file is part of LAMMP.
LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed WITHOUT ANY WARRANTY.
See https://www.gnu.org/licenses/.
引用了 _umul64to128_(), LIMB_BITS, LIMB_MAX, LLIMB_MASK , 以及 n.
被这些函数引用 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 长度 |
除法前的逆元预计算,[dst,ni] = invappr( (ni+1 MSLs of numa) + 1 ) / B
| dst | 输出预计算逆元的缓冲区,长度为ni |
| numa | 输入操作数,长度为na |
| na | 输入操作数的 limb 长度 |
| ni | 预计算逆元的目标尺寸 |
除法前的逆元预计算,[dst,ni] = invappr( (ni+1 MSLs of numa) + 1 ) / B
This file is part of LAMMP.
LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed WITHOUT ANY WARRANTY.
See https://www.gnu.org/licenses/.
在文件 div_mulinv.c 第 22 行定义.
引用了 LIMB_B_2, lmmp_add_1_(), lmmp_copy, lmmp_invappr_(), lmmp_param_assert, lmmp_zero, n, TALLOC_TYPE, TEMP_DECL, TEMP_FREE , 以及 tp.
被这些函数引用 lmmp_div_(), lmmp_div_s_() , 以及 lmmp_to_str_().
函数调用图:
这是这个函数的调用关系图:近似逆元计算 (invappr)
| dst | 输出结果缓冲区,长度为na |
| numa | 输入操作数,长度为na |
| na | 输入操作数的 limb 长度 |
被这些函数引用 lmmp_inv_prediv_().
这是这个函数的调用关系图:近似逆元计算(牛顿迭代法)
| dst | 输出结果缓冲区,长度为na |
| numa | 输入操作数,长度为na |
| na | 输入操作数的 limb 长度 |
| int lmmp_leading_zeros_ | ( | mp_limb_t | x | ) |
计算一个单精度数(limb)中前导零的个数
| x | 输入的64位无符号整数 |
引用了 n.
| int lmmp_limb_bits_ | ( | mp_limb_t | x | ) |
计算满足 2^k > x 的最小自然数k
| x | 输入的64位无符号整数 |
计算满足 2^k > x 的最小自然数k
This file is part of LAMMP.
LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed WITHOUT ANY WARRANTY.
| int lmmp_limb_popcnt_ | ( | mp_limb_t | x | ) |
计算一个64位无符号整数中1的个数
| x | 输入的64位无符号整数 |
单精度数取余
| numa | 输入被除数,长度为na |
| na | 被除数的 limb 长度 |
| x | 除数(单个 limb ) |
引用了 _udiv_qrnnd_preinv, LIMB_BITS, lmmp_inv_1_(), lmmp_leading_zeros_, n , 以及 t.
被这些函数引用 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_, n, numb, 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_cube_(), lmmp_div_(), lmmp_div_divide_n_(), lmmp_div_mulinv_(), lmmp_div_s_(), lmmp_divexact_divide_(), lmmp_elem_mul_ulong_(), lmmp_from_str_divide_(), lmmp_huff_tree_mul_(), 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_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_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_n_(), lmmp_mul_(), lmmp_mul_n_() , 以及 lmmp_u16_pow_1_().
这是这个函数的调用关系图:| 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, 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, n , 以及 numb.
被这些函数引用 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_(), n, numb , 以及 tp.
被这些函数引用 __lmmp_mul_n_(), __lmmp_sqr_(), 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, 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, n , 以及 numb.
被这些函数引用 binvert_mulhi_(), lmmp_div_mulinv_(), lmmp_invappr_newton_(), lmmp_invsqrt_newton_(), lmmp_mul_fft_(), lmmp_mulhi_n_() , 以及 lmmp_mullo_fft_().
函数调用图:
这是这个函数的调用关系图:等长大数乘法操作 [dst,2*n] = [numa,n] * [numb,n]
| dst | 乘积结果输出指针(需要 2*n 的 limb 长度) |
| numa | 第一个乘数指针 |
| numb | 第二个乘数指针 |
| n | limb长度 |
Toom-22乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
| dst | 输出结果缓冲区,长度至少为 na+nb |
| numa | 第一个输入操作数,长度为 na |
| na | 第一个操作数的 limb 长度 |
| numb | 第二个输入操作数,长度为 nb |
| nb | 第二个操作数的 limb 长度 |
被这些函数引用 __lmmp_mul_n_(), 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_n_(), 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_n_(), 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)/B
| a | 第一个64位无符号整数 |
| b | 第二个64位无符号整数 |
计算两个64位无符号整数相乘的128位结果 (a*b)
| dst | 输出结果缓冲区,存储乘积结果,长度为 2 |
| a | 第一个64位无符号整数 |
| b | 第二个64位无符号整数 |
低位乘法 [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_() , 以及 lmmp_mullo_n_().
这是这个函数的调用关系图:低位FFT乘法 [dst,n] = [numa,n] * [numb,n] mod B^n
| dst | 输出结果缓冲区,长度至少为 n |
| numa | 第一个输入操作数,长度为 n |
| numb | 第二个输入操作数,长度为 n |
| scratch | 临时缓冲区,长度至少为 2*n |
| n | 缓冲区 limb 长度 |
低位FFT乘法 [dst,n] = [numa,n] * [numb,n] mod B^n
This file is part of LAMMP.
LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed WITHOUT ANY WARRANTY.
See https://www.gnu.org/licenses/.
引用了 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_(), n, numb, scratch , 以及 tp.
被这些函数引用 lmmp_mullo_(), lmmp_mullo_n_(), lmmp_mullo_n_() , 以及 lmmp_sqrlo_n_().
函数调用图:
这是这个函数的调用关系图:大数按位取反操作 [dst,na] = ~[numa,na] (对每个limb执行按位非操作)
| dst | 结果输出指针 |
| numa | 源操作数指针 |
| na | limb长度 |
被这些函数引用 lmmp_binvert_n_dc_(), lmmp_binvert_unbalanced_(), 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) |
大数左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充0
This file is part of LAMMP.
LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed WITHOUT ANY WARRANTY.
See https://www.gnu.org/licenses/.
引用了 LIMB_BITS, lmmp_copy , 以及 n.
被这些函数引用 lmmp_10pow_1_(), lmmp_12pow_1_(), lmmp_14pow_1_(), lmmp_2factorial_(), lmmp_6pow_1_(), lmmp_arith_seqprod_(), lmmp_bninv_(), lmmp_bninv_appr_newton_(), lmmp_div_(), lmmp_factorial_(), lmmp_fft_shl_coef_(), lmmp_hyperfac_(), 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_superfac_(), 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) |
引用了 c, LIMB_BITS, lmmp_copy , 以及 n.
被这些函数引用 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长度 |
引用了 c, l, LIMB_BITS, n , 以及 numb.
被这些函数引用 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] |
引用了 c, l, LIMB_BITS, n , 以及 numb.
被这些函数引用 lmmp_mul_fft_(), lmmp_mul_fft_cache_() , 以及 lmmp_mullo_fft_().
这是这个函数的调用关系图:减法后右移1位 [dst,n] = ([numa,n] - [numb,n]) >> 1
| dst | 结果输出指针 |
| numa | 被减数指针 |
| numb | 减数指针 |
| n | 操作数的位数(limb数量) |
引用了 c, l, LIMB_BITS, n , 以及 numb.
被这些函数引用 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] |
大数右移操作 [dst,na] = [numa,na]>>shr,dst的高shr位填充0
| dst | 结果输出指针 |
| numa | 源操作数指针 |
| na | limb长度 |
| shr | 右移的位数 (0~63) |
大数右移操作 [dst,na] = [numa,na]>>shr,dst的高shr位填充0
This file is part of LAMMP.
LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed WITHOUT ANY WARRANTY.
See https://www.gnu.org/licenses/.
引用了 LIMB_BITS, lmmp_copy , 以及 n.
被这些函数引用 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) |
引用了 c, LIMB_BITS, lmmp_copy , 以及 n.
被这些函数引用 lmmp_ifft_bfy_(), lmmp_inv_() , 以及 lmmp_sqrt_divide_().
这是这个函数的调用关系图:大数平方操作 [dst,2*na] = [numa,na]^2
| dst | 平方结果输出指针(需要2*na的limb长度) |
| numa | 源操作数指针 |
| na | limb长度 |
基础平方运算 [dst,2*na] = [numa,na]^2
| dst | 输出结果缓冲区,长度至少为2*na |
| numa | 输入操作数,长度为na |
| na | 输入操作数的 limb 长度 |
被这些函数引用 __lmmp_sqr_(), 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_() , 以及 lmmp_sqr_().
这是这个函数的调用关系图:Toom-3平方运算 [dst,2*na] = [numa,na]^2
| dst | 输出结果缓冲区,长度至少为2*na |
| numa | 输入操作数,长度为na |
| na | 输入操作数的单精度数(limb)长度 |
被这些函数引用 __lmmp_sqr_() , 以及 lmmp_sqr_().
这是这个函数的调用关系图:Toom-4平方运算 [dst,2*na] = [numa,na]^2
| dst | 输出结果缓冲区,长度至少为2*na |
| numa | 输入操作数,长度为na |
| na | 输入操作数的单精度数(limb)长度 |
被这些函数引用 __lmmp_sqr_() , 以及 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, n, 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_() , 以及 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_mulhi_n_(), 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, n, numb, r0, r1, r2 , 以及 r3.
被这些函数引用 lmmp_bninv_appr_newton_(), lmmp_div_(), lmmp_div_basecase_(), lmmp_div_divide_n_(), lmmp_div_mulinv_(), lmmp_div_s_(), lmmp_divexact_divide_(), lmmp_divexact_unbalanced_(), 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] |
带借位的n位减法 [dst,n] = [numa,n] - [numb,n] - c
This file is part of LAMMP.
LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed WITHOUT ANY WARRANTY.
See https://www.gnu.org/licenses/.
引用了 a0, a1, a2, a3, b0, b1, b2, b3, c, n, numb, 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_divexact_basecase_(), lmmp_sqrt_() , 以及 lmmp_toom_interp7_().
这是这个函数的调用关系图:减法结合左移1位操作 [dst,n] = [numa,n] - ([numb,n] << 1)
| dst | 结果输出指针 |
| numa | 被减数指针 |
| numb | 减数指针(先左移1位) |
| n | limb长度 |
| int lmmp_tailing_zeros_ | ( | mp_limb_t | x | ) |
计算一个单精度数(limb)中末尾零的个数
| x | 输入的64位无符号整数 |
引用了 n.
大数转字符串操作 [numa,na,B] to [dst,return value,base]
| dst | 字符串结果输出指针 |
| numa | 大数源指针 |
| na | 大数的 limb 长度 |
| base | 目标字符串的进制基数 |
引用了 BALLOC_TYPE, mp_base_t::digits_in_limb, DIV_MULINV_L_THRESHOLD, 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_param_assert, LMMP_POW2_Q, lmmp_shl_(), lmmp_sqr_, lmmp_tailing_zeros_, lmmp_to_str_basecase_(), lmmp_to_str_divide_(), lmmp_to_str_len_(), n, TEMP_DECL, TEMP_FREE, TO_STR_BASEPOW_THRESHOLD , 以及 tp.
函数调用图:计算大数转换为字符串,字符串需要的缓冲区长度
| numa | 输入大数,长度为na |
| na | 大数的 limb 长度 |
| base | 目标基数(2~256) |
计算大数转换为字符串,字符串需要的缓冲区长度
This file is part of LAMMP.
LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed WITHOUT ANY WARRANTY.
See https://www.gnu.org/licenses/.
引用了 LIMB_BITS, lmmp_bases_table, lmmp_limb_bits_, lmmp_mulh_, lmmp_param_assert , 以及 n.
被这些函数引用 lmmp_to_str_().
这是这个函数的调用关系图:大数判零函数(内联)
| p | 指向大数起始位置的指针 |
| n | 大数的单精度数(limb)长度 |
引用了 n.
被这些函数引用 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_().
这是这个函数的调用关系图: