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

66 {
67 mp_size_t i, c = 0, mb = 0;
68
69 for (i = 0; i < n; i++) {
70 mp_limb_t a, b, r;
71 a = numa[i];
72 b = (numb[i] << 1) + mb;
73 mb = numb[i] >> (LIMB_BITS - 1);
74 r = a + c;
75 c = (r < c);
76 r += b;
77 c += (r < b);
78 dst[i] = r;
79 }
80 return c + mb;
81}
#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, LIMB_BITS, n , 以及 numb.

被这些函数引用 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  shr 
)

Copyright (C) 2026 HJimmyK(Jericho Knox)

大数左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充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/.

在文件 shl.c19 行定义.

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

引用了 LIMB_BITS, lmmp_copy , 以及 n.

被这些函数引用 lmmp_10pow_1_(), lmmp_12pow_1_(), lmmp_14pow_1_(), lmmp_2factorial_(), lmmp_6pow_1_(), lmmp_arith_seqprod_(), lmmp_bninv_(), lmmp_bninv_appr_newton_(), lmmp_div_(), lmmp_factorial_(), lmmp_fft_shl_coef_(), lmmp_hyperfac_(), 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_superfac_(), 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.c42 行定义.

42 {
43 if (shr == 0) {
45 return 0;
46 } else {
47 const mp_limb_t rshr = LIMB_BITS - shr;
50 numa += na;
51 dst += na;
52 low_limb = *--numa;
53 retval = low_limb >> rshr;
54 high_limb = (low_limb << shr);
55 while (--na != 0) {
56 low_limb = *--numa;
57 *--dst = high_limb | (low_limb >> rshr);
58 high_limb = (low_limb << shr);
59 }
60 c &= ((mp_limb_t)1 << shr) - 1;
61 *--dst = high_limb | c;
62 return retval;
63 }
64}

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

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

83 {
84 mp_size_t i, c = 0, mb = 0;
85
86 for (i = 0; i < n; i++) {
87 mp_limb_t a, b;
88 a = numa[i];
89 b = (numb[i] << 1) + mb;
90 mb = numb[i] >> (LIMB_BITS - 1);
91 b += c;
92 c = (b < c);
93 c += (a < b);
94 dst[i] = a - b;
95 }
96 return c + mb;
97}

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