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

浏览源代码.

函数

mp_limb_t lmmp_div_basecase_ (mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb, mp_limb_t inv21)
 基础除法运算
 

函数说明

◆ lmmp_div_basecase_()

mp_limb_t lmmp_div_basecase_ ( mp_ptr  dstq,
mp_ptr  numa,
mp_size_t  na,
mp_srcptr  numb,
mp_size_t  nb,
mp_limb_t  inv21 
)

基础除法运算

参数
dstq输出商的缓冲区,长度至少为na-nb
numa输入被除数(长度na),运算后存储余数(长度nb)
na被除数的单精度数(limb)长度
numb输入除数,长度为nb
nb除数的单精度数(limb)长度
inv21除数的2-1阶逆元(inv21([numb+nb-2,2]))
返回
商的最高位(qh)
警告
na>=nb>=3, MSB(numb)=1, inv21=inv21([numb+nb-2,2]), sep(dstq,numa,numb)
注解
qh:[dstq,na-nb]=[numa,na] div [numb,nb], [numa,na-nb]=[numa,na] mod [numb,nb], return qh

在文件 div_basecase.c10 行定义.

10 {
11 lmmp_param_assert(na >= nb);
12 lmmp_param_assert(nb >= 3);
13 lmmp_param_assert(numb[nb - 1] >= LIMB_B_2);
14 mp_size_t nq = na - nb;
15
16 numa += na;
17
18 mp_limb_t qh = lmmp_cmp_(numa - nb, numb, nb) >= 0;
19 if (qh) {
20 lmmp_sub_n_(numa - nb, numa - nb, numb, nb);
21 }
22
23 nb -= 2;
24 numa -= 2;
25
26 mp_limb_t d1 = numb[nb + 1], d0 = numb[nb + 0];
27
28 while (nq) {
29 mp_limb_t q;
30 --numa;
31 if (numa[2] == d1 && numa[1] == d0) {
32 q = LIMB_MAX;
33 lmmp_submul_1_(numa - nb, numb, nb + 2, q);
34 } else {
35 mp_limb_t cy, cy1;
36 q = lmmp_div_3_2_(numa, numb + nb, inv21);
37 cy = lmmp_submul_1_(numa - nb, numb, nb, q);
38 cy1 = numa[0] < cy;
39 numa[0] -= cy;
40 cy = numa[1] < cy1;
41 numa[1] -= cy1;
42 if (cy) {
43 lmmp_add_n_(numa - nb, numa - nb, numb, nb + 2);
44 --q;
45 }
46 }
47 dstq[--nq] = q;
48 }
49 return qh;
50}
uint64_t mp_size_t
Definition lmmp.h:212
#define LIMB_MAX
Definition lmmp.h:224
uint64_t mp_limb_t
Definition lmmp.h:211
#define lmmp_param_assert(x)
Definition lmmp.h:398
mp_limb_t lmmp_div_3_2_(mp_ptr numa, mp_srcptr numb, mp_limb_t inv21)
3/2位除法运算 [numa,2]=[numa,3] mod [numb,2]
static int lmmp_cmp_(mp_srcptr numa, mp_srcptr numb, mp_size_t n)
大数比较函数(内联)
Definition lmmpn.h:1004
mp_limb_t lmmp_submul_1_(mp_ptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t b)
大数乘以单limb并累减操作 [numa,n] -= [numb,n] * b
mp_limb_t lmmp_sub_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
无借位的n位减法 [dst,n] = [numa,n] - [numb,n]
Definition sub_n.c:70
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]
Definition add_n.c:71
#define LIMB_B_2
Definition mparam.h:160

引用了 LIMB_B_2, LIMB_MAX, lmmp_add_n_(), lmmp_cmp_(), lmmp_div_3_2_(), lmmp_param_assert, lmmp_sub_n_() , 以及 lmmp_submul_1_().

被这些函数引用 lmmp_bninv_appr_newton_(), lmmp_div_(), lmmp_div_divide_n_(), lmmp_div_s_() , 以及 lmmp_inv_basecase_().

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