|
LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
|
#include "../../../include/lammp/impl/inlines.h"#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)} |
| Copyright (C) 2026 HJimmyK(Jericho Knox) | |
| #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 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 | |
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 _FFT_TABLE_ENTRY4 | ( | n | ) | _FFT_TABLE_ENTRY(n), _FFT_TABLE_ENTRY((n) + 1), _FFT_TABLE_ENTRY((n) + 2), _FFT_TABLE_ENTRY((n) + 3) |
引用了 k, lmmp_fft_4_(), lmmp_fft_b1_() , 以及 n.
被这些函数引用 lmmp_mul_fermat_(), lmmp_mul_fermat_recurse_(), lmmp_mul_fermat_single_(), lmmp_mul_mersenne_() , 以及 lmmp_mul_mersenne_single_().
函数调用图:
这是这个函数的调用关系图:引用了 k, lmmp_fft_4_(), lmmp_fft_bfy_() , 以及 n.
被这些函数引用 lmmp_fft_() , 以及 lmmp_fft_4_().
函数调用图:
这是这个函数的调用关系图:
|
static |
FFT递归函数
| ms | - 内存栈结构体指针 |
| coef | - 系数数组指针数组 |
| dis | - 索引步长 |
| k | - FFT层数(递归深度) |
| w | - 每次蝶形运算的移位基数 |
| w0 | - 初始移位偏移 |
引用了 k, lmmp_fft_b1_(), lmmp_fft_bfy_(), n , 以及 w0.
被这些函数引用 lmmp_fft_() , 以及 lmmp_fft_b1_().
函数调用图:
这是这个函数的调用关系图:查找对于 m>=n 的模 B^m+1 FFT运算的最优k值
| n | - 输入的机器字长度 |
引用了 k, lmmp_fft_table_ , 以及 n.
被这些函数引用 lmmp_fft_next_size_(), lmmp_mul_fermat_(), lmmp_mul_fermat_recurse_(), lmmp_mul_fermat_single_(), lmmp_mul_mersenne_() , 以及 lmmp_mul_mersenne_single_().
这是这个函数的调用关系图: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) |
引用了 l, LIMB_BITS, lmmp_add_nc_(), lmmp_dec, lmmp_dec_1, lmmp_inc_1, LMMP_MIN, lmmp_shl_c_(), lmmp_sub_nc_(), n, numb , 以及 PART_SIZE.
被这些函数引用 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 , 以及 n.
被这些函数引用 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() , 以及 n.
被这些函数引用 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 , 以及 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_().
函数调用图:
这是这个函数的调用关系图:
|
static |
对模 2^n+1 的系数执行左移操作
| ms | - 内存栈结构体指针 |
| coef | - 输入输出系数数组指针(指针的指针,用于交换内存) |
| shl | - 左移的比特数(0<shl<2*n) |
引用了 l, LIMB_BITS, lmmp_copy, lmmp_dec, lmmp_dec_1, lmmp_inc, lmmp_inc_1, lmmp_not_(), lmmp_shl_(), lmmp_shlnot_() , 以及 n.
被这些函数引用 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) |
引用了 LIMB_BITS, lmmp_fft_shl_coef_() , 以及 n.
被这些函数引用 lmmp_mul_fermat_recombine_(), lmmp_mul_mersenne_() , 以及 lmmp_mul_mersenne_single_().
函数调用图:
这是这个函数的调用关系图:引用了 k, lmmp_ifft_4_(), lmmp_ifft_b1_() , 以及 n.
被这些函数引用 lmmp_mul_fermat_(), lmmp_mul_fermat_recurse_(), lmmp_mul_fermat_single_(), lmmp_mul_mersenne_() , 以及 lmmp_mul_mersenne_single_().
函数调用图:
这是这个函数的调用关系图:引用了 k, lmmp_ifft_4_(), lmmp_ifft_bfy_() , 以及 n.
被这些函数引用 lmmp_ifft_() , 以及 lmmp_ifft_4_().
函数调用图:
这是这个函数的调用关系图:
|
static |
引用了 k, lmmp_ifft_b1_(), lmmp_ifft_bfy_(), n , 以及 w0.
被这些函数引用 lmmp_ifft_() , 以及 lmmp_ifft_b1_().
函数调用图:
这是这个函数的调用关系图: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) |
引用了 l, LIMB_BITS, lmmp_add_nc_(), lmmp_dec, lmmp_dec_1, lmmp_inc, lmmp_inc_1, LMMP_MIN, lmmp_shr_c_(), lmmp_sub_nc_(), n, numb , 以及 PART_SIZE.
被这些函数引用 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, 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_().
函数调用图:
这是这个函数的调用关系图:
|
static |
费马变换 模 B^n+1 乘法的结果合并
| ms | - 内存栈结构体指针 |
| dst | - 输出结果数组 |
| pfca | - FFT系数数组指针数组 |
| K | - FFT块数(2^k) |
| k | - FFT层数 |
| n | - 系数总比特数 |
| M | - 每个块的比特数 |
| rn | - 结果长度(机器字) |
引用了 k, 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_() , 以及 n.
被这些函数引用 lmmp_mul_fermat_(), lmmp_mul_fermat_recurse_() , 以及 lmmp_mul_fermat_single_().
函数调用图:
这是这个函数的调用关系图:
|
static |
费马变换乘法递归函数(核心乘法逻辑)
| ms | - 内存栈结构体指针 |
| pc1 | - 第一个数的FFT系数数组指针数组 |
| pc2 | - 第二个数的FFT系数数组指针数组 |
| K0 | - FFT块数 |
引用了 k, 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, n , 以及 numb.
被这些函数引用 lmmp_mul_fermat_(), lmmp_mul_fermat_recurse_(), lmmp_mul_fermat_single_(), lmmp_mul_mersenne_() , 以及 lmmp_mul_mersenne_single_().
函数调用图:
这是这个函数的调用关系图:
|
static |
引用了 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_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_(), n, numb , 以及 tp.
被这些函数引用 __lmmp_mul_n_(), __lmmp_sqr_(), 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_(), n, numb , 以及 tp.
被这些函数引用 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, n , 以及 numb.
函数调用图:| 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_().
函数调用图:
这是这个函数的调用关系图:
|
static |
引用了 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.
被这些函数引用 lmmp_mul_fft_cache_().
函数调用图:
这是这个函数的调用关系图:被这些函数引用 lmmp_fft_best_k_().