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

浏览源代码.

宏定义

#define r0   (dst)
 
#define r1   (dst + n)
 
#define r2   (dst + 2 * n)
 
#define r3   (dst + 3 * n)
 
#define r4   (dst + 4 * n)
 
#define v0   r0
 
#define v1   r2
 
#define vinf   r4
 

函数

void lmmp_toom_interp5_ (mp_ptr dst, mp_ptr v2, mp_ptr vm1, mp_size_t n, mp_size_t spt, int vm1_neg, mp_limb_t vinf0)
 Toom插值计算(5点插值),用于Toom-33和Toom-42乘法算法
 

宏定义说明

◆ r0

#define r0   (dst)

◆ r1

#define r1   (dst + n)

◆ r2

#define r2   (dst + 2 * n)

◆ r3

#define r3   (dst + 3 * n)

◆ r4

#define r4   (dst + 4 * n)

◆ v0

#define v0   r0

◆ v1

#define v1   r2

◆ vinf

#define vinf   r4

函数说明

◆ lmmp_toom_interp5_()

void lmmp_toom_interp5_ ( mp_ptr  dst,
mp_ptr  v2,
mp_ptr  vm1,
mp_size_t  n,
mp_size_t  spt,
int  vm1_neg,
mp_limb_t  vinf0 
)

Toom插值计算(5点插值),用于Toom-33和Toom-42乘法算法

参数
dst输出结果缓冲区,存储插值计算结果 v(0)储存在[dst,2n],v(1)储存在[dst+2n,2n]
v2v(2)插值点值,长度为 2n+1
vm1v(-1)插值点值,长度为 2n+1
n操作数的 limb 长度
spt系数r4的长度
vm1_neg符号标记:v(-1)是否为负数(1表示负,0表示正)
vinf0无穷远点插值的低64位值

在文件 mul_toom_interp5.c10 行定义.

10 {
11 mp_limb_t cy, saved;
12 mp_size_t dnp = 2 * n + 1;
13
14#define r0 (dst)
15#define r1 (dst + n)
16#define r2 (dst + 2 * n)
17#define r3 (dst + 3 * n)
18#define r4 (dst + 4 * n)
19#define v0 r0
20#define v1 r2
21#define vinf r4
22
23 // v2=(v2-vm1)/3
24 if (vm1_neg)
25 lmmp_add_n_(v2, v2, vm1, dnp);
26 else
27 lmmp_sub_n_(v2, v2, vm1, dnp);
29
30 // vm1=(v1-vm1)/2
31 if (vm1_neg)
32 lmmp_shr1add_n_(vm1, v1, vm1, dnp);
33 else
34 lmmp_shr1sub_n_(vm1, v1, vm1, dnp);
35
36 // v1=v1-v0
37 v1[2 * n] -= lmmp_sub_n_(v1, v1, v0, 2 * n);
38
39 // v2=(v2-v1)/2
40 lmmp_shr1sub_n_(v2, v2, v1, dnp);
41
42 // v1=v1-vm1
43 lmmp_sub_n_(v1, v1, vm1, dnp);
44
45 // add vm1 at correct place.
46 cy = lmmp_add_n_(r1, r1, vm1, dnp);
47 lmmp_inc_1(r3 + 1, cy); // at most propagate to v1[2*n]
48
49 saved = v1[2 * n]; // it is vinf[0]
50 vinf[0] = vinf0; // correct value of vinf
51
52 // v2=v2-vinf*2
53 cy = lmmp_shl_(vm1, vinf, spt, 1);
54 cy += lmmp_sub_n_(v2, v2, vm1, spt);
55 lmmp_dec_1(v2 + spt, cy);
56
57 // vinf+=v2h, no overflow
58 cy = lmmp_add_n_(vinf, vinf, v2 + n, n + 1);
59 lmmp_inc_1(r3 + dnp, cy);
60
61 // v1-=vinf, (same time vmh-=v2h)
62 cy = lmmp_sub_n_(v1, v1, vinf, spt);
63 vinf0 = vinf[0];
64 v1[2 * n] = saved; // correct value of v1
65 lmmp_dec_1(v1 + spt, cy);
66
67 // vml-=v2l
68 cy = lmmp_sub_n_(r1, r1, v2, n);
69 lmmp_dec_1(v1, cy);
70
71 // last v2l
72 cy = lmmp_add_n_(r3, r3, v2, n);
73 v1[2 * n] += cy; // no carry
74 lmmp_inc_1(vinf, vinf0);
75}
static void lmmp_divexact_by3_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
精确除以3([dst,na] = [numa,na] / 3)
Definition divexact.h:33
uint64_t mp_size_t
Definition lmmp.h:212
uint64_t mp_limb_t
Definition lmmp.h:211
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
Definition shr.c:52
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
Definition shl.c:9
#define lmmp_dec_1(p, dec)
大数减指定值宏(预期无借位)
Definition lmmpn.h:985
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]
Definition sub_n.c:70
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
Definition shr.c:106
#define lmmp_inc_1(p, inc)
大数加指定值宏(预期无进位)
Definition lmmpn.h:958
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
#define vm1
#define v2
#define v0
#define r1
#define vinf
#define v1
#define r3

引用了 lmmp_add_n_(), lmmp_dec_1, lmmp_divexact_by3_(), lmmp_inc_1, lmmp_shl_(), lmmp_shr1add_n_(), lmmp_shr1sub_n_(), lmmp_sub_n_(), r1, r3, v0, v1, v2, vinf , 以及 vm1.

被这些函数引用 lmmp_mul_toom33_(), lmmp_mul_toom42_(), lmmp_mul_toom42_cache_(), lmmp_mul_toom42_cache_init_() , 以及 lmmp_sqr_toom3_().

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