|
LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
|
#include "../../include/lammp/impl/mparam.h"#include "../../include/lammp/impl/tmp_alloc.h"#include "../../include/lammp/lmmpn.h"
mul_fft.c 的引用(Include)关系图:结构体 | |
| struct | fft_cache |
| struct | fft_memstack |
宏定义 | |
| #define | _FFT_TABLE_ENTRY(n) {((mp_size_t)3 << (2 * (n) - 5)) + 1, (n)} |
| #define | _FFT_TABLE_ENTRY4(n) _FFT_TABLE_ENTRY(n), _FFT_TABLE_ENTRY((n) + 1), _FFT_TABLE_ENTRY((n) + 2), _FFT_TABLE_ENTRY((n) + 3) |
函数 | |
| static void | lmmp_fft_ (fft_memstack *ms, mp_ptr *coef, mp_size_t k, mp_size_t w) |
| static void | lmmp_fft_4_ (fft_memstack *ms, mp_ptr *coef, mp_size_t k, mp_size_t w) |
| static void | lmmp_fft_b1_ (fft_memstack *ms, mp_ptr *coef, mp_size_t dis, mp_size_t k, mp_size_t w, mp_size_t w0) |
| FFT递归函数 | |
| static mp_size_t | lmmp_fft_best_k_ (mp_size_t n) |
| 查找对于 m>=n 的模 B^m+1 FFT运算的最优k值 | |
| static void | lmmp_fft_bfy_ (fft_memstack *ms, mp_ptr *coef, mp_size_t wing, mp_size_t w) |
| FFT蝶形运算(Butterfly Operation) (a,b) = (a + b, (a-b) << w ) mod 2^n+1 a=[coef[0],ms->lenw+1], b=[coef[wing],ms->lenw+1], n=ms->lenw * LIMB_BITS | |
| static void | lmmp_fft_extract_coef_ (mp_ptr dst, mp_srcptr numa, mp_size_t bitoffset, mp_size_t bits, mp_size_t lenw) |
| [dst,lenw+1] = [(bit*)numa+bitoffset, bits] | |
| static void * | lmmp_fft_memstack_ (fft_memstack *ms, mp_size_t size) |
| FFT内存栈的分配/释放接口 | |
| mp_size_t | lmmp_fft_next_size_ (mp_size_t n) |
| 计算FFT运算所需的最小规整化长度(向上取整到2^k的倍数) | |
| static void | lmmp_fft_shl_coef_ (fft_memstack *ms, mp_ptr *coef, mp_size_t shl) |
| 对模 2^n+1 的系数执行左移操作 | |
| static void | lmmp_fft_shr_coef_ (fft_memstack *ms, mp_ptr *coef, mp_size_t shr) |
| 对模 2^n+1 的系数执行右移操作 右移shr位 = 左移(2n - shr)位(mod 2^n+1的循环特性) | |
| static void | lmmp_ifft_ (fft_memstack *ms, mp_ptr *coef, mp_size_t k, mp_size_t w) |
| static void | lmmp_ifft_4_ (fft_memstack *ms, mp_ptr *coef, mp_size_t k, mp_size_t w) |
| static void | lmmp_ifft_b1_ (fft_memstack *ms, mp_ptr *coef, mp_size_t dis, mp_size_t k, mp_size_t w, mp_size_t w0) |
| static void | lmmp_ifft_bfy_ (fft_memstack *ms, mp_ptr *coef, mp_size_t wing, mp_size_t w) |
| FFT蝶形运算(Butterfly Operation) (a,b) = (a+(b>>w), a-(b>>w)) mod 2^n+1 a=[coef[0],ms->lenw+1], b=[coef[wing],ms->lenw+1], n=ms->lenw * LIMB_BITS | |
| 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 | |
| static void | lmmp_mul_fermat_recombine_ (fft_memstack *ms, mp_ptr dst, mp_ptr *pfca, mp_size_t K, mp_size_t k, mp_size_t n, mp_size_t M, mp_size_t rn) |
| 费马变换 模 B^n+1 乘法的结果合并 | |
| static void | lmmp_mul_fermat_recurse_ (fft_memstack *ms, mp_ptr *pc1, mp_ptr *pc2, mp_size_t K0) |
| 费马变换乘法递归函数(核心乘法逻辑) | |
| static void | lmmp_mul_fermat_single_ (mp_ptr dst, mp_size_t rn, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb, fft_cache *GH) |
| 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] | |
| static void | lmmp_mul_fft_cache_ (mp_ptr dst, mp_size_t hn, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb, fft_cache *GH) |
| static void | lmmp_mul_fft_cache_free_ (fft_cache *GH) |
| void | lmmp_mul_fft_unbalance_ (mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t na, mp_srcptr restrict numb, mp_size_t 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 | |
| static void | lmmp_mul_mersenne_single_ (mp_ptr dst, mp_size_t rn, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb, fft_cache *GH) |
变量 | |
| static const mp_size_t | lmmp_fft_table_ [][2] |
| struct fft_cache |
fft_cache 的协作图:| 成员变量 | ||
|---|---|---|
| int | fermat_flag | |
| int | mersenne_flag | |
| fft_memstack | msr_fermat | |
| fft_memstack | msr_mersenne | |
| mp_ptr | temp_coef_fermat | |
| mp_ptr | temp_coef_mersenne | |
| struct fft_memstack |
fft_memstack 的协作图:| 成员变量 | ||
|---|---|---|
| mp_size_t | lenw | |
| mp_ssize_t | maxdepth | |
| void * | mem[16] | |
| mp_size_t | memsize[16] | |
| mp_ptr | temp_coef | |
| mp_ssize_t | tempdepth | |
| #define _FFT_TABLE_ENTRY4 | ( | n | ) | _FFT_TABLE_ENTRY(n), _FFT_TABLE_ENTRY((n) + 1), _FFT_TABLE_ENTRY((n) + 2), _FFT_TABLE_ENTRY((n) + 3) |
|
static |
引用了 k, lmmp_fft_4_() , 以及 lmmp_fft_b1_().
被这些函数引用 lmmp_mul_fermat_(), lmmp_mul_fermat_recurse_(), lmmp_mul_fermat_single_(), lmmp_mul_mersenne_() , 以及 lmmp_mul_mersenne_single_().
函数调用图:
这是这个函数的调用关系图:
|
static |
引用了 k, lmmp_fft_4_() , 以及 lmmp_fft_bfy_().
被这些函数引用 lmmp_fft_() , 以及 lmmp_fft_4_().
函数调用图:
这是这个函数的调用关系图:
|
static |
FFT递归函数
| ms | - 内存栈结构体指针 |
| coef | - 系数数组指针数组 |
| dis | - 索引步长 |
| k | - FFT层数(递归深度) |
| w | - 每次蝶形运算的移位基数 |
| w0 | - 初始移位偏移 |
引用了 k, lmmp_fft_b1_(), lmmp_fft_bfy_() , 以及 w0.
被这些函数引用 lmmp_fft_() , 以及 lmmp_fft_b1_().
函数调用图:
这是这个函数的调用关系图:查找对于 m>=n 的模 B^m+1 FFT运算的最优k值
| n | - 输入的机器字长度 |
引用了 k , 以及 lmmp_fft_table_.
被这些函数引用 lmmp_fft_next_size_(), lmmp_mul_fermat_(), lmmp_mul_fermat_recurse_(), lmmp_mul_fermat_single_(), lmmp_mul_mersenne_() , 以及 lmmp_mul_mersenne_single_().
这是这个函数的调用关系图:
|
static |
FFT蝶形运算(Butterfly Operation) (a,b) = (a + b, (a-b) << w ) mod 2^n+1 a=[coef[0],ms->lenw+1], b=[coef[wing],ms->lenw+1], n=ms->lenw * LIMB_BITS
| ms | - 内存栈结构体指针 |
| coef | - 系数数组指针数组(coef[0]=a, coef[wing]=b) |
| wing | - b的索引 |
| w | - 左移的比特数(0<=w<n) |
引用了 fft_memstack::lenw, LIMB_BITS, lmmp_add_nc_(), lmmp_dec, lmmp_dec_1, lmmp_inc_1, LMMP_MIN, lmmp_shl_c_(), lmmp_sub_nc_(), PART_SIZE , 以及 fft_memstack::temp_coef.
被这些函数引用 lmmp_fft_4_() , 以及 lmmp_fft_b1_().
函数调用图:
这是这个函数的调用关系图:
|
static |
[dst,lenw+1] = [(bit*)numa+bitoffset, bits]
| dst | - 输出系数数组(长度lenw+1) |
| numa | - 输入大数指针 |
| bitoffset | - 起始比特偏移量(>=0) |
| bits | - 提取的比特数(0 < bits <= LIMB_BITS*lenw) |
| lenw | - 输出系数的机器字长度 |
引用了 LIMB_BITS, LIMB_MAX, lmmp_copy, lmmp_shr_() , 以及 lmmp_zero.
被这些函数引用 lmmp_mul_fermat_(), lmmp_mul_fermat_recurse_(), lmmp_mul_fermat_single_(), lmmp_mul_mersenne_() , 以及 lmmp_mul_mersenne_single_().
函数调用图:
这是这个函数的调用关系图:
|
static |
FFT内存栈的分配/释放接口
| ms | - 内存栈结构体栈帧 |
| size | - 分配大小(字节),size=0表示释放当前层内存 |
引用了 lmmp_alloc(), lmmp_debug_assert, lmmp_free(), fft_memstack::maxdepth, fft_memstack::mem, fft_memstack::memsize , 以及 fft_memstack::tempdepth.
被这些函数引用 lmmp_mul_fermat_(), lmmp_mul_fermat_recurse_(), lmmp_mul_fermat_single_(), lmmp_mul_fft_cache_free_(), lmmp_mul_mersenne_() , 以及 lmmp_mul_mersenne_single_().
函数调用图:
这是这个函数的调用关系图:计算FFT运算所需的最小规整化长度(向上取整到2^k的倍数)
计算满足 >=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_().
函数调用图:
这是这个函数的调用关系图:
|
static |
对模 2^n+1 的系数执行左移操作
| ms | - 内存栈结构体指针 |
| coef | - 输入输出系数数组指针(指针的指针,用于交换内存) |
| shl | - 左移的比特数(0<shl<2*n) |
引用了 fft_memstack::lenw, LIMB_BITS, lmmp_copy, lmmp_dec, lmmp_dec_1, lmmp_inc, lmmp_inc_1, lmmp_not_(), lmmp_shl_(), lmmp_shlnot_() , 以及 fft_memstack::temp_coef.
被这些函数引用 lmmp_fft_shr_coef_(), lmmp_mul_fermat_(), lmmp_mul_fermat_recurse_() , 以及 lmmp_mul_fermat_single_().
函数调用图:
这是这个函数的调用关系图:
|
static |
对模 2^n+1 的系数执行右移操作 右移shr位 = 左移(2n - shr)位(mod 2^n+1的循环特性)
| ms | - 内存栈结构体指针 |
| coef | - 输入输出系数数组指针 |
| shr | - 右移的比特数(0 < shr < 2*n) |
引用了 fft_memstack::lenw, LIMB_BITS , 以及 lmmp_fft_shl_coef_().
被这些函数引用 lmmp_mul_fermat_recombine_(), lmmp_mul_mersenne_() , 以及 lmmp_mul_mersenne_single_().
函数调用图:
这是这个函数的调用关系图:
|
static |
引用了 k, lmmp_ifft_4_() , 以及 lmmp_ifft_b1_().
被这些函数引用 lmmp_mul_fermat_(), lmmp_mul_fermat_recurse_(), lmmp_mul_fermat_single_(), lmmp_mul_mersenne_() , 以及 lmmp_mul_mersenne_single_().
函数调用图:
这是这个函数的调用关系图:
|
static |
引用了 k, lmmp_ifft_4_() , 以及 lmmp_ifft_bfy_().
被这些函数引用 lmmp_ifft_() , 以及 lmmp_ifft_4_().
函数调用图:
这是这个函数的调用关系图:
|
static |
引用了 k, lmmp_ifft_b1_(), lmmp_ifft_bfy_() , 以及 w0.
被这些函数引用 lmmp_ifft_() , 以及 lmmp_ifft_b1_().
函数调用图:
这是这个函数的调用关系图:
|
static |
FFT蝶形运算(Butterfly Operation) (a,b) = (a+(b>>w), a-(b>>w)) mod 2^n+1 a=[coef[0],ms->lenw+1], b=[coef[wing],ms->lenw+1], n=ms->lenw * LIMB_BITS
| ms | - 内存栈结构体指针 |
| coef | - 系数数组指针数组(coef[0]=a, coef[wing]=b) |
| wing | - b的索引 |
| w | - 左移的比特数(0<=w<n) |
引用了 fft_memstack::lenw, LIMB_BITS, lmmp_add_nc_(), lmmp_dec, lmmp_dec_1, lmmp_inc, lmmp_inc_1, LMMP_MIN, lmmp_shr_c_(), lmmp_sub_nc_(), PART_SIZE , 以及 fft_memstack::temp_coef.
被这些函数引用 lmmp_ifft_4_() , 以及 lmmp_ifft_b1_().
函数调用图:
这是这个函数的调用关系图:| 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_().
函数调用图:
这是这个函数的调用关系图:
|
static |
费马变换 模 B^n+1 乘法的结果合并
| ms | - 内存栈结构体指针 |
| dst | - 输出结果数组 |
| pfca | - FFT系数数组指针数组 |
| K | - FFT块数(2^k) |
| k | - FFT层数 |
| n | - 系数总比特数 |
| M | - 每个块的比特数 |
| rn | - 结果长度(机器字) |
引用了 k, fft_memstack::lenw, LIMB_BITS, lmmp_add_(), lmmp_add_1_(), lmmp_copy, lmmp_dec, lmmp_dec_1, lmmp_fft_shr_coef_(), lmmp_inc_1, lmmp_shl_() , 以及 lmmp_sub_().
被这些函数引用 lmmp_mul_fermat_(), lmmp_mul_fermat_recurse_() , 以及 lmmp_mul_fermat_single_().
函数调用图:
这是这个函数的调用关系图:
|
static |
费马变换乘法递归函数(核心乘法逻辑)
| ms | - 内存栈结构体指针 |
| pc1 | - 第一个数的FFT系数数组指针数组 |
| pc2 | - 第二个数的FFT系数数组指针数组 |
| K0 | - FFT块数 |
引用了 k, fft_memstack::lenw, LIMB_BITS, LIMB_BYTES, lmmp_debug_assert, lmmp_fft_(), lmmp_fft_best_k_(), lmmp_fft_extract_coef_(), lmmp_fft_memstack_(), lmmp_fft_shl_coef_(), lmmp_ifft_(), lmmp_inc_1, lmmp_mul_fermat_recombine_(), lmmp_mul_fermat_recurse_(), lmmp_mul_n_(), lmmp_sqr_(), lmmp_sub_n_(), MUL_FFT_MODF_THRESHOLD , 以及 fft_memstack::temp_coef.
被这些函数引用 lmmp_mul_fermat_(), lmmp_mul_fermat_recurse_(), lmmp_mul_fermat_single_(), lmmp_mul_mersenne_() , 以及 lmmp_mul_mersenne_single_().
函数调用图:
这是这个函数的调用关系图:
|
static |
引用了 fft_cache::fermat_flag, k, fft_memstack::lenw, LIMB_BITS, LIMB_BYTES, lmmp_assert, 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_cache::msr_fermat, fft_memstack::temp_coef, fft_cache::temp_coef_fermat , 以及 fft_memstack::tempdepth.
被这些函数引用 lmmp_mul_fft_cache_().
函数调用图:
这是这个函数的调用关系图: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_().
函数调用图:
这是这个函数的调用关系图:
|
static |
引用了 ALLOC_TYPE, LIMB_BITS, lmmp_add_(), lmmp_assert, lmmp_dec_1, lmmp_free(), lmmp_inc, lmmp_mul_fermat_single_(), lmmp_mul_mersenne_single_(), lmmp_param_assert, lmmp_shr1add_nc_(), lmmp_sub_(), lmmp_sub_1_(), lmmp_sub_n_(), lmmp_sub_nc_() , 以及 tp.
被这些函数引用 lmmp_mul_fft_unbalance_().
函数调用图:
这是这个函数的调用关系图:
|
inlinestatic |
引用了 fft_cache::fermat_flag, lmmp_fft_memstack_(), fft_cache::mersenne_flag, fft_cache::msr_fermat , 以及 fft_cache::msr_mersenne.
被这些函数引用 lmmp_mul_fft_unbalance_().
函数调用图:
这是这个函数的调用关系图:| void lmmp_mul_fft_unbalance_ | ( | mp_ptr restrict | dst, |
| mp_srcptr restrict | numa, | ||
| mp_size_t | na, | ||
| mp_srcptr restrict | numb, | ||
| mp_size_t | nb | ||
| ) |
引用了 ALLOC_TYPE, lmmp_add_n_(), lmmp_copy, lmmp_fft_next_size_(), lmmp_free(), lmmp_inc, lmmp_mul_(), lmmp_mul_fft_cache_(), lmmp_mul_fft_cache_free_(), lmmp_param_assert, lmmp_zero , 以及 fft_cache::mersenne_flag.
函数调用图:| 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_().
函数调用图:
这是这个函数的调用关系图:
|
static |
引用了 k, fft_memstack::lenw, LIMB_BITS, LIMB_BYTES, lmmp_add_(), lmmp_add_1_(), lmmp_assert, 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_cache::mersenne_flag, fft_cache::msr_mersenne, fft_memstack::temp_coef, fft_cache::temp_coef_mersenne , 以及 fft_memstack::tempdepth.
被这些函数引用 lmmp_mul_fft_cache_().
函数调用图:
这是这个函数的调用关系图:
|
static |
被这些函数引用 lmmp_fft_best_k_().