LAMMP 4.2.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)
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 
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.c62 行定义.

62 {
63 mp_size_t i = 0, c = 0, l = 0;
64 mp_limb_t a, b, r;
65
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] = r >> 1;
73 l = r & 1;
74
75 for (i = 1; i < n; i++) {
76 a = numa[i];
77 b = numb[i];
78 r = a + c;
79 c = (r < c);
80 r += b;
81 c += (r < b);
82 dst[i - 1] |= r << (LIMB_BITS - 1);
83 dst[i] = r >> 1;
84 }
85 dst[n - 1] |= c << (LIMB_BITS - 1);
86 return l;
87}
#define l
#define c
uint64_t mp_size_t
Definition lmmp.h:77
uint64_t mp_limb_t
Definition lmmp.h:76
#define LIMB_BITS
Definition lmmp.h:86
#define numb
#define n

引用了 c, l, LIMB_BITS, n , 以及 numb.

被这些函数引用 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.c89 行定义.

89 {
90 mp_size_t i = 0, l = 0;
91 mp_limb_t a, b, r;
92
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] = r >> 1;
100 l = r & 1;
101
102 for (i = 1; i < n; i++) {
103 a = numa[i];
104 b = numb[i];
105 r = a + c;
106 c = (r < c);
107 r += b;
108 c += (r < b);
109 dst[i - 1] |= r << (LIMB_BITS - 1);
110 dst[i] = r >> 1;
111 }
112 dst[n - 1] |= c << (LIMB_BITS - 1);
113 return l;
114}

引用了 c, l, LIMB_BITS, n , 以及 numb.

被这些函数引用 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.c116 行定义.

116 {
117 mp_size_t i = 0, c = 0, l = 0;
118 mp_limb_t a, b, r;
119
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] = r >> 1;
127 l = r & 1;
128
129 for (i = 1; i < n; i++) {
130 a = numa[i];
131 b = numb[i];
132 b += c;
133 c = (b < c);
134 c += (a < b);
135 r = a - b;
136 dst[i - 1] |= r << (LIMB_BITS - 1);
137 dst[i] = r >> 1;
138 }
139 dst[n - 1] |= c << (LIMB_BITS - 1);
140 return l;
141}

引用了 c, l, LIMB_BITS, n , 以及 numb.

被这些函数引用 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.c143 行定义.

143 {
144 mp_size_t i = 0, l = 0;
145 mp_limb_t a, b, r;
146
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] = r >> 1;
154 l = r & 1;
155
156 for (i = 1; i < n; i++) {
157 a = numa[i];
158 b = numb[i];
159 b += c;
160 c = (b < c);
161 c += (a < b);
162 r = a - b;
163 dst[i - 1] |= r << (LIMB_BITS - 1);
164 dst[i] = r >> 1;
165 }
166 dst[n - 1] |= c << (LIMB_BITS - 1);
167 return l;
168}

引用了 c, l, LIMB_BITS, n , 以及 numb.

◆ lmmp_shr_()

mp_limb_t lmmp_shr_ ( mp_ptr  dst,
mp_srcptr  numa,
mp_size_t  na,
mp_size_t  shr 
)

Copyright (C) 2026 HJimmyK(Jericho Knox)

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

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/.

在文件 shr.c19 行定义.

19 {
20 if (shr == 0) {
22 return 0;
23 } else {
25 const mp_size_t rshr = LIMB_BITS - shr;
27 high_limb = *numa++;
28 retval = (high_limb << rshr);
30 while (--na != 0) {
31 high_limb = *numa++;
32 *dst++ = low_limb | (high_limb << rshr);
34 }
35 *dst = low_limb;
36 return retval;
37 }
38}
#define lmmp_copy(dst, src, n)
Definition lmmp.h:367

引用了 LIMB_BITS, lmmp_copy , 以及 n.

被这些函数引用 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.c40 行定义.

40 {
41 if (shr == 0) {
43 return 0;
44 } else {
46 const mp_size_t rshr = LIMB_BITS - shr;
48 high_limb = *numa++;
49 retval = (high_limb << rshr);
51 while (--na != 0) {
52 high_limb = *numa++;
53 *dst++ = low_limb | (high_limb << rshr);
55 }
56 c &= ~(((mp_limb_t)1 << rshr) - 1);
57 *dst = low_limb | c;
58 return retval;
59 }
60}

引用了 c, LIMB_BITS, lmmp_copy , 以及 n.

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

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