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

浏览源代码.

函数

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]
 
mp_limb_t lmmp_add_nc_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c)
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 

函数说明

◆ lmmp_add_n_()

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]

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

在文件 add_n.c81 行定义.

81 {
82 mp_size_t i = 0;
83 mp_limb_t cy = 0;
84
85 for (; i + 4 <= n; i += 4) {
86 mp_limb_t a0, b0, r0;
87 mp_limb_t a1, b1, r1;
88 mp_limb_t a2, b2, r2;
89 mp_limb_t a3, b3, r3;
90
91 a0 = numa[i + 0];
92 b0 = numb[i + 0];
93
94 a1 = numa[i + 1];
95 b1 = numb[i + 1];
96
97 a2 = numa[i + 2];
98 b2 = numb[i + 2];
99
100 a3 = numa[i + 3];
101 b3 = numb[i + 3];
102
103 r0 = a0 + cy;
104 cy = (r0 < cy);
105 r0 += b0;
106 cy += (r0 < b0);
107
108 r1 = a1 + cy;
109 cy = (r1 < cy);
110 r1 += b1;
111 cy += (r1 < b1);
112
113 r2 = a2 + cy;
114 cy = (r2 < cy);
115 r2 += b2;
116 cy += (r2 < b2);
117
118 r3 = a3 + cy;
119 cy = (r3 < cy);
120 r3 += b3;
121 cy += (r3 < b3);
122
123 dst[i + 0] = r0;
124 dst[i + 1] = r1;
125 dst[i + 2] = r2;
126 dst[i + 3] = r3;
127 }
128
129 for (; i < n; i++) {
130 mp_limb_t a, b, r;
131 a = numa[i];
132 b = numb[i];
133 r = a + cy;
134 cy = (r < cy);
135 r += b;
136 cy += (r < b);
137 dst[i] = r;
138 }
139
140 return cy;
141}
uint64_t mp_size_t
Definition lmmp.h:77
uint64_t mp_limb_t
Definition lmmp.h:76
#define b0
#define b1
#define a0
#define a1
#define r2
#define r1
#define a2
#define r3
#define r0
#define b2
#define a3
#define numb
#define n
#define b3

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

被这些函数引用 lmmp_add_(), lmmp_binvert_n_dc_(), lmmp_binvert_unbalanced_(), lmmp_div_(), lmmp_div_basecase_(), lmmp_div_divide_n_(), lmmp_div_mulinv_(), lmmp_div_s_(), lmmp_from_str_divide_(), lmmp_invappr_newton_(), lmmp_mul_(), lmmp_mul_fft_unbalance_(), lmmp_mul_toom22_(), lmmp_mul_toom32_(), lmmp_mul_toom33_(), lmmp_mul_toom42_(), lmmp_mul_toom42_cache_(), lmmp_mul_toom42_cache_init_(), lmmp_mul_toom42_unbalance_(), lmmp_mul_toom43_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_(), lmmp_mul_toom62_cache_init_(), lmmp_mul_toom62_unbalance_(), lmmp_mullo_dc_(), lmmp_sqr_toom2_(), lmmp_sqrlo_dc_(), lmmp_sqrt_divide_(), lmmp_toom_eval_dgr3_pm1_(), lmmp_toom_eval_dgr3_pm2_(), lmmp_toom_eval_pm1_(), lmmp_toom_interp5_(), lmmp_toom_interp6_() , 以及 lmmp_toom_interp7_().

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

◆ lmmp_add_nc_()

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

Copyright (C) 2026 HJimmyK(Jericho Knox)

带进位的n位加法 [dst,n] = [numa,n] + [numb,n] + c

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.

See https://www.gnu.org/licenses/.

在文件 add_n.c19 行定义.

19 {
20 mp_size_t i = 0;
21 mp_limb_t cy = c;
22
23 for (; i + 4 <= n; i += 4) {
24 mp_limb_t a0, b0, r0;
25 mp_limb_t a1, b1, r1;
26 mp_limb_t a2, b2, r2;
27 mp_limb_t a3, b3, r3;
28
29 a0 = numa[i + 0];
30 b0 = numb[i + 0];
31
32 a1 = numa[i + 1];
33 b1 = numb[i + 1];
34
35 a2 = numa[i + 2];
36 b2 = numb[i + 2];
37
38 a3 = numa[i + 3];
39 b3 = numb[i + 3];
40
41 r0 = a0 + cy;
42 cy = (r0 < cy);
43 r0 += b0;
44 cy += (r0 < b0);
45
46 r1 = a1 + cy;
47 cy = (r1 < cy);
48 r1 += b1;
49 cy += (r1 < b1);
50
51 r2 = a2 + cy;
52 cy = (r2 < cy);
53 r2 += b2;
54 cy += (r2 < b2);
55
56 r3 = a3 + cy;
57 cy = (r3 < cy);
58 r3 += b3;
59 cy += (r3 < b3);
60
61 dst[i + 0] = r0;
62 dst[i + 1] = r1;
63 dst[i + 2] = r2;
64 dst[i + 3] = r3;
65 }
66
67 for (; i < n; i++) {
68 mp_limb_t a, b, r;
69 a = numa[i];
70 b = numb[i];
71 r = a + cy;
72 cy = (r < cy);
73 r += b;
74 cy += (r < b);
75 dst[i] = r;
76 }
77
78 return cy;
79}
#define c

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

被这些函数引用 lmmp_add_n_sub_n_(), lmmp_fft_bfy_(), lmmp_ifft_bfy_() , 以及 lmmp_invappr_newton_().

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