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

浏览源代码.

函数

mp_limb_t lmmp_addshl1_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_shl_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr)
 大数左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充0
 
mp_limb_t lmmp_shl_c_ (mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr, mp_limb_t c)
 带进位的大数左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充c的低shl位
 
mp_limb_t lmmp_subshl1_n_ (mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
 减法结合左移1位操作 [dst,n] = [numa,n] - ([numb,n] << 1)
 

函数说明

◆ lmmp_addshl1_n_()

mp_limb_t lmmp_addshl1_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加数指针(先左移1位)
nlimb长度
警告
n>0, eqsep(dst,[numa|numb])
返回
运算后的进位值 [0|1|2]

在文件 shl.c56 行定义.

56 {
57 mp_size_t i, c = 0, mb = 0;
58
59 for (i = 0; i < n; i++) {
60 mp_limb_t a, b, r;
61 a = numa[i];
62 b = (numb[i] << 1) + mb;
63 mb = numb[i] >> (LIMB_BITS - 1);
64 r = a + c;
65 c = (r < c);
66 r += b;
67 c += (r < b);
68 dst[i] = r;
69 }
70 return c + mb;
71}
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_toom33_(), lmmp_mul_toom42_(), lmmp_mul_toom42_cache_(), lmmp_mul_toom42_cache_init_(), lmmp_mul_toom44_(), lmmp_mul_toom53_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_(), lmmp_mul_toom62_cache_init_(), lmmp_sqr_toom3_(), lmmp_sqr_toom4_(), lmmp_sqrlo_dc_() , 以及 lmmp_sqrt_divide_().

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

◆ lmmp_shl_()

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

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

在文件 shl.c9 行定义.

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

引用了 LIMB_BITS , 以及 lmmp_copy.

被这些函数引用 lmmp_10pow_1_(), lmmp_12pow_1_(), lmmp_14pow_1_(), lmmp_6pow_1_(), lmmp_arith_seqprod_(), lmmp_bninv_(), lmmp_bninv_appr_newton_(), lmmp_div_(), lmmp_factorial_(), lmmp_fft_shl_coef_(), lmmp_inv_(), lmmp_mul_fermat_recombine_(), lmmp_mul_mersenne_(), lmmp_mul_mersenne_single_(), lmmp_mul_toom43_(), lmmp_mul_toom44_(), lmmp_mul_toom53_(), lmmp_mul_toom62_(), lmmp_mul_toom62_cache_(), lmmp_mul_toom62_cache_init_(), lmmp_multinomial_(), lmmp_nCr_(), lmmp_nPr_(), lmmp_pow_1_(), lmmp_sqr_toom4_(), lmmp_sqrt_(), lmmp_sqrt_newton_(), lmmp_to_str_(), lmmp_to_str_divide_(), lmmp_toom_eval_dgr3_pm2_(), lmmp_toom_eval_pm2_(), lmmp_toom_interp5_(), lmmp_toom_interp6_(), lmmp_toom_interp7_() , 以及 pow_nPr_().

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

◆ lmmp_shl_c_()

mp_limb_t lmmp_shl_c_ ( mp_ptr  dst,
mp_srcptr  numa,
mp_size_t  na,
mp_size_t  shl,
mp_limb_t  c 
)

带进位的大数左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充c的低shl位

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

在文件 shl.c32 行定义.

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

引用了 LIMB_BITS , 以及 lmmp_copy.

被这些函数引用 lmmp_fft_bfy_().

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

◆ lmmp_subshl1_n_()

mp_limb_t lmmp_subshl1_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减数指针(先左移1位)
nlimb长度
警告
n>0, eqsep(dst,[numa|numb])
返回
运算后的借位值 [0|1|2]

在文件 shl.c73 行定义.

73 {
74 mp_size_t i, c = 0, mb = 0;
75
76 for (i = 0; i < n; i++) {
77 mp_limb_t a, b;
78 a = numa[i];
79 b = (numb[i] << 1) + mb;
80 mb = numb[i] >> (LIMB_BITS - 1);
81 b += c;
82 c = (b < c);
83 c += (a < b);
84 dst[i] = a - b;
85 }
86 return c + mb;
87}

引用了 LIMB_BITS.