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

浏览源代码.

函数

mp_limb_t lmmp_div_divide_ (mp_ptr restrict dstq, mp_ptr restrict numa, mp_size_t na, mp_srcptr restrict numb, mp_size_t nb, mp_limb_t inv21)
 
static mp_limb_t lmmp_div_divide_n_ (mp_ptr restrict dstq, mp_ptr restrict numa, mp_srcptr restrict numb, mp_size_t n, mp_limb_t inv21, mp_ptr restrict tp)
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 

函数说明

◆ lmmp_div_divide_()

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

在文件 div_divide.c79 行定义.

86 {
87 lmmp_param_assert(na >= 2 * nb);
90 mp_size_t nq = na - nb;
91
92 dstq += nq;
93 numa += nq;
94
95 do {
96 nq -= nb;
97 } while (nq >= nb);
98
99 dstq -= nq;
100 numa -= nq;
101
102 /* Perform the typically smaller block first. */
104
105 TEMP_DECL;
107 nq = na - nb - nq;
108
109 do {
110 dstq -= nb;
111 numa -= nb;
113 nq -= nb;
114 } while (nq > 0);
115
116 TEMP_FREE;
117 return qh;
118}
static mp_limb_t lmmp_div_divide_n_(mp_ptr restrict dstq, mp_ptr restrict numa, mp_srcptr restrict numb, mp_size_t n, mp_limb_t inv21, mp_ptr restrict tp)
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition div_divide.c:32
mp_limb_t * mp_ptr
Definition lmmp.h:80
uint64_t mp_size_t
Definition lmmp.h:77
uint64_t mp_limb_t
Definition lmmp.h:76
#define lmmp_param_assert(x)
Definition lmmp.h:401
mp_limb_t lmmp_div_s_(mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
除法运算
#define LIMB_B_2
Definition mparam.h:157
#define numb
#define tp
#define n
#define TEMP_DECL
Definition tmp_alloc.h:131
#define TEMP_FREE
Definition tmp_alloc.h:150
#define TALLOC_TYPE(n, type)
Definition tmp_alloc.h:148

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

+ 函数调用图:

◆ lmmp_div_divide_n_()

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

Copyright (C) 2026 HJimmyK(Jericho Knox)

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

分治除法

参数
dstq结果商指针([dstq,n]=[numa,2*n] div [numb,n])
numa被除数指针([numa,n]=[numa,2*n] mod [numb,n])
numb除数指针
n除数长度
inv21除数高128位的逆
tp临时工作区指针(需要 n 个 limb 的空间)
警告
n>=6, MSB(numb)=1, inv21=(2^192-1)/[numb+n-2,2]-2^64, sep(dstq,numa,numb,tp)
返回
除法结果最高位商

在文件 div_divide.c32 行定义.

39 {
40 lmmp_param_assert(n >= 6);
42 mp_size_t lo = n >> 1, hi = n - lo;
43 mp_limb_t cy, qh, ql;
44
46 qh = lmmp_div_basecase_(dstq + lo, numa + 2 * lo, 2 * hi, numb + lo, hi, inv21);
47 } else {
48 qh = lmmp_div_divide_n_(dstq + lo, numa + 2 * lo, numb + lo, hi, inv21, tp);
49 }
50 lmmp_mul_(tp, dstq + lo, hi, numb, lo);
51
52 cy = lmmp_sub_n_(numa + lo, numa + lo, tp, n);
53 if (qh)
54 cy += lmmp_sub_n_(numa + n, numa + n, numb, lo);
55
56 while (cy) {
57 qh -= lmmp_sub_1_(dstq + lo, dstq + lo, hi, 1);
58 cy -= lmmp_add_n_(numa + lo, numa + lo, numb, n);
59 }
60
62 ql = lmmp_div_basecase_(dstq, numa + hi, 2 * lo, numb + hi, lo, inv21);
63 } else {
65 }
67
68 cy = lmmp_sub_n_(numa, numa, tp, n);
69 if (ql)
70 cy += lmmp_sub_n_(numa + lo, numa + lo, numb, hi);
71
72 while (cy) {
73 lmmp_sub_1_(dstq, dstq, lo, 1);
75 }
76 return qh;
77}
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:1114
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:80
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:81
#define DIV_DIVIDE_THRESHOLD
Definition mparam.h:26
#define lo

引用了 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_(), lo, n, numb , 以及 tp.

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

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