7#include "../../../include/lammp/lmmpn.h"
8#include "../../../include/lammp/numth.h"
9#include "../../../include/lammp/impl/tmp_alloc.h"
16#define LEHMER_MIN_V 0x100000000ull
17#define LEHMER_EXACT_BITS 63
72 }
else if (un == vn + 1) {
113 (ms->
tp)[
bn - 1] = c;
117 }
else if (
an ==
bn) {
127 while (a[
an - 1] == 0 &&
an > 0) {
147 (ms->
tp)[ms->
tn - 1] = ca;
154 (ms->
mp)[ms->
mn - 1] = ca;
157 if (ms->
tn > ms->
mn) {
160 }
else if (ms->
mn > ms->
tn) {
173 while (ms->
np[ms->
nn - 1] == 0 && ms->
nn > 0) {
183 (ms->
tp)[ms->
tn - 1] = ca;
190 (ms->
mp)[ms->
mn - 1] = ca;
193 if (ms->
tn > ms->
mn) {
196 }
else if (ms->
mn > ms->
tn) {
209 while (a[
an - 1] == 0 &&
an > 0) {
241 }
else if (un == vn) {
246 }
else if (cmp < 0) {
265 ms.
mp = temp + (
an + 1);
266 ms.
np = temp + (
an + 1) * 2;
272 while (bzero ==
false) {
273 if (
an > 1 &&
bn == 1) {
276 }
else if (
an == 1 &&
bn == 1) {
288 while (dst[
bn - 1] == 0 &&
bn > 0) {
static void lmmp_gcd_lehmer_step_(slong u, slong v, mp_gcd_lehmer_t *gcd)
mp_size_t lmmp_gcd_lehmer_(mp_ptr dst, mp_srcptr up, mp_size_t un, mp_srcptr vp, mp_size_t vn)
计算两个无符号整数的最大公约数(Lehmer算法)
#define LEHMER_EXACT_BITS
static bool lmmp_lehmer_mul_(mp_ptr a, mp_size_t *an, mp_ptr b, mp_size_t *bn, mp_gcd_lehmer_t *M, lehmer_stack_t *ms)
/ a \ = / A B \ * / a \ \ b / \ C D / \ b /
static void lmmp_lehmer_extract_(mp_srcptr up, mp_size_t un, mp_srcptr vp, mp_size_t vn, slong *a, slong *b)
#define LMMP_SWAP(x, y, type)
#define lmmp_copy(dst, src, n)
#define lmmp_debug_assert(x)
const mp_limb_t * mp_srcptr
#define lmmp_param_assert(x)
static int lmmp_cmp_(mp_srcptr numa, mp_srcptr numb, mp_size_t n)
大数比较函数(内联)
int lmmp_limb_bits_(mp_limb_t x)
计算满足 2^k > x 的最小自然数k
static mp_limb_t lmmp_sub_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
大数减法静态内联函数 [dst,na]=[numa,na]-[numb,nb]
mp_limb_t lmmp_mul_1_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_limb_t x)
大数乘以单limb操作 [dst,na] = [numa,na] * x
void lmmp_div_(mp_ptr dstq, mp_ptr dstr, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
大数除法和取模操作
mp_limb_t lmmp_gcd_1_(mp_srcptr up, mp_size_t un, mp_limb_t vlimb)
计算两个无符号整数的最大公约数
mp_limb_t lmmp_gcd_11_(mp_limb_t u, mp_limb_t v)
计算 [numa,na] 在B^n 下的逆元
#define BALLOC_TYPE(n, type)