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

浏览源代码.

宏定义

#define w0   dst
 
#define w2   (dst + 2 * n)
 
#define w6   (dst + 6 * n)
 

函数

void lmmp_toom_interp7_ (mp_ptr dst, mp_size_t n, enum toom7_flags flags, mp_ptr w1, mp_ptr w3, mp_ptr w4, mp_ptr w5, mp_size_t w6n, mp_ptr tp)
 Toom插值计算(7点插值):用于Toom-44、Toom-53、Toom-62 乘法算法
 

宏定义说明

◆ w0

#define w0   dst

◆ w2

#define w2   (dst + 2 * n)

◆ w6

#define w6   (dst + 6 * n)

函数说明

◆ lmmp_toom_interp7_()

void lmmp_toom_interp7_ ( mp_ptr  dst,
mp_size_t  n,
enum toom7_flags  flags,
mp_ptr  w1,
mp_ptr  w3,
mp_ptr  w4,
mp_ptr  w5,
mp_size_t  w6n,
mp_ptr  tp 
)

Toom插值计算(7点插值):用于Toom-44、Toom-53、Toom-62 乘法算法

参数
dst输出结果缓冲区,存储插值计算结果(6*n + w6n limbs) w0 储存在[dst,2n], w2 储存在[dst+2n,2n+1], w6 储存在[dst+6n,w6n].
n输入:Toom-7 拆分后每段标准 limb 长度
flags输入:Toom-7 符号标志位,控制插值中的正负号运算
  • toom7_w1_neg: 点值 W1 符号位
  • toom7_w3_neg: 点值 W3 符号位
w1输入/临时:点值 W1 缓冲区(2n+1 limbs)
w3输入/临时:点值 W3 缓冲区(2n+1 limbs)
w4输入/临时:点值 W4 缓冲区(2n+1 limbs)
w5输入/临时:点值 W5 缓冲区(2n+1 limbs)
w6n输入:最低位段 W6 的实际 limb 长度 (0 < w6n ≤ 2n)
tp临时缓存空间(2*n+1 limbs)
注解
w0=f(0), w1=f(-2), w2=f(1), w3=f(-1), w4=f(2), w5=64*f(1/2), w6=f(inf),
警告
n>0, 0<w6n<=2n

在文件 mul_toom_interp7.c45 行定义.

