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

浏览源代码.

函数

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]
 
mp_limb_t lmmp_sub_nc_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c)
 带借位的n位减法 [dst,n] = [numa,n] - [numb,n] - c
 

函数说明

◆ lmmp_sub_n_()

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]

参数
dst结果输出指针
numa被减数指针
numb减数指针
nlimb长度
警告
n>0, eqsep(dst,[numa|numb])
返回
运算后的最终借位值 [0|1]

在文件 sub_n.c70 行定义.

70 {
71 mp_size_t i = 0;
72 mp_limb_t cy = 0;
73
74 for (; i + 4 <= n; i += 4) {
75 mp_limb_t a0, b0, r0;
76 mp_limb_t a1, b1, r1;
77 mp_limb_t a2, b2, r2;
78 mp_limb_t a3, b3, r3;
79
80 a0 = numa[i + 0];
81 b0 = numb[i + 0];
82
83 a1 = numa[i + 1];
84 b1 = numb[i + 1];
85
86 a2 = numa[i + 2];
87 b2 = numb[i + 2];
88
89 a3 = numa[i + 3];
90 b3 = numb[i + 3];
91
92 b0 += cy;
93 cy = (b0 < cy);
94 cy += (a0 < b0);
95 r0 = a0 - b0;
96
97 b1 += cy;
98 cy = (b1 < cy);
99 cy += (a1 < b1);
100 r1 = a1 - b1;
101
102 b2 += cy;
103 cy = (b2 < cy);
104 cy += (a2 < b2);
105 r2 = a2 - b2;
106
107 b3 += cy;
108 cy = (b3 < cy);
109 cy += (a3 < b3);
110 r3 = a3 - b3;
111
112 dst[i + 0] = r0;
113 dst[i + 1] = r1;
114 dst[i + 2] = r2;
115 dst[i + 3] = r3;
116 }
117
118 for (; i < n; i++) {
119 mp_limb_t a, b;
120 a = numa[i];
121 b = numb[i];
122 b += cy;
123 cy = (b < cy);
124 cy += (a < b);
125 dst[i] = a - b;
126 }
127
128 return cy;
129}
uint64_t mp_size_t
Definition lmmp.h:212
uint64_t mp_limb_t
Definition lmmp.h:211
#define b0
#define b1
#define a0
#define a1
#define r2
#define r1
#define a2
#define r3
#define r0
#define b2
#define a3
#define b3

引用了 a0, a1, a2, a3, b0, b1, b2, b3, r0, r1, r2 , 以及 r3.

被这些函数引用 lmmp_bninv_appr_newton_(), lmmp_div_(), lmmp_div_basecase_(), lmmp_div_divide_n_(), lmmp_div_mulinv_(), lmmp_div_s_(), lmmp_invappr_newton_(), lmmp_mul_fermat_recurse_(), lmmp_mul_fft_(), lmmp_mul_fft_cache_(), lmmp_mul_toom22_(), lmmp_mul_toom32_(), lmmp_mul_toom52_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_init_(), lmmp_mullo_fft_(), lmmp_sqr_toom2_(), lmmp_sqrt_divide_(), lmmp_sub_(), lmmp_toom_interp5_(), lmmp_toom_interp6_() , 以及 lmmp_toom_interp7_().

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

◆ lmmp_sub_nc_()

mp_limb_t lmmp_sub_nc_ ( mp_ptr  dst,
mp_srcptr  numa,
mp_srcptr  numb,
mp_size_t  n,
mp_limb_t  c 
)

带借位的n位减法 [dst,n] = [numa,n] - [numb,n] - c

参数
dst结果输出指针
numa被减数指针
numb减数指针
nlimb长度
c初始借位值 [0|1]
警告
c=[0|1], n>0, eqsep(dst,[numa|numb])
返回
运算后的最终借位值 [0|1]

在文件 sub_n.c9 行定义.

9 {
10 mp_size_t i = 0;
11 mp_limb_t cy = c;
12
13 for (; i + 4 <= n; i += 4) {
14 mp_limb_t a0, b0, r0;
15 mp_limb_t a1, b1, r1;
16 mp_limb_t a2, b2, r2;
17 mp_limb_t a3, b3, r3;
18
19 a0 = numa[i + 0];
20 b0 = numb[i + 0];
21
22 a1 = numa[i + 1];
23 b1 = numb[i + 1];
24
25 a2 = numa[i + 2];
26 b2 = numb[i + 2];
27
28 a3 = numa[i + 3];
29 b3 = numb[i + 3];
30
31 b0 += cy;
32 cy = (b0 < cy);
33 cy += (a0 < b0);
34 r0 = a0 - b0;
35
36 b1 += cy;
37 cy = (b1 < cy);
38 cy += (a1 < b1);
39 r1 = a1 - b1;
40
41 b2 += cy;
42 cy = (b2 < cy);
43 cy += (a2 < b2);
44 r2 = a2 - b2;
45
46 b3 += cy;
47 cy = (b3 < cy);
48 cy += (a3 < b3);
49 r3 = a3 - b3;
50
51 dst[i + 0] = r0;
52 dst[i + 1] = r1;
53 dst[i + 2] = r2;
54 dst[i + 3] = r3;
55 }
56
57 for (; i < n; i++) {
58 mp_limb_t a, b;
59 a = numa[i];
60 b = numb[i];
61 b += cy;
62 cy = (b < cy);
63 cy += (a < b);
64 dst[i] = a - b;
65 }
66
67 return cy;
68}

引用了 a0, a1, a2, a3, b0, b1, b2, b3, r0, r1, r2 , 以及 r3.

被这些函数引用 lmmp_add_n_sub_n_(), lmmp_div_(), lmmp_div_mulinv_(), lmmp_fft_bfy_(), lmmp_ifft_bfy_(), lmmp_invappr_newton_(), lmmp_mul_fft_(), lmmp_mul_fft_cache_() , 以及 lmmp_mullo_fft_().

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