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

浏览源代码.

宏定义

#define an   un
 
#define bn   vn
 

函数

mp_size_t lmmp_gcd_basecase_ (mp_ptr dst, mp_srcptr up, mp_size_t un, mp_srcptr vp, mp_size_t vn)
 计算两个无符号整数的最大公约数(不建议使用此算法,更高版本可能被彻底弃用)
 

宏定义说明

◆ an

#define an   un

◆ bn

#define bn   vn

函数说明

◆ lmmp_gcd_basecase_()

mp_size_t lmmp_gcd_basecase_ ( mp_ptr  dst,
mp_srcptr  up,
mp_size_t  un,
mp_srcptr  vp,
mp_size_t  vn 
)

计算两个无符号整数的最大公约数(不建议使用此算法,更高版本可能被彻底弃用)

参数
dst结果指针(长度至少为 min(un,vn))
up第一个无符号整数指针
un第一个无符号整数的 limb 长度
vp第二个无符号整数指针
vn第二个无符号整数的 limb 长度
警告
up!=NULL, un>0, vp!=NULL, vn>0, eqsep(dst,[up|vp]), dst!=NULL
注解
朴素的辗转相除法,与Lehmer算法具有相似的渐进时间复杂度,但Lehmer算法绝大多数场合更加优秀
返回
dst 的实际 limb 长度

在文件 gcd_basecase.c11 行定义.

11 {
12 lmmp_param_assert(un > 0 && vn > 0);
13 if (un < vn) {
14 LMMP_SWAP(up, vp, mp_srcptr);
15 LMMP_SWAP(un, vn, mp_size_t);
16 } else if (un == vn) {
17 int cmp = lmmp_cmp_(up, vp, un);
18 if (cmp < 0) {
19 LMMP_SWAP(up, vp, mp_srcptr);
20 } else if (cmp == 0) {
21 lmmp_copy(dst, up, un);
22 return un;
23 }
24 }
26#define an un
27#define bn vn
30 lmmp_copy(a, up, an);
31 lmmp_copy(b, vp, bn);
32 while (bn > 0 || (bn == 1 && b[0] == 0)) {
33 // dst = a % b;
34 lmmp_div_(NULL, dst, a, an, b, bn);
35 lmmp_copy(a, b, bn);
36 an = bn;
37 while (dst[bn - 1] == 0 && bn > 0) {
38 --bn;
39 }
40 lmmp_copy(b, dst, bn);
41 }
42 lmmp_copy(dst, a, an);
44 return an;
45#undef an
46#undef bn
47}
#define an
#define bn
mp_limb_t * mp_ptr
Definition lmmp.h:215
#define LMMP_SWAP(x, y, type)
Definition lmmp.h:352
#define lmmp_copy(dst, src, n)
Definition lmmp.h:364
uint64_t mp_size_t
Definition lmmp.h:212
const mp_limb_t * mp_srcptr
Definition lmmp.h:216
uint64_t mp_limb_t
Definition lmmp.h:211
#define lmmp_param_assert(x)
Definition lmmp.h:398
static int lmmp_cmp_(mp_srcptr numa, mp_srcptr numb, mp_size_t n)
大数比较函数(内联)
Definition lmmpn.h:1004
void lmmp_div_(mp_ptr dstq, mp_ptr dstr, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
大数除法和取模操作
Definition div.c:57
#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

引用了 an, bn, lmmp_cmp_(), lmmp_copy, lmmp_div_(), lmmp_param_assert, LMMP_SWAP, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.

+ 函数调用图: