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

浏览源代码.

函数

mp_limb_t lmmp_div_divide_ (mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb, mp_limb_t inv21)
 分治除法运算
 
static mp_limb_t lmmp_div_divide_n_ (mp_ptr dstq, mp_ptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t inv21, mp_ptr tp)
 

函数说明

◆ lmmp_div_divide_()

mp_limb_t lmmp_div_divide_ ( 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>=2*nb, nb>=6, 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_divide.c53 行定义.

53 {
54 lmmp_param_assert(na >= 2 * nb);
55 lmmp_param_assert(nb >= 6);
56 lmmp_param_assert(numb[nb - 1] >= LIMB_B_2);
57 mp_size_t nq = na - nb;
58
59 dstq += nq;
60 numa += nq;
61
62 do {
63 nq -= nb;
64 } while (nq >= nb);
65
66 dstq -= nq;
67 numa -= nq;
68
69 /* Perform the typically smaller block first. */
70 mp_limb_t qh = lmmp_div_s_(dstq, numa, nb + nq, numb, nb);
71
74 nq = na - nb - nq;
75
76 do {
77 dstq -= nb;
78 numa -= nb;
79 lmmp_div_divide_n_(dstq, numa, numb, nb, inv21, tp);
80 nq -= nb;
81 } while (nq > 0);
82
84 return qh;
85}
static mp_limb_t lmmp_div_divide_n_(mp_ptr dstq, mp_ptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t inv21, mp_ptr tp)
Definition div_divide.c:13
mp_limb_t * mp_ptr
Definition lmmp.h:215
uint64_t mp_size_t
Definition lmmp.h:212
uint64_t mp_limb_t
Definition lmmp.h:211
#define lmmp_param_assert(x)
Definition lmmp.h:398
mp_limb_t lmmp_div_s_(mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
除法运算
Definition div.c:11
#define LIMB_B_2
Definition mparam.h:160
#define tp
#define TEMP_DECL
Definition tmp_alloc.h:72
#define TEMP_FREE
Definition tmp_alloc.h:93
#define TALLOC_TYPE(n, type)
Definition tmp_alloc.h:91

引用了 LIMB_B_2, lmmp_div_divide_n_(), lmmp_div_s_(), lmmp_param_assert, TALLOC_TYPE, TEMP_DECL, TEMP_FREE , 以及 tp.

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

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

◆ lmmp_div_divide_n_()

static mp_limb_t lmmp_div_divide_n_ ( mp_ptr  dstq,
mp_ptr  numa,
mp_srcptr  numb,
mp_size_t  n,
mp_limb_t  inv21,
mp_ptr  tp 
)
static

在文件 div_divide.c13 行定义.

13 {
14 lmmp_param_assert(n >= 6);
15 lmmp_param_assert(numb[n - 1] >= LIMB_B_2);
16 mp_size_t lo = n >> 1, hi = n - lo;
17 mp_limb_t cy, qh, ql;
18
19 if (hi < DIV_DIVIDE_THRESHOLD) {
20 qh = lmmp_div_basecase_(dstq + lo, numa + 2 * lo, 2 * hi, numb + lo, hi, inv21);
21 } else {
22 qh = lmmp_div_divide_n_(dstq + lo, numa + 2 * lo, numb + lo, hi, inv21, tp);
23 }
24 lmmp_mul_(tp, dstq + lo, hi, numb, lo);
25
26 cy = lmmp_sub_n_(numa + lo, numa + lo, tp, n);
27 if (qh)
28 cy += lmmp_sub_n_(numa + n, numa + n, numb, lo);
29
30 while (cy) {
31 qh -= lmmp_sub_1_(dstq + lo, dstq + lo, hi, 1);
32 cy -= lmmp_add_n_(numa + lo, numa + lo, numb, n);
33 }
34
35 if (lo < DIV_DIVIDE_THRESHOLD) {
36 ql = lmmp_div_basecase_(dstq, numa + hi, 2 * lo, numb + hi, lo, inv21);
37 } else {
38 ql = lmmp_div_divide_n_(dstq, numa + hi, numb + hi, lo, inv21, tp);
39 }
40 lmmp_mul_(tp, numb, hi, dstq, lo);
41
42 cy = lmmp_sub_n_(numa, numa, tp, n);
43 if (ql)
44 cy += lmmp_sub_n_(numa + lo, numa + lo, numb, hi);
45
46 while (cy) {
47 lmmp_sub_1_(dstq, dstq, lo, 1);
48 cy -= lmmp_add_n_(numa, numa, numb, n);
49 }
50 return qh;
51}
void lmmp_mul_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
不等长大数乘法操作 [dst,na+nb] = [numa,na] * [numb,nb]
static mp_limb_t lmmp_sub_1_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_limb_t x)
大数减单精度数静态内联函数 [dst,na]=[numa,na]-x
Definition lmmpn.h:1122
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_div_basecase_(mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb, mp_limb_t inv21)
基础除法运算
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 DIV_DIVIDE_THRESHOLD
Definition mparam.h:26

引用了 DIV_DIVIDE_THRESHOLD, LIMB_B_2, lmmp_add_n_(), lmmp_div_basecase_(), lmmp_div_divide_n_(), lmmp_mul_(), lmmp_param_assert, lmmp_sub_1_(), lmmp_sub_n_() , 以及 tp.

被这些函数引用 lmmp_div_divide_() , 以及 lmmp_div_divide_n_().

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