计算两个无符号整数的最大公约数(不建议使用此算法,更高版本可能被彻底弃用)
- 参数
-
| 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.c 第 11 行定义.
11 {
13 if (un < vn) {
16 } else if (un == vn) {
18 if (cmp < 0) {
20 } else if (cmp == 0) {
22 return un;
23 }
24 }
26#define an un
27#define bn vn
32 while (
bn > 0 || (
bn == 1 && b[0] == 0)) {
33
37 while (dst[
bn - 1] == 0 &&
bn > 0) {
39 }
41 }
45#undef an
46#undef bn
47}
#define LMMP_SWAP(x, y, type)
#define lmmp_copy(dst, src, n)
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)
大数比较函数(内联)
void lmmp_div_(mp_ptr dstq, mp_ptr dstr, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
大数除法和取模操作
#define TALLOC_TYPE(n, type)
引用了 an, bn, lmmp_cmp_(), lmmp_copy, lmmp_div_(), lmmp_param_assert, LMMP_SWAP, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.