|
LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
|
numth.h 的引用(Include)关系图:
此图展示该文件直接或间接的被哪些文件引用了:宏定义 | |
| #define | INLINE_ static inline |
类型定义 | |
| typedef int8_t | schar |
| typedef int8_t * | scharp |
| typedef int32_t | sint |
| typedef int32_t * | sintp |
| typedef int64_t | slong |
| typedef int64_t * | slongp |
| typedef int16_t | sshort |
| typedef int16_t * | sshortp |
| typedef uint8_t | uchar |
| typedef uint8_t * | ucharp |
| typedef uint32_t | uint |
| typedef uint32_t * | uintp |
| typedef uint64_t | ulong |
| typedef uint64_t * | ulongp |
| typedef uint16_t | ushort |
| typedef uint16_t * | ushortp |
计算等差数列乘积 x(x+m)...(x+n*m)
| dst | 结果指针 |
| rn | 结果指针的 limb 长度 |
| x | 首项 |
| n | 等差数列共n+1项 |
| m | 公差(大于1) |
计算等差数列乘积 x(x+m)...(x+n*m)的 limb 缓冲区长度
| x | 首项 |
| n | 等差数列共n+1项 |
| m | 公差 |
在文件 arith_seqprod.c 第 14 行定义.
计算 [numa,2] 在B^2下的逆元
| numa | 待求逆元指针(长度为 2 个limb) |
| dst | 结果指针(长度为 2 个limb) |
在文件 binvert_1.c 第 47 行定义.
引用了 _umul64to128_(), a0, a1, k, lmmp_binvert_ulong_(), lmmp_param_assert , 以及 xn.
被这些函数引用 lmmp_binvert_3_(), lmmp_binvert_4_() , 以及 lmmp_binvert_n_dc_().
函数调用图:
这是这个函数的调用关系图:计算 [numa,3] 在B^3下的逆元
| numa | 待求逆元指针(长度为 3 个limb) |
| dst | 结果指针(长度为 3 个limb) |
被这些函数引用 lmmp_binvert_n_dc_().
这是这个函数的调用关系图:计算 [numa,4] 在B^4下的逆元
| numa | 待求逆元指针(长度为 4 个limb) |
| dst | 结果指针(长度为 4 个limb) |
被这些函数引用 lmmp_binvert_n_dc_().
这是这个函数的调用关系图:计算 [numa,n] 在B^n下的逆元
| numa | 待求逆元指针(长度为 n 个limb) |
| dst | 结果指针(长度为 n 个limb) |
| n | 结果的 limb 长度 |
| tp | 临时工作区指针(长度为 5*(n+1)/2 个limb) |
计算 a 在2^32下的逆元
| a | 待求逆元 |
在文件 binvert_1.c 第 21 行定义.
引用了 binv_tab , 以及 lmmp_param_assert.
计算 a 在2^64下的逆元
| a | 待求逆元 |
在文件 binvert_1.c 第 33 行定义.
引用了 binv_tab , 以及 lmmp_param_assert.
被这些函数引用 lmmp_binvert_2_(), lmmp_binvert_n_dc_(), lmmp_is_prime_notrial_() , 以及 lmmp_powmod_ulong_().
这是这个函数的调用关系图:| mp_size_t lmmp_factorial_ | ( | mp_ptr | dst, |
| mp_bitcnt_t | bits, | ||
| mp_size_t | rn, | ||
| uint | n | ||
| ) |
计算 n! 阶乘
| dst | 结果指针 |
| bits | n! 的2的因子数 |
| rn | 结果指针的 limb 长度 |
| n | 阶乘的阶数 |
| mp_size_t lmmp_factorial_size_ | ( | uint | n, |
| mp_bitcnt_t * | bits | ||
| ) |
计算 n! 阶乘的 limb 缓冲区长度
| n | 阶乘的阶数 |
| bits | 被修改为 n! 的2的因子数 |
计算 [numa,na] 在B^n 下的逆元
| dst | 结果指针(长度为 n 个limb) |
| numa | 待求逆元指针(长度为 na 个limb) |
| na | 待求逆元的 limb 长度 |
| n | 结果的 limb 长度 |
计算两个无符号整数的最大公约数
| u | 第一个无符号整数 |
| v | 第二个无符号整数 |
引用了 k, lmmp_param_assert , 以及 lmmp_tailing_zeros_().
被这些函数引用 lmmp_gcd_1_(), lmmp_gcd_22_() , 以及 lmmp_gcd_lehmer_().
函数调用图:
这是这个函数的调用关系图:计算两个无符号整数的最大公约数
| up | 第一个无符号整数指针 |
| un | 第一个无符号整数的 limb 长度 |
| v | 第二个无符号整数 |
引用了 lmmp_gcd_11_(), lmmp_mod_1_() , 以及 lmmp_param_assert.
被这些函数引用 lmmp_gcd_lehmer_().
函数调用图:
这是这个函数的调用关系图:计算两个无符号整数的最大公约数
| up | 第一个无符号整数指针,长度为 2 |
| vp | 第二个无符号整数指针,长度为 2 |
| dst | 结果指针(长度为 2,两个 limb 都会进行写入,即使最高位可能为0) |
引用了 _u128cmp, _u128lshl, _u128lshr, _u128sub, _u128sub64, k, lmmp_gcd_11_(), lmmp_param_assert , 以及 lmmp_tailing_zeros_().
被这些函数引用 lmmp_gcd_2_().
函数调用图:
这是这个函数的调用关系图:计算两个无符号整数的最大公约数
| up | 第一个无符号整数指针 |
| un | 第一个无符号整数的 limb 长度 |
| vp | 第二个无符号整数指针,长度为 2 |
| dst | 结果指针(长度至少为 2,两个 limb 都会进行写入,即使最高位可能为0) |
引用了 lmmp_gcd_22_(), lmmp_mod_2_() , 以及 lmmp_param_assert.
函数调用图:计算两个无符号整数的最大公约数(不建议使用此算法,更高版本可能被彻底弃用)
| dst | 结果指针(长度至少为 min(un,vn)) |
| up | 第一个无符号整数指针 |
| un | 第一个无符号整数的 limb 长度 |
| vp | 第二个无符号整数指针 |
| vn | 第二个无符号整数的 limb 长度 |
在文件 gcd_basecase.c 第 11 行定义.
引用了 an, bn, lmmp_cmp_(), lmmp_copy, lmmp_div_(), lmmp_param_assert, LMMP_SWAP, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.
函数调用图:计算两个无符号整数的最大公约数(Lehmer算法)
| dst | 结果指针(长度至少为 min(un,vn)) |
| up | 第一个无符号整数指针 |
| un | 第一个无符号整数的 limb 长度 |
| vp | 第二个无符号整数指针 |
| vn | 第二个无符号整数的 limb 长度 |
在文件 gcd_lehmer.c 第 233 行定义.
引用了 an, BALLOC_TYPE, bn, lmmp_cmp_(), lmmp_copy, lmmp_div_(), lmmp_gcd_11_(), lmmp_gcd_1_(), lmmp_gcd_lehmer_step_(), lmmp_lehmer_extract_(), lmmp_lehmer_mul_(), lmmp_param_assert, LMMP_SWAP, mp_gcd_lehmer_t::m21, lehmer_stack_t::mp, lehmer_stack_t::np, TEMP_B_DECL, TEMP_B_FREE , 以及 lehmer_stack_t::tp.
函数调用图:| bool lmmp_is_prime_uint_ | ( | uint | n | ) |
判断素数
| n | 待判断的数 |
判断素数
Hashed 2-bases for n < 684630005672341 (slightly more than 2^49) Hashed 3-bases for n < 2^64
Based on Steve Worley's 2^32 example: http://www.mersenneforum.org/showthread.php?t=12209 With a 3-base encoding idea from Bradley Berg.
Copyright 2014, Dana Jacobsen dana@.nosp@m.acm..nosp@m.org
在文件 is_prime_ulong.c 第 249 行定义.
引用了 _udiv64_gen(), dj_base49, lmmp_is_prime_table_(), miller_rabin_32(), PRIME_SHORT_TABLE_N , 以及 trial_div35711().
函数调用图:| bool lmmp_is_prime_ulong_ | ( | ulong | n | ) |
判断素数
| n | 待判断的数 |
在文件 is_prime_ulong.c 第 365 行定义.
引用了 lmmp_is_prime_notrial_(), lmmp_is_prime_table_(), PRIME_SHORT_TABLE_N , 以及 trial_div35711().
函数调用图:计算两个无符号整数的乘积,对mod取模,商放入 q 中
| a | 第一个无符号整数 |
| b | 第二个无符号整数 |
| q | 商的结果指针 |
| mod | 取模数 |
计算多项式系数
| dst | 结果指针 |
| rn | 结果指针的 limb 长度 |
| n | r[i] 的总和 |
| r | 需要计算的系数的数组 |
| m | 系数的个数 |
计算多项式系数的 limb 缓冲区长度
| r | 需要计算的系数的数组 |
| m | 系数的个数 |
| n | 输出变量,将会被修改为 r[i] 的总和,即r1+r2+...+rm |
计算 nCr 组合数 ( nCr = n! / (r!(n-r)!) )
| dst | 结果指针 |
| bits | nCr 的2的因子数 |
| rn | 结果指针的 limb 长度 |
| n | 组合数的总数 |
| r | 组合数的选择数 |
引用了 LIMB_BITS, lmmp_debug_assert, lmmp_odd_nCr_uint_(), lmmp_odd_nCr_ushort_(), lmmp_shl_(), lmmp_zero , 以及 NCR_SHORT_LIMIT.
函数调用图:| mp_size_t lmmp_nCr_size_ | ( | uint | n, |
| uint | r, | ||
| mp_bitcnt_t * | bits | ||
| ) |
计算 nCr 组合数的 limb 缓冲区长度
| n | 组合数的总数 |
| r | 组合数的选择数 |
| bits | 被修改为 nCr 的2的因子数 |
大于n的下一个素数
| n | 起始点(不含) |
在文件 is_prime_ulong.c 第 435 行定义.
引用了 lmmp_is_prime_notrial_(), lmmp_prime_cnt16_(), MP_ULONG_MAX, prime_short_table, PRIME_SHORT_TABLE_SIZE, trial_div13(), trial_div17(), trial_div19(), trial_div23(), trial_div29(), trial_div31(), trial_div35711(), trial_div37(), trial_div41() , 以及 ULONG_PRIME_MAX.
函数调用图:计算 nPr 排列数 ( nPr = n! / (n-r)! )
| dst | 结果指针 |
| bits | nPr 的2的因子数 |
| rn | 结果指针的 limb 长度 |
| n | 排列数的总数 |
| r | 排列数的选择数 |
| mp_size_t lmmp_nPr_size_ | ( | ulong | n, |
| ulong | r, | ||
| mp_bitcnt_t * | bits | ||
| ) |
计算 nPr 排列数的 limb 缓冲区长度
| n | 排列数的总数 |
| r | 排列数的选择数 |
| bits | 被修改为 nPr 的2的因子数 |
被这些函数引用 pow_nPr_().
这是这个函数的调用关系图:计算 n! 阶乘的奇数部分
| dst | 结果指针 |
| rn | 结果指针的 limb 长度(factorial_size_ 函数的返回值 - bits/LIMB_BITS) |
| n | 阶乘的阶数 |
计算 nCr 组合数的奇数部分
| dst | 结果指针 |
| rn | 结果指针的 limb 长度 |
| n | 组合数的总数 |
| r | 组合数的选择数 |
计算 nCr 组合数的奇数部分
| dst | 结果指针 |
| rn | 结果指针的 limb 长度 |
| n | 组合数的总数 |
| r | 组合数的选择数 |
计算 nPr 排列数的奇数部分
| dst | 结果指针 |
| rn | 结果指针的 limb 长度(nPr_size_ 函数的返回值 - bits/LIMB_BITS) |
| n | 排列数的总数 |
| r | 排列数的选择数 |
被这些函数引用 _odd_nPr_().
这是这个函数的调用关系图:计算 nPr 排列数的奇数部分
| dst | 结果指针 |
| rn | 结果指针的 limb 长度(nPr_size_ 函数的返回值 - bits/LIMB_BITS) |
| n | 排列数的总数 |
| r | 排列数的选择数 |
计算 nPr 排列数的奇数部分
| dst | 结果指针 |
| rn | 结果指针的 limb 长度(nPr_size_ 函数的返回值 - bits/LIMB_BITS) |
| n | 排列数的总数 |
| r | 排列数的选择数 |
被这些函数引用 _odd_nPr_(), lmmp_factorial_(), lmmp_odd_multinomial_ushort_() , 以及 lmmp_odd_nCr_ushort_().
这是这个函数的调用关系图:计算大整数幂 [dst,rn] = [base,n] ^ exp
| dst | 结果指针 |
| rn | 结果 limb 长度 |
| base | 底数 |
| n | 底数的 limb 长度 |
| exp | 指数 |
计算幂次方 [dst,rn] = [base,1] ^ exp
| dst | 结果指针 |
| base | 底数 |
| exp | 指数 |
被这些函数引用 lmmp_pow_().
这是这个函数的调用关系图:计算幂次方需要的limb缓冲区长度 base ^ exp
| base | 底数 |
| exp | 指数 |
引用了 LIMB_BITS , 以及 lmmp_param_assert.
被这些函数引用 lmmp_nPr_size_() , 以及 pow_nPr_().
这是这个函数的调用关系图:计算奇数次幂算法 [dst,rn] = [base,n] ^ exp
| dst | 结果指针 |
| rn | dst 的 limb 缓冲区长度 |
| base | 底数指针 |
| n | 底数的 limb 长度 |
| exp | 指数 |
被这些函数引用 lmmp_pow_().
这是这个函数的调用关系图:计算幂次方需要的limb缓冲区长度 [base,n] ^ exp
| base | 底数指针 |
| n | 底数 limb 长度 |
| exp | 指数 |
引用了 LIMB_BITS , 以及 lmmp_param_assert.
被这些函数引用 lmmp_pow_().
这是这个函数的调用关系图:计算幂次方2比特窗口快速幂算法 [dst,rn] = [base,n] ^ exp
| dst | 结果指针 |
| rn | 结果 limb 长度 |
| base | 底数 |
| n | 底数的 limb 长度 |
| exp | 指数 |
被这些函数引用 lmmp_pow_().
这是这个函数的调用关系图:计算 base^exp 对 mod 取模
| base | 底数 |
| exp | 指数 |
| mod | 模数 |
在文件 is_prime_ulong.c 第 98 行定义.
引用了 _udiv64_gen(), _udiv64by64_q_preinv() , 以及 lmmp_param_assert.
被这些函数引用 lmmp_powmod_ulong_().
函数调用图:
这是这个函数的调用关系图:计算 base^exp 对 mod 取模
| base | 底数 |
| exp | 指数 |
| mod | 模数 |
在文件 is_prime_ulong.c 第 121 行定义.
引用了 from_mont63(), from_mont64(), lmmp_binvert_ulong_(), lmmp_powmod_uint_(), MONT63_MAX, mont63_mul(), mont63_R2(), mont64_mul(), mont64_R2(), MP_UINT_MAX, to_mont63() , 以及 to_mont64().
函数调用图:小于等于n的上一个素数
| n | 起始点(含) |
在文件 is_prime_ulong.c 第 465 行定义.
引用了 lmmp_is_prime_notrial_(), lmmp_prime_cnt16_(), prime_short_table, PRIME_SHORT_TABLE_N, trial_div13(), trial_div17(), trial_div19(), trial_div23(), trial_div29(), trial_div31(), trial_div35711(), trial_div37(), trial_div41() , 以及 ULONG_PRIME_MIN.
函数调用图:除去[np,nn]中的[dp,dn]的因子
| np | 被除数指针,将会被修改为除去因子后的数 |
| nn | 被除数指针的 limb 长度,将会被修改除去因子后的长度 |
| dp | 除数指针 |
| dn | 除数指针的 limb 长度 |
引用了 lmmp_copy, lmmp_param_assert, lmmp_sqr_(), LMMP_SWAP, MAX_EXP, TALLOC_TYPE, TEMP_DECL, TEMP_FREE , 以及 try_div_().
函数调用图:试除法
| num | 被除数 |
| nn | 被除数的 limb 长度 |
| N | 试除法尝试的质数最大值 |
| rn | 结果指针的 limb 长度 |
计算幂次方 [dst,rn] = [base,1] ^ exp
| dst | 结果指针 |
| rn | 结果 limb 长度 |
| base | 底数 |
| exp | 指数 |
被这些函数引用 _odd_pow_().
这是这个函数的调用关系图:计算幂次方 [dst,rn] = [base,1] ^ exp
| dst | 结果指针 |
| rn | 结果 limb 长度 |
| base | 底数 |
| exp | 指数 |
被这些函数引用 _odd_pow_().
这是这个函数的调用关系图:计算幂次方 [dst,rn] = [base,1] ^ exp
| dst | 结果指针 |
| rn | 结果 limb 长度 |
| base | 底数 |
| exp | 指数 |
被这些函数引用 _odd_pow_().
这是这个函数的调用关系图:计算幂次方 [dst,rn] = [base,1] ^ exp
| dst | 结果指针 |
| rn | 结果 limb 长度 |
| base | 底数 |
| exp | 指数 |