|
LMCAS
Lamina Computer Algebra System
|
函数 | |
| std::vector< std::vector< int64_t > > | bk_build_q_matrix (const std::vector< int64_t > &f, int64_t p) |
| 构造 F_p 上的 Berlekamp 矩阵 Q。 | |
| static std::vector< int64_t > | bk_derivative_mod (const std::vector< int64_t > &f, int64_t p) |
| 计算模 p 多项式的形式导数. | |
| void | bk_div_mod (const std::vector< int64_t > &a, const std::vector< int64_t > &b, int64_t p, std::vector< int64_t > &q, std::vector< int64_t > &r) |
| 模 p 多项式带余除法. | |
| static void | bk_eliminate_column (std::vector< std::vector< int64_t > > &matrix, int current_row, int col, int64_t p) |
| std::vector< int64_t > | bk_gcd_mod (std::vector< int64_t > a, std::vector< int64_t > b, int64_t p) |
| 计算两个模 p 多项式的最大公因式. | |
| static bool | bk_is_square_free_mod (const std::vector< int64_t > &f, int64_t p) |
| 检查模 p 多项式是否为 无平方因子. | |
| bool | bk_is_suitable_prime (const Polynomial< Rational > &poly, int64_t prime) |
| 判断素数是否保持多项式次数和无平方性质。 | |
| int64_t | bk_mod_inverse (int64_t a, int64_t p) |
| 模 p 下求乘法逆元. | |
| std::vector< std::vector< int64_t > > | bk_null_space (const std::vector< std::vector< int64_t > > &Q, int64_t p) |
| static std::vector< int64_t > | bk_poly_mul_mod (const std::vector< int64_t > &a, const std::vector< int64_t > &b, const std::vector< int64_t > &f, int64_t p) |
| 在 F_p 上计算 a(x) * b(x) mod f(x)。 | |
| static std::vector< int64_t > | bk_poly_pow_mod (const std::vector< int64_t > &base, int64_t exp, const std::vector< int64_t > &f, int64_t p) |
| 在 F_p 上用平方乘法计算 base^exp mod f(x)。 | |
| static void | bk_reduce_matrix (std::vector< std::vector< int64_t > > &M, int64_t p, std::vector< int > &pivot_col, std::vector< int > &pivot_row) |
| std::vector< int64_t > | bk_reduce_to_mod_coeffs (const Polynomial< Rational > &poly, int64_t p) |
| 以系数分母的 LCM 清除分母,再逐项取模 p。 | |
| int64_t | bk_select_prime (const Polynomial< Rational > &poly) |
| 从小素数表中选取适合 Berlekamp 分解的素数。 | |
| std::vector< std::vector< int64_t > > | bk_split_factors (const std::vector< int64_t > &f_coeffs, const std::vector< std::vector< int64_t > > &null_basis, int null_dim, int64_t p) |
| static bool | bk_split_one_factor (std::vector< std::vector< int64_t > > &factor_list, size_t fi, const std::vector< int64_t > &v_poly, int null_dim, int64_t p) |
变量 | |
| static constexpr size_t | BK_NUM_SMALL_PRIMES |
| static constexpr int64_t | BK_SMALL_PRIMES [] |
| Berlekamp 模分解的小素数候选表。 按升序选取首个不整除首项系数且使模约化结果无平方因子的素数。 | |
| std::vector< std::vector< int64_t > > LMCAS::berlekamp_detail::bk_build_q_matrix | ( | const std::vector< int64_t > & | f, |
| int64_t | p ) |
构造 F_p 上的 Berlekamp 矩阵 Q。
对次数为 n 的首一多项式 f,Q 的第 i 行为 x^(i*p) mod f(x) 的系数向量。 先用平方乘法求 h = x^p mod f,再由第 0 行 [1, 0, ..., 0] 逐行乘 h 并取余。
| [in] | f | 首一多项式系数向量(升幂排列,deg(f) = n) |
| [in] | p | 素数模数 |
< f 的次数。
在文件 berlekamp_basis.cpp 第 106 行定义.
引用了 bk_build_q_matrix(), bk_poly_mul_mod() , 以及 bk_poly_pow_mod().
被这些函数引用 LMCAS::berlekamp_factor() , 以及 bk_build_q_matrix().
|
static |
计算模 p 多项式的形式导数.
| [in] | f | 模 p 系数向量 |
| [in] | p | 素数模数 |
在文件 berlekamp_modular.cpp 第 76 行定义.
引用了 bk_derivative_mod().
被这些函数引用 bk_derivative_mod() , 以及 bk_is_square_free_mod().
| void LMCAS::berlekamp_detail::bk_div_mod | ( | const std::vector< int64_t > & | a, |
| const std::vector< int64_t > & | b, | ||
| int64_t | p, | ||
| std::vector< int64_t > & | q, | ||
| std::vector< int64_t > & | r ) |
模 p 多项式带余除法.
计算 a / b 的商和余数,使得 a = q * b + r,deg(r) < deg(b).
| [in] | a | 被除数系数向量 |
| [in] | b | 除数系数向量(非空) |
| [in] | p | 素数模数 |
| [out] | q | 商系数向量 |
| [out] | r | 余数系数向量 |
在文件 berlekamp_modular.cpp 第 129 行定义.
引用了 LMCAS::a, LMCAS::b, bk_div_mod(), bk_mod_inverse() , 以及 LMCAS::r.
被这些函数引用 bk_div_mod(), bk_gcd_mod(), bk_poly_mul_mod(), bk_poly_pow_mod() , 以及 bk_split_one_factor().
|
static |
在文件 berlekamp_basis.cpp 第 138 行定义.
引用了 bk_eliminate_column() , 以及 bk_mod_inverse().
被这些函数引用 bk_eliminate_column() , 以及 bk_reduce_matrix().
| std::vector< int64_t > LMCAS::berlekamp_detail::bk_gcd_mod | ( | std::vector< int64_t > | a, |
| std::vector< int64_t > | b, | ||
| int64_t | p ) |
计算两个模 p 多项式的最大公因式.
使用欧几里得算法.结果为首一多项式.
| [in] | a | 第一个多项式系数向量 |
| [in] | b | 第二个多项式系数向量 |
| [in] | p | 素数模数 |
在文件 berlekamp_modular.cpp 第 179 行定义.
引用了 LMCAS::a, LMCAS::b, bk_div_mod(), bk_gcd_mod(), bk_mod_inverse(), LMCAS::c , 以及 LMCAS::r.
被这些函数引用 bk_gcd_mod(), bk_is_square_free_mod() , 以及 bk_split_one_factor().
|
static |
检查模 p 多项式是否为 无平方因子.
多项式 f 在 F_p 上 无平方因子 当且仅当 gcd(f, f') 的次数为 0.
| [in] | f | 模 p 系数向量 |
| [in] | p | 素数模数 |
在文件 berlekamp_modular.cpp 第 211 行定义.
引用了 bk_derivative_mod(), bk_gcd_mod() , 以及 bk_is_square_free_mod().
被这些函数引用 bk_is_square_free_mod() , 以及 bk_is_suitable_prime().
| bool LMCAS::berlekamp_detail::bk_is_suitable_prime | ( | const Polynomial< Rational > & | poly, |
| int64_t | prime ) |
判断素数是否保持多项式次数和无平方性质。
Berlekamp 分解要求模约化仍位于同一次数的多项式环中,并且 gcd(f mod p, f' mod p) 为常数。显式和自动素数选择共用此检查。
| [in] | poly | 非零有理系数多项式,次数 >= 1。 |
| [in] | prime | 候选模数。 |
在文件 berlekamp_modular.cpp 第 235 行定义.
引用了 bk_is_square_free_mod(), bk_is_suitable_prime(), bk_reduce_to_mod_coeffs(), LMCAS::Polynomial< CoeffType >::degree(), LMCAS::Polynomial< CoeffType >::is_zero() , 以及 LMCAS::prime.
被这些函数引用 LMCAS::berlekamp_factor(), bk_is_suitable_prime() , 以及 bk_select_prime().
| int64_t LMCAS::berlekamp_detail::bk_mod_inverse | ( | int64_t | a, |
| int64_t | p ) |
模 p 下求乘法逆元.
使用扩展欧几里得算法计算 a^(-1) mod p.
| [in] | a | 待求逆的值(非零) |
| [in] | p | 素数模数 |
在文件 berlekamp_modular.cpp 第 111 行定义.
引用了 LMCAS::a, bk_mod_inverse(), LMCAS::extended_gcd() , 以及 LMCAS::t.
被这些函数引用 LMCAS::berlekamp_factor(), bk_div_mod(), bk_eliminate_column(), bk_gcd_mod() , 以及 bk_mod_inverse().
| std::vector< std::vector< int64_t > > LMCAS::berlekamp_detail::bk_null_space | ( | const std::vector< std::vector< int64_t > > & | Q, |
| int64_t | p ) |
< 当前自由变量取 1,其余自由变量取 0。
由行简化阶梯形回代约束分量。 M[row][pc] = 1,故 x[pc] + sum_{自由列 j} M[row][j] * x[j] = 0, 当前基向量满足 x[pc] = -M[row][col] mod p。
在文件 berlekamp_basis.cpp 第 184 行定义.
引用了 LMCAS::basis, bk_null_space() , 以及 bk_reduce_matrix().
被这些函数引用 LMCAS::berlekamp_factor() , 以及 bk_null_space().
|
static |
在 F_p 上计算 a(x) * b(x) mod f(x)。
| [in] | a | 第一个多项式系数向量(升幂排列) |
| [in] | b | 第二个多项式系数向量(升幂排列) |
| [in] | f | 模多项式系数向量(首一,升幂排列) |
| [in] | p | 素数模数 |
在文件 berlekamp_basis.cpp 第 17 行定义.
引用了 LMCAS::a, LMCAS::b, bk_div_mod(), bk_poly_mul_mod() , 以及 LMCAS::r.
被这些函数引用 bk_build_q_matrix(), bk_poly_mul_mod() , 以及 bk_poly_pow_mod().
|
static |
在 F_p 上用平方乘法计算 base^exp mod f(x)。
| [in] | base | 底多项式系数向量(升幂排列) |
| [in] | exp | 指数(非负整数) |
| [in] | f | 模多项式系数向量(首一,升幂排列) |
| [in] | p | 素数模数 |
在文件 berlekamp_basis.cpp 第 55 行定义.
引用了 bk_div_mod(), bk_poly_mul_mod(), bk_poly_pow_mod(), LMCAS::e(), LMCAS::exp() , 以及 LMCAS::r.
被这些函数引用 bk_build_q_matrix() , 以及 bk_poly_pow_mod().
|
static |
在文件 berlekamp_basis.cpp 第 156 行定义.
引用了 bk_eliminate_column() , 以及 bk_reduce_matrix().
被这些函数引用 bk_null_space() , 以及 bk_reduce_matrix().
| std::vector< int64_t > LMCAS::berlekamp_detail::bk_reduce_to_mod_coeffs | ( | const Polynomial< Rational > & | poly, |
| int64_t | p ) |
以系数分母的 LCM 清除分母,再逐项取模 p。
| [in] | poly | 有理系数多项式 |
| [in] | p | 素数模数 |
在文件 berlekamp_modular.cpp 第 29 行定义.
引用了 bk_reduce_to_mod_coeffs(), LMCAS::c, LMCAS::Polynomial< CoeffType >::coeffs, LMCAS::Polynomial< CoeffType >::is_zero() , 以及 LMCAS::polynomial_solver_detail::num().
被这些函数引用 LMCAS::berlekamp_factor(), bk_is_suitable_prime() , 以及 bk_reduce_to_mod_coeffs().
| int64_t LMCAS::berlekamp_detail::bk_select_prime | ( | const Polynomial< Rational > & | poly | ) |
从小素数表中选取适合 Berlekamp 分解的素数。
| [in] | poly | 非零有理系数多项式,次数 >= 1。 |
在文件 berlekamp_modular.cpp 第 258 行定义.
引用了 bk_is_suitable_prime(), BK_NUM_SMALL_PRIMES, bk_select_prime(), BK_SMALL_PRIMES, LMCAS::Polynomial< CoeffType >::degree() , 以及 LMCAS::Polynomial< CoeffType >::is_zero().
被这些函数引用 LMCAS::berlekamp_factor() , 以及 bk_select_prime().
| std::vector< std::vector< int64_t > > LMCAS::berlekamp_detail::bk_split_factors | ( | const std::vector< int64_t > & | f_coeffs, |
| const std::vector< std::vector< int64_t > > & | null_basis, | ||
| int | null_dim, | ||
| int64_t | p ) |
在文件 berlekamp_split.cpp 第 40 行定义.
引用了 bk_split_factors() , 以及 bk_split_one_factor().
被这些函数引用 LMCAS::berlekamp_factor() , 以及 bk_split_factors().
|
static |
在文件 berlekamp_split.cpp 第 7 行定义.
引用了 bk_div_mod(), bk_gcd_mod(), bk_split_one_factor() , 以及 LMCAS::c.
被这些函数引用 bk_split_factors() , 以及 bk_split_one_factor().
|
staticconstexpr |
|
staticconstexpr |
Berlekamp 模分解的小素数候选表。 按升序选取首个不整除首项系数且使模约化结果无平方因子的素数。
在文件 berlekamp_modular.cpp 第 12 行定义.
被这些函数引用 bk_select_prime().