55 {
56 lmmp_param_assert(w6n > 0);
57 lmmp_param_assert(w6n <= 2 * n);
58 mp_size_t m;
59 mp_limb_t cy;
60
61 m = 2 * n + 1;
62#define w0 dst
63#define w2 (dst + 2 * n)
64#define w6 (dst + 6 * n)
65
66 lmmp_add_n_(w5, w5, w4, m);
67 if (flags & toom7_w1_neg) {
68 lmmp_shr1add_n_(w1, w1, w4, m);
69 } else {
70 lmmp_shr1sub_n_(w1, w4, w1, m);
71 }
72 lmmp_sub_(w4, w4, m, w0, 2 * n);
73 lmmp_sub_n_(w4, w4, w1, m);
74
75 lmmp_debug_assert(!(w4[0] & 3));
76
77 lmmp_shr_(w4, w4, m, 2); /* w4>=0 */
78
79 tp[w6n] = lmmp_shl_(tp, w6, w6n, 4);
80 lmmp_sub_(w4, w4, m, tp, w6n + 1);
81
82 if (flags & toom7_w3_neg) {
83 lmmp_shr1add_n_(w3, w3, w2, m);
84 } else {
85 lmmp_shr1sub_n_(w3, w2, w3, m);
86 }
87
88 lmmp_sub_n_(w2, w2, w3, m);
89
90 lmmp_submul_1_(w5, w2, m, 65);
91 lmmp_sub_(w2, w2, m, w6, w6n);
92 lmmp_sub_(w2, w2, m, w0, 2 * n);
93
94 lmmp_addmul_1_(w5, w2, m, 45);
95 lmmp_debug_assert(!(w5[0] & 1));
96 lmmp_shr_(w5, w5, m, 1);
97 lmmp_sub_n_(w4, w4, w2, m);
98
99 lmmp_divexact_by3_(w4, w4, m);
100 lmmp_sub_n_(w2, w2, w4, m);
101
102 lmmp_sub_n_(w1, w5, w1, m);
103 lmmp_shl_(tp, w3, m, 3);
104 lmmp_sub_n_(w5, w5, tp, m);
106 lmmp_sub_n_(w3, w3, w5, m);
107
108 lmmp_divexact_by15_(w1, w1, m);
109 lmmp_shr1add_n_(w1, w1, w5, m);
110 w1[m - 1] &= LIMB_MAX >> 1;
111
112 lmmp_sub_n_(w5, w5, w1, m);
113
114 /* These bounds are valid for the 4x4 polynomial product of toom44,
115 * and they are conservative for toom53 and toom62. */
116 lmmp_debug_assert(w1[2 * n] < 2);
117 lmmp_debug_assert(w2[2 * n] < 3);
118 lmmp_debug_assert(w3[2 * n] < 4);
119 lmmp_debug_assert(w4[2 * n] < 3);
120 lmmp_debug_assert(w5[2 * n] < 2);
121
122 cy = lmmp_add_n_(dst + n, dst + n, w1, m);
123 lmmp_inc_1(w2 + n + 1, cy);
124 cy = lmmp_add_n_(dst + 3 * n, dst + 3 * n, w3, n);
125 lmmp_inc_1(w3 + n, w2[2 * n] + cy);
126 cy = lmmp_add_n_(dst + 4 * n, w3 + n, w4, n);
127 lmmp_inc_1(w4 + n, w3[2 * n] + cy);
128 cy = lmmp_add_n_(dst + 5 * n, w4 + n, w5, n);
129 lmmp_inc_1(w5 + n, w4[2 * n] + cy);
130 if (w6n > n + 1) {
131 cy = lmmp_add_n_(dst + 6 * n, dst + 6 * n, w5 + n, n + 1);
132 lmmp_inc_1(dst + 7 * n + 1, cy);
133 } else {
134 lmmp_assert(lmmp_add_n_(dst + 6 * n, dst + 6 * n, w5 + n, w6n));
135 }
136}
static void lmmp_divexact_by15_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
精确除以15([dst,na] = [numa,na] / 15)
Definition divexact.h:85
static void lmmp_divexact_by9_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
精确除以9([dst,na] = [numa,na] / 9)
Definition divexact.h:59
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
#define lmmp_debug_assert(x)
Definition lmmp.h:387
#define LIMB_MAX
Definition lmmp.h:224
uint64_t mp_limb_t
Definition lmmp.h:211
#define lmmp_assert(x)
Definition lmmp.h:370
#define lmmp_param_assert(x)
Definition lmmp.h:398
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_shr_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr)
大数右移操作 [dst,na] = [numa,na] >> shr,dst的高shr位填充0
Definition shr.c:9
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
static mp_limb_t lmmp_sub_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
大数减法静态内联函数 [dst,na]=[numa,na]-[numb,nb]
Definition lmmpn.h:1072
mp_limb_t lmmp_addmul_1_(mp_ptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t b)
大数乘以单limb并累加操作 [numa,n] += [numb,n] * b
mp_limb_t lmmp_submul_1_(mp_ptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t b)
大数乘以单limb并累减操作 [numa,n] -= [numb,n] * b
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 tp
#define w3
#define w5
#define w2
#define w0
#define w6
@ toom7_w1_neg
Definition toom_interp.h:27
@ toom7_w3_neg
Definition toom_interp.h:27

引用了 LIMB_MAX, lmmp_add_n_(), lmmp_addmul_1_(), lmmp_assert, lmmp_debug_assert, lmmp_divexact_by15_(), lmmp_divexact_by3_(), lmmp_divexact_by9_(), lmmp_inc_1, lmmp_param_assert, lmmp_shl_(), lmmp_shr1add_n_(), lmmp_shr1sub_n_(), lmmp_shr_(), lmmp_sub_(), lmmp_sub_n_(), lmmp_submul_1_(), toom7_w1_neg, toom7_w3_neg, tp, w0, w2, w3, w5 , 以及 w6.

被这些函数引用 lmmp_mul_toom44_(), lmmp_mul_toom53_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_(), lmmp_mul_toom62_cache_init_() , 以及 lmmp_sqr_toom4_().

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