57 {
58 if (nb == 1) {
60 if (dstr)
61 *dstr = rem;
62 } else if (nb == 2) {
64 brem[0] = numb[0];
65 brem[1] = numb[1];
67 if (dstr) {
68 dstr[0] = brem[0];
69 dstr[1] = brem[1];
70 }
71 } else {
72 int adjust = numa[na - 1] >= numb[nb - 1];
75 if (nq == 0) {
76 if (dstr && dstr != numa)
78 if (dstq)
79 dstq[0] = 0;
80 return;
81 }
83
84 if (!dstq)
86 dstq[na - nb] = 0;
87
88 if (nq >= nb) {
91 if (cnt) {
92 numa2[na] =
lmmp_shl_(numa2, numa, na, cnt);
95 } else {
96 numa2[na] = 0;
99 }
100
102 na += adjust;
103
108 else {
113 }
114
115 if (dstr) {
116 if (cnt)
118 else
120 }
121 } else {
122
123
128
130 if (cnt) {
133 numb2[0] |= numb[ni - 1] >> (
LIMB_BITS - cnt);
134 cy =
lmmp_shl_(numa2, numa + na - 2 * nq, 2 * nq, cnt);
135 if (adjust) {
136 numa2[2 * nq] = cy;
137 ++numa2;
138 } else
139 numa2[0] |= numa[na - 2 * nq - 1] >> (
LIMB_BITS - cnt);
140 } else {
141 numb2 = (
mp_ptr)numb + ni;
142 lmmp_copy(numa2, numa + na - 2 * nq, 2 * nq);
143 if (adjust) {
144 numa2[2 * nq] = 0;
145 ++numa2;
146 }
147 }
148
149
150
151
152
153
154
155 if (nq == 1) {
157 } else if (nq == 2) {
159 } else {
161
166 else {
171 }
172 }
173
174
175
176
177
178
179
180
181
183 if (cnt) {
185 if (ni < 2)
186 dl = 0;
187 else
188 dl = numb[ni - 2];
189 x = (numb[ni - 1] << cnt) | (dl >> (
LIMB_BITS - cnt));
190 } else
191 x = numb[ni - 1];
195
196 if (h > numa2[nq - 1]) {
199 }
200
201
202
203 if (cnt) {
204 numa2[nq] = rnb;
205 ++nr;
206 --ni;
208 numa2[0] |= numa[ni] & (
LIMB_MAX >> cnt);
210 rnb = -(numa2[nq] < cy);
211 numa2[nq] -= cy;
212 }
213
214 if (ni == 0) {
215 if (dstr) {
216 if (rnb)
218 else
220 }
221 } else {
223 if (ni < nq)
225 else
227
228 if (dstr) {
229 mp_ptr remptr = dstr == numb ?
tp : dstr;
232 if (rnb)
234 else if (dstr != remptr)
236 } else {
238 if (hcmp < 0)
239 --rnb;
240 else if (hcmp == 0)
242 }
243 }
244
245 if (rnb)
247 }
248
250 }
251}
#define lmmp_copy(dst, src, n)
static mp_size_t lmmp_div_inv_size_(mp_size_t nq, mp_size_t nb)
计算预计算逆元的尺寸
mp_limb_t lmmp_div_1_s_(mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_limb_t x)
单精度数除法(除数为1个limb)
mp_limb_t lmmp_div_1_(mp_ptr dstq, mp_srcptr numa, mp_size_t na, mp_limb_t x)
单精度数除法
int lmmp_leading_zeros_(mp_limb_t x)
计算一个单精度数(limb)中前导零的个数
static int lmmp_cmp_(mp_srcptr numa, mp_srcptr numb, mp_size_t n)
大数比较函数(内联)
#define lmmp_dec(p)
大数减1宏(预期无借位)
void lmmp_inv_prediv_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t ni)
除法前的逆元预计算,[dst,ni] = invappr( (ni+1 MSLs of numa) + 1 ) / B
void lmmp_div_2_(mp_ptr dstq, mp_srcptr numa, mp_size_t na, mp_ptr numb)
双精度数除法 (除数为2个limb)
mp_limb_t lmmp_shr_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr)
大数右移操作 [dst,na] = [numa,na] >> shr,dst的高shr位填充0
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]
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
mp_limb_t lmmp_div_mulinv_(mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb, mp_srcptr invappr, mp_size_t ni)
乘法逆元除法
mp_limb_t lmmp_div_2_s_(mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_srcptr numb)
双精度数除法(除数为2个limb)
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]
mp_limb_t lmmp_inv_2_1_(mp_limb_t xh, mp_limb_t xl)
2-1阶逆元计算 (inv21)
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_sub_nc_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c)
带借位的n位减法 [dst,n] = [numa,n] - [numb,n] - c
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)
分治除法运算
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]
#define DIV_DIVIDE_THRESHOLD
#define DIV_MULINV_N_THRESHOLD
#define DIV_MULINV_L_THRESHOLD
#define TALLOC_TYPE(n, type)