LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
mul.c 文件参考
+ mul.c 的引用(Include)关系图:

浏览源代码.

函数

void lmmp_mul_ (mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t na, mp_srcptr restrict numb, mp_size_t nb)
 
void lmmp_mul_n_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
 等长大数乘法操作 [dst,2*n] = [numa,n] * [numb,n]
 

函数说明

◆ lmmp_mul_()

void lmmp_mul_ ( mp_ptr restrict  dst,
mp_srcptr restrict  numa,
mp_size_t  na,
mp_srcptr restrict  numb,
mp_size_t  nb 
)

在文件 mul.c30 行定义.

30 {
31 lmmp_param_assert(na >= nb);
32 lmmp_param_assert(nb > 0);
33 if (na == nb) {
34 if (numa == numb)
35 lmmp_sqr_(dst, numa, na);
36 else
37 lmmp_mul_n_(dst, numa, numb, na);
38 } else if ((nb < MUL_TOOM22_THRESHOLD || nb < MUL_TOOMX2_THRESHOLD) && !(4 * na < 5 * nb)) {
39 if (na <= PART_SIZE || nb <= 2)
40 lmmp_mul_basecase_(dst, numa, na, numb, nb);
41 else {
43 lmmp_mul_basecase_(dst, numa, PART_SIZE, numb, nb);
44 dst += PART_SIZE;
45 numa += PART_SIZE;
46 na -= PART_SIZE;
47 lmmp_copy(tp, dst, nb);
48 while (na > PART_SIZE) {
49 lmmp_mul_basecase_(dst, numa, PART_SIZE, numb, nb);
50 if (lmmp_add_n_(dst, dst, tp, nb))
51 lmmp_inc(dst + nb);
52 dst += PART_SIZE;
53 numa += PART_SIZE;
54 na -= PART_SIZE;
55 lmmp_copy(tp, dst, nb);
56 }
57 if (na >= nb)
58 lmmp_mul_basecase_(dst, numa, na, numb, nb);
59 else
60 lmmp_mul_basecase_(dst, numb, nb, numa, na);
61 if (lmmp_add_n_(dst, dst, tp, nb))
62 lmmp_inc(dst + nb);
63 }
64 } else if (((na + nb) >> 1) < MUL_TOOM44_THRESHOLD || 2 * nb < MUL_TOOM44_THRESHOLD) {
65 if (na < 3 * nb) {
66 if (4 * na < 5 * nb) {
67 if (nb < MUL_TOOM33_THRESHOLD)
68 lmmp_mul_toom22_(dst, numa, na, numb, nb);
69 else
70 lmmp_mul_toom33_(dst, numa, na, numb, nb);
71 } else if (5 * na < 9 * nb)
72 lmmp_mul_toom32_(dst, numa, na, numb, nb);
73 else
74 lmmp_mul_toom42_(dst, numa, na, numb, nb);
75 } else
76 lmmp_mul_toom42_unbalance_(dst, numa, na, numb, nb);
77 } else if (((na + nb) >> 1) < MUL_FFT_THRESHOLD || 2 * nb < MUL_FFT_THRESHOLD) {
78 if (na < 5 * nb) {
79 if (4 * na < 5 * nb)
80 lmmp_mul_toom44_(dst, numa, na, numb, nb);
81 else if (3 * na < 5 * nb)
82 lmmp_mul_toom43_(dst, numa, na, numb, nb);
83 else if (9 * na < 20 * nb)
84 lmmp_mul_toom53_(dst, numa, na, numb, nb);
85 else if (na < 3 * nb)
86 lmmp_mul_toom52_(dst, numa, na, numb, nb);
87 else
88 lmmp_mul_toom62_(dst, numa, na, numb, nb);
89 } else
90 lmmp_mul_toom62_unbalance_(dst, numa, na, numb, nb);
91 } else {
92 if (na < 8 * nb)
93 lmmp_mul_fft_(dst, numa, na, numb, nb);
94 else
95 lmmp_mul_fft_unbalance_(dst, numa, na, numb, nb);
96 }
97}
#define lmmp_copy(dst, src, n)
Definition lmmp.h:364
uint64_t mp_limb_t
Definition lmmp.h:211
#define lmmp_param_assert(x)
Definition lmmp.h:398
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_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_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]
#define lmmp_inc(p)
大数加1宏(预期无进位)
Definition lmmpn.h:946
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_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_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_sqr_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
大数平方操作 [dst,2*na] = [numa,na]^2
Definition sqr.c:10
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_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_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_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_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]
Definition mul_fft.c:1085
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_add_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
无进位的n位加法 [dst,n] = [numa,n] + [numb,n]
Definition add_n.c:71
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]
#define MUL_FFT_THRESHOLD
Definition mparam.h:54
#define MUL_TOOM22_THRESHOLD
Definition mparam.h:46
#define PART_SIZE
Definition mparam.h:89
#define MUL_TOOM33_THRESHOLD
Definition mparam.h:50
#define MUL_TOOMX2_THRESHOLD
Definition mparam.h:48
#define MUL_TOOM44_THRESHOLD
Definition mparam.h:52
void lmmp_mul_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
等长大数乘法操作 [dst,2*n] = [numa,n] * [numb,n]
Definition mul.c:99
#define tp

引用了 lmmp_add_n_(), lmmp_copy, lmmp_inc, lmmp_mul_basecase_(), lmmp_mul_fft_(), lmmp_mul_fft_unbalance_(), lmmp_mul_n_(), lmmp_mul_toom22_(), lmmp_mul_toom32_(), lmmp_mul_toom33_(), lmmp_mul_toom42_(), lmmp_mul_toom42_unbalance_(), lmmp_mul_toom43_(), lmmp_mul_toom44_(), lmmp_mul_toom52_(), lmmp_mul_toom53_(), lmmp_mul_toom62_(), lmmp_mul_toom62_unbalance_(), lmmp_param_assert, lmmp_sqr_(), MUL_FFT_THRESHOLD, MUL_TOOM22_THRESHOLD, MUL_TOOM33_THRESHOLD, MUL_TOOM44_THRESHOLD, MUL_TOOMX2_THRESHOLD, PART_SIZE , 以及 tp.

+ 函数调用图:

◆ lmmp_mul_n_()

void lmmp_mul_n_ ( mp_ptr  dst,
mp_srcptr  numa,
mp_srcptr  numb,
mp_size_t  n 
)

等长大数乘法操作 [dst,2*n] = [numa,n] * [numb,n]

警告
n>0, sep(dst,[numa|numb]) 特殊情况: n==1时dst<=numa+1是允许的 n==2时dst<=numa是允许的
参数
dst乘积结果输出指针(需要 2*n 的 limb 长度)
numa第一个乘数指针
numb第二个乘数指针
nlimb长度

在文件 mul.c99 行定义.

99 {
100 if (n < MUL_TOOM22_THRESHOLD)
101 lmmp_mul_basecase_(dst, numa, n, numb, n);
102 else if (n < MUL_TOOM33_THRESHOLD)
103 lmmp_mul_toom22_(dst, numa, n, numb, n);
104 else if (n < MUL_TOOM44_THRESHOLD)
105 lmmp_mul_toom33_(dst, numa, n, numb, n);
106 else if (n < MUL_FFT_THRESHOLD)
107 lmmp_mul_toom44_(dst, numa, n, numb, n);
108 else
109 lmmp_mul_fft_(dst, numa, n, numb, n);
110}

引用了 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_().

+ 函数调用图:
+ 这是这个函数的调用关系图: