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

浏览源代码.

函数

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
 
mp_limb_t lmmp_shr1add_nc_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c)
 带进位加法后右移1位 [dst,n] = ([numa,n] + [numb,n] + c) >> 1
 
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
 
mp_limb_t lmmp_shr1sub_nc_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c)
 带借位减法后右移1位 [dst,n] = ([numa,n] - [numb,n] - c) >> 1
 
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
 
mp_limb_t lmmp_shr_c_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr, mp_limb_t c)
 带进位的大数右移操作 [dst,na] = [numa,na]>>shr,dst的高shr位填充c的高shr位
 

函数说明

◆ lmmp_shr1add_n_()

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

参数
dst结果输出指针
numa第一个加数指针
numb第二个加数指针
nlimb长度
警告
n>0, eqsep(dst,[numa|numb])
返回
右移操作产生的进位值 [0|1]

在文件 shr.c52 行定义.

52 {
53 mp_size_t i = 0, c = 0, l = 0;
54 mp_limb_t a, b, r;
55
56 a = numa[i];
57 b = numb[i];
58 r = a + c;
59 c = (r < c);
60 r += b;
61 c += (r < b);
62 dst[i] = r >> 1;
63 l = r & 1;
64
65 for (i = 1; i < n; i++) {
66 a = numa[i];
67 b = numb[i];
68 r = a + c;
69 c = (r < c);
70 r += b;
71 c += (r < b);
72 dst[i - 1] |= r << (LIMB_BITS - 1);
73 dst[i] = r >> 1;
74 }
75 dst[n - 1] |= c << (LIMB_BITS - 1);
76 return l;
77}
uint64_t mp_size_t
Definition lmmp.h:212
uint64_t mp_limb_t
Definition lmmp.h:211
#define LIMB_BITS
Definition lmmp.h:221

引用了 LIMB_BITS.

被这些函数引用 lmmp_mul_toom32_(), lmmp_toom_interp5_(), lmmp_toom_interp6_() , 以及 lmmp_toom_interp7_().

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

◆ lmmp_shr1add_nc_()

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

带进位加法后右移1位 [dst,n] = ([numa,n] + [numb,n] + c) >> 1

参数
dst结果输出指针
numa第一个加数指针
numb第二个加数指针
nlimb长度
c初始进位值 [0|1]
警告
n>0, c=[0|1], eqsep(dst,[numa|numb])
返回
右移操作产生的进位值 [0|1]

在文件 shr.c79 行定义.

79 {
80 mp_size_t i = 0, l = 0;
81 mp_limb_t a, b, r;
82
83 a = numa[i];
84 b = numb[i];
85 r = a + c;
86 c = (r < c);
87 r += b;
88 c += (r < b);
89 dst[i] = r >> 1;
90 l = r & 1;
91
92 for (i = 1; i < n; i++) {
93 a = numa[i];
94 b = numb[i];
95 r = a + c;
96 c = (r < c);
97 r += b;
98 c += (r < b);
99 dst[i - 1] |= r << (LIMB_BITS - 1);
100 dst[i] = r >> 1;
101 }
102 dst[n - 1] |= c << (LIMB_BITS - 1);
103 return l;
104}

引用了 LIMB_BITS.

被这些函数引用 lmmp_mul_fft_(), lmmp_mul_fft_cache_() , 以及 lmmp_mullo_fft_().

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

◆ lmmp_shr1sub_n_()

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

参数
dst结果输出指针
numa被减数指针
numb减数指针
n操作数的位数(limb数量)
警告
n>0, eqsep(dst,[numa|numb])
返回
右移操作产生的进位值 (0或1)

在文件 shr.c106 行定义.

106 {
107 mp_size_t i = 0, c = 0, l = 0;
108 mp_limb_t a, b, r;
109
110 a = numa[i];
111 b = numb[i];
112 b += c;
113 c = (b < c);
114 c += (a < b);
115 r = a - b;
116 dst[i] = r >> 1;
117 l = r & 1;
118
119 for (i = 1; i < n; i++) {
120 a = numa[i];
121 b = numb[i];
122 b += c;
123 c = (b < c);
124 c += (a < b);
125 r = a - b;
126 dst[i - 1] |= r << (LIMB_BITS - 1);
127 dst[i] = r >> 1;
128 }
129 dst[n - 1] |= c << (LIMB_BITS - 1);
130 return l;
131}

引用了 LIMB_BITS.

被这些函数引用 lmmp_mul_toom32_(), lmmp_toom_interp5_(), lmmp_toom_interp6_() , 以及 lmmp_toom_interp7_().

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

◆ lmmp_shr1sub_nc_()

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

带借位减法后右移1位 [dst,n] = ([numa,n] - [numb,n] - c) >> 1

参数
dst结果输出指针
numa被减数指针
numb减数指针
nlimb长度
c初始借位值 [0|1]
警告
n>0, c=[0|1], eqsep(dst,[numa|numb])
返回
右移操作产生的进位值 [0|1]

在文件 shr.c133 行定义.

133 {
134 mp_size_t i = 0, l = 0;
135 mp_limb_t a, b, r;
136
137 a = numa[i];
138 b = numb[i];
139 b += c;
140 c = (b < c);
141 c += (a < b);
142 r = a - b;
143 dst[i] = r >> 1;
144 l = r & 1;
145
146 for (i = 1; i < n; i++) {
147 a = numa[i];
148 b = numb[i];
149 b += c;
150 c = (b < c);
151 c += (a < b);
152 r = a - b;
153 dst[i - 1] |= r << (LIMB_BITS - 1);
154 dst[i] = r >> 1;
155 }
156 dst[n - 1] |= c << (LIMB_BITS - 1);
157 return l;
158}

引用了 LIMB_BITS.

◆ lmmp_shr_()

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

参数
dst结果输出指针
numa源操作数指针
nalimb长度
shr右移的位数 (0~63)
警告
na>0, 0<=shr<64, eqsep(dst,numa) 允许dst指针地址小于numa(即支持原地长移位操作)
返回
其最高shr个比特位填充[numa,na]被移出的shr个最低位,其余比特位为0

在文件 shr.c9 行定义.

9 {
10 if (shr == 0) {
11 lmmp_copy(dst, numa, na);
12 return 0;
13 } else {
14 mp_limb_t high_limb, low_limb;
15 const mp_size_t rshr = LIMB_BITS - shr;
16 mp_limb_t retval;
17 high_limb = *numa++;
18 retval = (high_limb << rshr);
19 low_limb = high_limb >> shr;
20 while (--na != 0) {
21 high_limb = *numa++;
22 *dst++ = low_limb | (high_limb << rshr);
23 low_limb = high_limb >> shr;
24 }
25 *dst = low_limb;
26 return retval;
27 }
28}
#define lmmp_copy(dst, src, n)
Definition lmmp.h:364

引用了 LIMB_BITS , 以及 lmmp_copy.

被这些函数引用 lmmp_bninv_(), lmmp_div_(), lmmp_fft_extract_coef_(), lmmp_invsqrt_newton_(), lmmp_sqrt_(), lmmp_sqrt_newton_(), lmmp_to_str_divide_(), lmmp_toom_interp6_() , 以及 lmmp_toom_interp7_().

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

◆ lmmp_shr_c_()

mp_limb_t lmmp_shr_c_ ( mp_ptr  dst,
mp_srcptr  numa,
mp_size_t  na,
mp_size_t  shr,
mp_limb_t  c 
)

带进位的大数右移操作 [dst,na] = [numa,na]>>shr,dst的高shr位填充c的高shr位

参数
dst结果输出指针
numa源操作数指针
nalimb长度
shr右移的位数 (0~63)
c进位值(其低(64-shr)位必须为0)
警告
na>0, 0<=shr<64, eqsep(dst,numa) c的低(64-shr)位必须为0 允许dst指针地址小于numa(即支持原地长移位操作)
返回
其最高shr个比特位填充[numa,na]被移出的shr个最低位,其余比特位为0

在文件 shr.c30 行定义.

30 {
31 if (shr == 0) {
32 lmmp_copy(dst, numa, na);
33 return 0;
34 } else {
35 mp_limb_t high_limb, low_limb;
36 const mp_size_t rshr = LIMB_BITS - shr;
37 mp_limb_t retval;
38 high_limb = *numa++;
39 retval = (high_limb << rshr);
40 low_limb = high_limb >> shr;
41 while (--na != 0) {
42 high_limb = *numa++;
43 *dst++ = low_limb | (high_limb << rshr);
44 low_limb = high_limb >> shr;
45 }
46 c &= ~(((mp_limb_t)1 << rshr) - 1);
47 *dst = low_limb | c;
48 return retval;
49 }
50}

引用了 LIMB_BITS , 以及 lmmp_copy.

被这些函数引用 lmmp_ifft_bfy_(), lmmp_inv_() , 以及 lmmp_sqrt_divide_().

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