多项式内部操作模块#

多项式模块的实现在内部以“层次”结构。有四个级别,称为L0、L1、L2和L3。第三级和第四级包含面向用户的功能,在上一节中进行了描述。本节重点介绍零级和一级。

levelzero提供了核心多项式操作功能和类似C的低级接口。第一级将这个低级功能封装到面向对象的结构中。这些是 not 用户看到的类,而是polys模块内部使用的类。

在实现中还有一个额外的复杂问题。这是因为所有多项式操作都与 地域 . 例如,当分解一个 \(x^{{10}} - 1\) ,我们必须决定系数应该属于哪个环,或者更简单地说,在因式分解中允许出现哪些系数。这种系数的选择称为基域。典型的选择包括整数 \(\mathbb{{Z}}\) ,有理数 \(\mathbb{{Q}}\) 或者各种相关的环和场。但是在多项式环上进行因式分解是完全合法的(尽管在本例中没有兴趣),比如 \(k[Y]\) 在哪里 \(k\) 是一个固定的领域。

因此,多项式操作算法(复杂的如因子分解和简单的加法或乘法)必须依赖其他代码来操作系数。在多项式操作模块中,这样的代码被封装在所谓的“域”中。域基本上是一个工厂对象:它接受数据的各种表示形式,并将它们转换为具有统一接口的对象。域创建的每个对象都必须实现算术运算 \(+\)\(-\)\(\times\) . 其他操作通过域访问,例如 ZZ.quo(ZZ(4), ZZ(2)) .

注意有一些 圆度 多项式环域使用一级类,一级类使用零级函数,零级函数使用域。原则上,在当前的实现中,可以像 \(k[X][Y]\) . 这将产生更多的层。因此,在同构环中工作 \(k[X, Y]\) 优先考虑。

零级#

零级包含多项式操作模块的大量代码。

稠密多元多项式的处理#

这些函数可用于在 \(K[X_0, \ldots, X_u]\) . 在稠密表示中操作多元多项式的函数具有前缀 dmp_ . 只适用于一元多项式的函数(即。 \(u = 0\) )有前缀吗 dup__ . 地域 \(K\) 必须显式传递。对于许多多元多项式操作函数也有层次性 \(u\) ,即发电机数量减去1,必须通过。(请注意,在许多情况下, dup_ 提供了功能版本,这可能会稍微更有效。)

基本操作:

sympy.polys.densebasic.dmp_LC(f, K)[源代码]#

回归超前系数 f .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import poly_LC
>>> poly_LC([], ZZ)
0
>>> poly_LC([ZZ(1), ZZ(2), ZZ(3)], ZZ)
1
sympy.polys.densebasic.dmp_TC(f, K)[源代码]#

返回尾随系数 f .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import poly_TC
>>> poly_TC([], ZZ)
0
>>> poly_TC([ZZ(1), ZZ(2), ZZ(3)], ZZ)
3
sympy.polys.densebasic.dmp_ground_LC(f, u, K)[源代码]#

返回地面引导系数。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_ground_LC
>>> f = ZZ.map([[[1], [2, 3]]])
>>> dmp_ground_LC(f, 2, ZZ)
1
sympy.polys.densebasic.dmp_ground_TC(f, u, K)[源代码]#

返回地面拖曳系数。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_ground_TC
>>> f = ZZ.map([[[1], [2, 3]]])
>>> dmp_ground_TC(f, 2, ZZ)
3
sympy.polys.densebasic.dmp_true_LT(f, u, K)[源代码]#

返回前导项 c * x_1**n_1 ... x_k**n_k .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_true_LT
>>> f = ZZ.map([[4], [2, 0], [3, 0, 0]])
>>> dmp_true_LT(f, 1, ZZ)
((2, 0), 4)
sympy.polys.densebasic.dmp_degree(f, u)[源代码]#

返回前导度 f 在里面 x_0 在里面 K[X] .

Note that the degree of 0 is negative infinity (float('-inf')).

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_degree
>>> dmp_degree([[[]]], 2)
-inf
>>> f = ZZ.map([[2], [1, 2, 3]])
>>> dmp_degree(f, 1)
1
sympy.polys.densebasic.dmp_degree_in(f, j, u)[源代码]#

返回前导度 f 在里面 x_j 在里面 K[X] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_degree_in
>>> f = ZZ.map([[2], [1, 2, 3]])
>>> dmp_degree_in(f, 0, 1)
1
>>> dmp_degree_in(f, 1, 1)
2
sympy.polys.densebasic.dmp_degree_list(f, u)[源代码]#

返回的度数列表 f 在里面 K[X] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_degree_list
>>> f = ZZ.map([[1], [1, 2, 3]])
>>> dmp_degree_list(f, 1)
(1, 2)
sympy.polys.densebasic.dmp_strip(f, u)[源代码]#

从中删除前导零 f 在里面 K[X] .

实例

>>> from sympy.polys.densebasic import dmp_strip
>>> dmp_strip([[], [0, 1, 2], [1]], 1)
[[0, 1, 2], [1]]
sympy.polys.densebasic.dmp_validate(f, K=None)[源代码]#

返回中的级别数 f 并递归地剥离它。

实例

>>> from sympy.polys.densebasic import dmp_validate
>>> dmp_validate([[], [0, 1, 2], [1]])
([[1, 2], [1]], 1)
>>> dmp_validate([[1], 1])
Traceback (most recent call last):
...
ValueError: invalid data structure for a multivariate polynomial
sympy.polys.densebasic.dup_reverse(f)[源代码]#

计算 x**n * f(1/x) ,即:反向 f 在里面 K[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dup_reverse
>>> f = ZZ.map([1, 2, 3, 0])
>>> dup_reverse(f)
[3, 2, 1]
sympy.polys.densebasic.dmp_copy(f, u)[源代码]#

创建多项式的新副本 f 在里面 K[X] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_copy
>>> f = ZZ.map([[1], [1, 2]])
>>> dmp_copy(f, 1)
[[1], [1, 2]]
sympy.polys.densebasic.dmp_to_tuple(f, u)[源代码]#

转换 \(f\) 一个嵌套的元组。

这是哈希所需的。这类似于dmp_copy()。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_to_tuple
>>> f = ZZ.map([[1], [1, 2]])
>>> dmp_to_tuple(f, 1)
((1,), (1, 2))
sympy.polys.densebasic.dmp_normal(f, u, K)[源代码]#

规范化给定域中的多元多项式。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_normal
>>> dmp_normal([[], [0, 1, 2]], 1, ZZ)
[[1, 2]]
sympy.polys.densebasic.dmp_convert(f, u, K0, K1)[源代码]#

转换的基域 fK0K1 .

实例

>>> from sympy.polys.rings import ring
>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_convert
>>> R, x = ring("x", ZZ)
>>> dmp_convert([[R(1)], [R(2)]], 1, R.to_domain(), ZZ)
[[1], [2]]
>>> dmp_convert([[ZZ(1)], [ZZ(2)]], 1, ZZ, R.to_domain())
[[1], [2]]
sympy.polys.densebasic.dmp_from_sympy(f, u, K)[源代码]#

转换的基域 f 从SymPy到 K .

实例

>>> from sympy import S
>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_from_sympy
>>> dmp_from_sympy([[S(1)], [S(2)]], 1, ZZ) == [[ZZ(1)], [ZZ(2)]]
True
sympy.polys.densebasic.dmp_nth(f, n, u, K)[源代码]#

返回 n -th系数 f 在里面 K[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_nth
>>> f = ZZ.map([[1], [2], [3]])
>>> dmp_nth(f, 0, 1, ZZ)
[3]
>>> dmp_nth(f, 4, 1, ZZ)
[]
sympy.polys.densebasic.dmp_ground_nth(f, N, u, K)[源代码]#

返回地面 n -th系数 f 在里面 K[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_ground_nth
>>> f = ZZ.map([[1], [2, 3]])
>>> dmp_ground_nth(f, (0, 1), 1, ZZ)
2
sympy.polys.densebasic.dmp_zero_p(f, u)[源代码]#

返回 True 如果 f 零英寸 K[X] .

实例

>>> from sympy.polys.densebasic import dmp_zero_p
>>> dmp_zero_p([[[[[]]]]], 4)
True
>>> dmp_zero_p([[[[[1]]]]], 4)
False
sympy.polys.densebasic.dmp_zero(u)[源代码]#

返回多元零。

实例

>>> from sympy.polys.densebasic import dmp_zero
>>> dmp_zero(4)
[[[[[]]]]]
sympy.polys.densebasic.dmp_one_p(f, u, K)[源代码]#

返回 True 如果 f 有一个在 K[X] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_one_p
>>> dmp_one_p([[[ZZ(1)]]], 2, ZZ)
True
sympy.polys.densebasic.dmp_one(u, K)[源代码]#

返回多元一 K .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_one
>>> dmp_one(2, ZZ)
[[[1]]]
sympy.polys.densebasic.dmp_ground_p(f, c, u)[源代码]#

如果返回真 f 是恒定的 K[X] .

实例

>>> from sympy.polys.densebasic import dmp_ground_p
>>> dmp_ground_p([[[3]]], 3, 2)
True
>>> dmp_ground_p([[[4]]], None, 2)
True
sympy.polys.densebasic.dmp_ground(c, u)[源代码]#

返回一个多元常量。

实例

>>> from sympy.polys.densebasic import dmp_ground
>>> dmp_ground(3, 5)
[[[[[[3]]]]]]
>>> dmp_ground(1, -1)
1
sympy.polys.densebasic.dmp_zeros(n, u, K)[源代码]#

返回多元零的列表。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_zeros
>>> dmp_zeros(3, 2, ZZ)
[[[[]]], [[[]]], [[[]]]]
>>> dmp_zeros(3, -1, ZZ)
[0, 0, 0]
sympy.polys.densebasic.dmp_grounds(c, n, u)[源代码]#

返回多元常量列表。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_grounds
>>> dmp_grounds(ZZ(4), 3, 2)
[[[[4]]], [[[4]]], [[[4]]]]
>>> dmp_grounds(ZZ(4), 3, -1)
[4, 4, 4]
sympy.polys.densebasic.dmp_negative_p(f, u, K)[源代码]#

返回 True 如果 LC(f) 是否定的。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_negative_p
>>> dmp_negative_p([[ZZ(1)], [-ZZ(1)]], 1, ZZ)
False
>>> dmp_negative_p([[-ZZ(1)], [ZZ(1)]], 1, ZZ)
True
sympy.polys.densebasic.dmp_positive_p(f, u, K)[源代码]#

返回 True 如果 LC(f) 是肯定的。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_positive_p
>>> dmp_positive_p([[ZZ(1)], [-ZZ(1)]], 1, ZZ)
True
>>> dmp_positive_p([[-ZZ(1)], [ZZ(1)]], 1, ZZ)
False
sympy.polys.densebasic.dmp_from_dict(f, u, K)[源代码]#

创建一个 K[X] 多项式 dict .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_from_dict
>>> dmp_from_dict({(0, 0): ZZ(3), (0, 1): ZZ(2), (2, 1): ZZ(1)}, 1, ZZ)
[[1, 0], [], [2, 3]]
>>> dmp_from_dict({}, 0, ZZ)
[]
sympy.polys.densebasic.dmp_to_dict(f, u, K=None, zero=False)[源代码]#

转换为 K[X] 多项式到a dict ''.

实例

>>> from sympy.polys.densebasic import dmp_to_dict
>>> dmp_to_dict([[1, 0], [], [2, 3]], 1)
{(0, 0): 3, (0, 1): 2, (2, 1): 1}
>>> dmp_to_dict([], 0)
{}
sympy.polys.densebasic.dmp_swap(f, i, j, u, K)[源代码]#

变换 K[..x_i..x_j..]K[..x_j..x_i..] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_swap
>>> f = ZZ.map([[[2], [1, 0]], []])
>>> dmp_swap(f, 0, 1, 2, ZZ)
[[[2], []], [[1, 0], []]]
>>> dmp_swap(f, 1, 2, 2, ZZ)
[[[1], [2, 0]], [[]]]
>>> dmp_swap(f, 0, 2, 2, ZZ)
[[[1, 0]], [[2, 0], []]]
sympy.polys.densebasic.dmp_permute(f, P, u, K)[源代码]#

返回多项式 K[x_{{P(1)}},..,x_{{P(n)}}] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_permute
>>> f = ZZ.map([[[2], [1, 0]], []])
>>> dmp_permute(f, [1, 0, 2], 2, ZZ)
[[[2], []], [[1, 0], []]]
>>> dmp_permute(f, [1, 2, 0], 2, ZZ)
[[[1], []], [[2, 0], []]]
sympy.polys.densebasic.dmp_nest(f, l, K)[源代码]#

返回嵌套的多元值 l -级别。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_nest
>>> dmp_nest([[ZZ(1)]], 2, ZZ)
[[[[1]]]]
sympy.polys.densebasic.dmp_raise(f, l, u, K)[源代码]#

返回引发的多元多项式 l -级别。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_raise
>>> f = ZZ.map([[], [1, 2]])
>>> dmp_raise(f, 2, 1, ZZ)
[[[[]]], [[[1]], [[2]]]]
sympy.polys.densebasic.dmp_deflate(f, u, K)[源代码]#

地图 x_i**m_iy_i 在多项式中 K[X] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_deflate
>>> f = ZZ.map([[1, 0, 0, 2], [], [3, 0, 0, 4]])
>>> dmp_deflate(f, 1, ZZ)
((2, 3), [[1, 2], [3, 4]])
sympy.polys.densebasic.dmp_multi_deflate(polys, u, K)[源代码]#

地图 x_i**m_iy_i 在一组多项式中 K[X] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_multi_deflate
>>> f = ZZ.map([[1, 0, 0, 2], [], [3, 0, 0, 4]])
>>> g = ZZ.map([[1, 0, 2], [], [3, 0, 4]])
>>> dmp_multi_deflate((f, g), 1, ZZ)
((2, 1), ([[1, 0, 0, 2], [3, 0, 0, 4]], [[1, 0, 2], [3, 0, 4]]))
sympy.polys.densebasic.dmp_inflate(f, M, u, K)[源代码]#

地图 y_ix_i**k_i 在多项式中 K[X] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_inflate
>>> f = ZZ.map([[1, 2], [3, 4]])
>>> dmp_inflate(f, (2, 3), 1, ZZ)
[[1, 0, 0, 2], [], [3, 0, 0, 4]]
sympy.polys.densebasic.dmp_exclude(f, u, K)[源代码]#

排除无用级别 f .

返回排除的级别,新排除的级别 f 和新的 u .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_exclude
>>> f = ZZ.map([[[1]], [[1], [2]]])
>>> dmp_exclude(f, 2, ZZ)
([2], [[1], [1, 2]], 1)
sympy.polys.densebasic.dmp_include(f, J, u, K)[源代码]#

包括无用级别 f .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_include
>>> f = ZZ.map([[1], [1, 2]])
>>> dmp_include(f, [2], 1, ZZ)
[[[1]], [[1], [2]]]
sympy.polys.densebasic.dmp_inject(f, u, K, front=False)[源代码]#

转换 fK[X][Y]K[X,Y] .

实例

>>> from sympy.polys.rings import ring
>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_inject
>>> R, x,y = ring("x,y", ZZ)
>>> dmp_inject([R(1), x + 2], 0, R.to_domain())
([[[1]], [[1], [2]]], 2)
>>> dmp_inject([R(1), x + 2], 0, R.to_domain(), front=True)
([[[1]], [[1, 2]]], 2)
sympy.polys.densebasic.dmp_eject(f, u, K, front=False)[源代码]#

转换 fK[X,Y]K[X][Y] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_eject
>>> dmp_eject([[[1]], [[1], [2]]], 2, ZZ['x', 'y'])
[1, x + 2]
sympy.polys.densebasic.dmp_terms_gcd(f, u, K)[源代码]#

从中删除术语的GCD f 在里面 K[X] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_terms_gcd
>>> f = ZZ.map([[1, 0], [1, 0, 0], [], []])
>>> dmp_terms_gcd(f, 1, ZZ)
((2, 1), [[1], [1, 0]])
sympy.polys.densebasic.dmp_list_terms(f, u, K, order=None)[源代码]#

列出所有非零项 f 以给定的顺序 order .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_list_terms
>>> f = ZZ.map([[1, 1], [2, 3]])
>>> dmp_list_terms(f, 1, ZZ)
[((1, 1), 1), ((1, 0), 1), ((0, 1), 2), ((0, 0), 3)]
>>> dmp_list_terms(f, 1, ZZ, order='grevlex')
[((1, 1), 1), ((1, 0), 1), ((0, 1), 2), ((0, 0), 3)]
sympy.polys.densebasic.dmp_apply_pairs(f, g, h, args, u, K)[源代码]#

应用 h 对的系数对 fg .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dmp_apply_pairs
>>> h = lambda x, y, z: 2*x + y - z
>>> dmp_apply_pairs([[1], [2, 3]], [[3], [2, 1]], h, (1,), 1, ZZ)
[[4], [5, 6]]
sympy.polys.densebasic.dmp_slice(f, m, n, u, K)[源代码]#

取连续的子项序列 f 在里面 K[X] .

sympy.polys.densebasic.dup_random(n, a, b, K)[源代码]#

返回次多项式 n 系数为 [a, b] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.densebasic import dup_random
>>> dup_random(3, -10, 10, ZZ) 
[-2, -8, 9, -4]

算术运算:

sympy.polys.densearith.dmp_add_term(f, c, i, u, K)[源代码]#

添加 c(x_2..x_u)*x_0**if 在里面 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_add_term(x*y + 1, 2, 2)
2*x**2 + x*y + 1
sympy.polys.densearith.dmp_sub_term(f, c, i, u, K)[源代码]#

减去 c(x_2..x_u)*x_0**if 在里面 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_sub_term(2*x**2 + x*y + 1, 2, 2)
x*y + 1
sympy.polys.densearith.dmp_mul_term(f, c, i, u, K)[源代码]#

乘法 f 通过 c(x_2..x_u)*x_0**i 在里面 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_mul_term(x**2*y + x, 3*y, 2)
3*x**4*y**2 + 3*x**3*y
sympy.polys.densearith.dmp_add_ground(f, c, u, K)[源代码]#

将一个基域元素添加到 f .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_add_ground(x**3 + 2*x**2 + 3*x + 4, ZZ(4))
x**3 + 2*x**2 + 3*x + 8
sympy.polys.densearith.dmp_sub_ground(f, c, u, K)[源代码]#

从中减去基域的一个元素 f .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_sub_ground(x**3 + 2*x**2 + 3*x + 4, ZZ(4))
x**3 + 2*x**2 + 3*x
sympy.polys.densearith.dmp_mul_ground(f, c, u, K)[源代码]#

乘法 f 通过一个常量值 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_mul_ground(2*x + 2*y, ZZ(3))
6*x + 6*y
sympy.polys.densearith.dmp_quo_ground(f, c, u, K)[源代码]#

商等于常数 K[X] .

实例

>>> from sympy.polys import ring, ZZ, QQ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_quo_ground(2*x**2*y + 3*x, ZZ(2))
x**2*y + x
>>> R, x,y = ring("x,y", QQ)
>>> R.dmp_quo_ground(2*x**2*y + 3*x, QQ(2))
x**2*y + 3/2*x
sympy.polys.densearith.dmp_exquo_ground(f, c, u, K)[源代码]#

常数的精确商 K[X] .

实例

>>> from sympy.polys import ring, QQ
>>> R, x,y = ring("x,y", QQ)
>>> R.dmp_exquo_ground(x**2*y + 2*x, QQ(2))
1/2*x**2*y + x
sympy.polys.densearith.dup_lshift(f, n, K)[源代码]#

高效倍增 f 通过 x**n 在里面 K[x] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x = ring("x", ZZ)
>>> R.dup_lshift(x**2 + 1, 2)
x**4 + x**2
sympy.polys.densearith.dup_rshift(f, n, K)[源代码]#

有效地划分 f 通过 x**n 在里面 K[x] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x = ring("x", ZZ)
>>> R.dup_rshift(x**4 + x**2, 2)
x**2 + 1
>>> R.dup_rshift(x**4 + x**2 + 2, 2)
x**2 + 1
sympy.polys.densearith.dmp_abs(f, u, K)[源代码]#

使所有系数为正 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_abs(x**2*y - x)
x**2*y + x
sympy.polys.densearith.dmp_neg(f, u, K)[源代码]#

求多项式的反 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_neg(x**2*y - x)
-x**2*y + x
sympy.polys.densearith.dmp_add(f, g, u, K)[源代码]#

在中添加稠密多项式 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_add(x**2 + y, x**2*y + x)
x**2*y + x**2 + x + y
sympy.polys.densearith.dmp_sub(f, g, u, K)[源代码]#

减去稠密多项式 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_sub(x**2 + y, x**2*y + x)
-x**2*y + x**2 - x + y
sympy.polys.densearith.dmp_add_mul(f, g, h, u, K)[源代码]#

返回 f + g*h 在哪里? f, g, hK[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_add_mul(x**2 + y, x, x + 2)
2*x**2 + 2*x + y
sympy.polys.densearith.dmp_sub_mul(f, g, h, u, K)[源代码]#

返回 f - g*h 在哪里? f, g, hK[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_sub_mul(x**2 + y, x, x + 2)
-2*x + y
sympy.polys.densearith.dmp_mul(f, g, u, K)[源代码]#

重密多项式 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_mul(x*y + 1, x)
x**2*y + x
sympy.polys.densearith.dmp_sqr(f, u, K)[源代码]#

平方稠密多项式 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_sqr(x**2 + x*y + y**2)
x**4 + 2*x**3*y + 3*x**2*y**2 + 2*x*y**3 + y**4
sympy.polys.densearith.dmp_pow(f, n, u, K)[源代码]#

提高 fn -输入功率 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_pow(x*y + 1, 3)
x**3*y**3 + 3*x**2*y**2 + 3*x*y + 1
sympy.polys.densearith.dmp_pdiv(f, g, u, K)[源代码]#

多项式伪除法 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_pdiv(x**2 + x*y, 2*x + 2)
(2*x + 2*y - 2, -4*y + 4)
sympy.polys.densearith.dmp_prem(f, g, u, K)[源代码]#

多项式伪余数 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_prem(x**2 + x*y, 2*x + 2)
-4*y + 4
sympy.polys.densearith.dmp_pquo(f, g, u, K)[源代码]#

多项式精确伪商 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = x**2 + x*y
>>> g = 2*x + 2*y
>>> h = 2*x + 2
>>> R.dmp_pquo(f, g)
2*x
>>> R.dmp_pquo(f, h)
2*x + 2*y - 2
sympy.polys.densearith.dmp_pexquo(f, g, u, K)[源代码]#

多项式伪商 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = x**2 + x*y
>>> g = 2*x + 2*y
>>> h = 2*x + 2
>>> R.dmp_pexquo(f, g)
2*x
>>> R.dmp_pexquo(f, h)
Traceback (most recent call last):
...
ExactQuotientFailed: [[2], [2]] does not divide [[1], [1, 0], []]
sympy.polys.densearith.dmp_rr_div(f, g, u, K)[源代码]#

环上余数的多元除。

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_rr_div(x**2 + x*y, 2*x + 2)
(0, x**2 + x*y)
sympy.polys.densearith.dmp_ff_div(f, g, u, K)[源代码]#

域上带余数的多项式除法。

实例

>>> from sympy.polys import ring, QQ
>>> R, x,y = ring("x,y", QQ)
>>> R.dmp_ff_div(x**2 + x*y, 2*x + 2)
(1/2*x + 1/2*y - 1/2, -y + 1)
sympy.polys.densearith.dmp_div(f, g, u, K)[源代码]#

带余数的多项式除法 K[X] .

实例

>>> from sympy.polys import ring, ZZ, QQ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_div(x**2 + x*y, 2*x + 2)
(0, x**2 + x*y)
>>> R, x,y = ring("x,y", QQ)
>>> R.dmp_div(x**2 + x*y, 2*x + 2)
(1/2*x + 1/2*y - 1/2, -y + 1)
sympy.polys.densearith.dmp_rem(f, g, u, K)[源代码]#

多项式余数返回 K[X] .

实例

>>> from sympy.polys import ring, ZZ, QQ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_rem(x**2 + x*y, 2*x + 2)
x**2 + x*y
>>> R, x,y = ring("x,y", QQ)
>>> R.dmp_rem(x**2 + x*y, 2*x + 2)
-y + 1
sympy.polys.densearith.dmp_quo(f, g, u, K)[源代码]#

返回精确的多项式商 K[X] .

实例

>>> from sympy.polys import ring, ZZ, QQ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_quo(x**2 + x*y, 2*x + 2)
0
>>> R, x,y = ring("x,y", QQ)
>>> R.dmp_quo(x**2 + x*y, 2*x + 2)
1/2*x + 1/2*y - 1/2
sympy.polys.densearith.dmp_exquo(f, g, u, K)[源代码]#

返回多项式商 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = x**2 + x*y
>>> g = x + y
>>> h = 2*x + 2
>>> R.dmp_exquo(f, g)
x
>>> R.dmp_exquo(f, h)
Traceback (most recent call last):
...
ExactQuotientFailed: [[2], [2]] does not divide [[1], [1, 0], []]
sympy.polys.densearith.dmp_max_norm(f, u, K)[源代码]#

返回多项式的最大范数 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_max_norm(2*x*y - x - 3)
3
sympy.polys.densearith.dmp_l1_norm(f, u, K)[源代码]#

返回中多项式的l1范数 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_l1_norm(2*x*y - x - 3)
6
sympy.polys.densearith.dmp_expand(polys, u, K)[源代码]#

将中的几个多项式相乘 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_expand([x**2 + y**2, x + 1])
x**3 + x**2 + x*y**2 + y**2

其他工具:

sympy.polys.densetools.dmp_integrate(f, m, u, K)[源代码]#

计算的不定积分 f 在里面 x_0 在里面 K[X] .

实例

>>> from sympy.polys import ring, QQ
>>> R, x,y = ring("x,y", QQ)
>>> R.dmp_integrate(x + 2*y, 1)
1/2*x**2 + 2*x*y
>>> R.dmp_integrate(x + 2*y, 2)
1/6*x**3 + x**2*y
sympy.polys.densetools.dmp_integrate_in(f, m, j, u, K)[源代码]#

计算的不定积分 f 在里面 x_j 在里面 K[X] .

实例

>>> from sympy.polys import ring, QQ
>>> R, x,y = ring("x,y", QQ)
>>> R.dmp_integrate_in(x + 2*y, 1, 0)
1/2*x**2 + 2*x*y
>>> R.dmp_integrate_in(x + 2*y, 1, 1)
x*y + y**2
sympy.polys.densetools.dmp_diff(f, m, u, K)[源代码]#

m -中的一阶导数 x_0 多项式的 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = x*y**2 + 2*x*y + 3*x + 2*y**2 + 3*y + 1
>>> R.dmp_diff(f, 1)
y**2 + 2*y + 3
>>> R.dmp_diff(f, 2)
0
sympy.polys.densetools.dmp_diff_in(f, m, j, u, K)[源代码]#

m -中的一阶导数 x_j 多项式的 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = x*y**2 + 2*x*y + 3*x + 2*y**2 + 3*y + 1
>>> R.dmp_diff_in(f, 1, 0)
y**2 + 2*y + 3
>>> R.dmp_diff_in(f, 1, 1)
2*x*y + 2*x + 4*y + 3
sympy.polys.densetools.dmp_eval(f, a, u, K)[源代码]#

求值多项式 x_0 = a 在里面 K[X] 使用霍纳方案。

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_eval(2*x*y + 3*x + y + 2, 2)
5*y + 8
sympy.polys.densetools.dmp_eval_in(f, a, j, u, K)[源代码]#

求值多项式 x_j = a 在里面 K[X] 使用霍纳方案。

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = 2*x*y + 3*x + y + 2
>>> R.dmp_eval_in(f, 2, 0)
5*y + 8
>>> R.dmp_eval_in(f, 2, 1)
7*x + 4
sympy.polys.densetools.dmp_eval_tail(f, A, u, K)[源代码]#

求值多项式 x_j = a_j, ... 在里面 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = 2*x*y + 3*x + y + 2
>>> R.dmp_eval_tail(f, [2])
7*x + 4
>>> R.dmp_eval_tail(f, [2, 2])
18
sympy.polys.densetools.dmp_diff_eval_in(f, m, a, j, u, K)[源代码]#

多项式的求导与求值 x_ja 在里面 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = x*y**2 + 2*x*y + 3*x + 2*y**2 + 3*y + 1
>>> R.dmp_diff_eval_in(f, 1, 2, 0)
y**2 + 2*y + 3
>>> R.dmp_diff_eval_in(f, 1, 2, 1)
6*x + 11
sympy.polys.densetools.dmp_trunc(f, p, u, K)[源代码]#

减少 K[X] 多项式模 p 在里面 K[Y] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = 3*x**2*y + 8*x**2 + 5*x*y + 6*x + 2*y + 3
>>> g = (y - 1).drop(x)
>>> R.dmp_trunc(f, g)
11*x**2 + 11*x + 5
sympy.polys.densetools.dmp_ground_trunc(f, p, u, K)[源代码]#

减少 K[X] 多项式模a常数 p 在里面 K .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = 3*x**2*y + 8*x**2 + 5*x*y + 6*x + 2*y + 3
>>> R.dmp_ground_trunc(f, ZZ(3))
-x**2 - x*y - y
sympy.polys.densetools.dup_monic(f, K)[源代码]#

将所有系数除以 LC(f) 在里面 K[x] .

实例

>>> from sympy.polys import ring, ZZ, QQ
>>> R, x = ring("x", ZZ)
>>> R.dup_monic(3*x**2 + 6*x + 9)
x**2 + 2*x + 3
>>> R, x = ring("x", QQ)
>>> R.dup_monic(3*x**2 + 4*x + 2)
x**2 + 4/3*x + 2/3
sympy.polys.densetools.dmp_ground_monic(f, u, K)[源代码]#

将所有系数除以 LC(f) 在里面 K[X] .

实例

>>> from sympy.polys import ring, ZZ, QQ
>>> R, x,y = ring("x,y", ZZ)
>>> f = 3*x**2*y + 6*x**2 + 3*x*y + 9*y + 3
>>> R.dmp_ground_monic(f)
x**2*y + 2*x**2 + x*y + 3*y + 1
>>> R, x,y = ring("x,y", QQ)
>>> f = 3*x**2*y + 8*x**2 + 5*x*y + 6*x + 2*y + 3
>>> R.dmp_ground_monic(f)
x**2*y + 8/3*x**2 + 5/3*x*y + 2*x + 2/3*y + 1
sympy.polys.densetools.dup_content(f, K)[源代码]#

计算 f 在里面 K[x] .

实例

>>> from sympy.polys import ring, ZZ, QQ
>>> R, x = ring("x", ZZ)
>>> f = 6*x**2 + 8*x + 12
>>> R.dup_content(f)
2
>>> R, x = ring("x", QQ)
>>> f = 6*x**2 + 8*x + 12
>>> R.dup_content(f)
2
sympy.polys.densetools.dmp_ground_content(f, u, K)[源代码]#

计算 f 在里面 K[X] .

实例

>>> from sympy.polys import ring, ZZ, QQ
>>> R, x,y = ring("x,y", ZZ)
>>> f = 2*x*y + 6*x + 4*y + 12
>>> R.dmp_ground_content(f)
2
>>> R, x,y = ring("x,y", QQ)
>>> f = 2*x*y + 6*x + 4*y + 12
>>> R.dmp_ground_content(f)
2
sympy.polys.densetools.dup_primitive(f, K)[源代码]#

计算内容和原始形式 f 在里面 K[x] .

实例

>>> from sympy.polys import ring, ZZ, QQ
>>> R, x = ring("x", ZZ)
>>> f = 6*x**2 + 8*x + 12
>>> R.dup_primitive(f)
(2, 3*x**2 + 4*x + 6)
>>> R, x = ring("x", QQ)
>>> f = 6*x**2 + 8*x + 12
>>> R.dup_primitive(f)
(2, 3*x**2 + 4*x + 6)
sympy.polys.densetools.dmp_ground_primitive(f, u, K)[源代码]#

计算内容和原始形式 f 在里面 K[X] .

实例

>>> from sympy.polys import ring, ZZ, QQ
>>> R, x,y = ring("x,y", ZZ)
>>> f = 2*x*y + 6*x + 4*y + 12
>>> R.dmp_ground_primitive(f)
(2, x*y + 3*x + 2*y + 6)
>>> R, x,y = ring("x,y", QQ)
>>> f = 2*x*y + 6*x + 4*y + 12
>>> R.dmp_ground_primitive(f)
(2, x*y + 3*x + 2*y + 6)
sympy.polys.densetools.dup_extract(f, g, K)[源代码]#

从一对多项式中提取公共内容 K[x] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x = ring("x", ZZ)
>>> R.dup_extract(6*x**2 + 12*x + 18, 4*x**2 + 8*x + 12)
(2, 3*x**2 + 6*x + 9, 2*x**2 + 4*x + 6)
sympy.polys.densetools.dmp_ground_extract(f, g, u, K)[源代码]#

从一对多项式中提取公共内容 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_ground_extract(6*x*y + 12*x + 18, 4*x*y + 8*x + 12)
(2, 3*x*y + 6*x + 9, 2*x*y + 4*x + 6)
sympy.polys.densetools.dup_real_imag(f, K)[源代码]#

返回二元多项式 f1f2 ,这样 f = f1 + f2*I .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dup_real_imag(x**3 + x**2 + x + 1)
(x**3 + x**2 - 3*x*y**2 + x - y**2 + 1, 3*x**2*y + 2*x*y - y**3 + y)
sympy.polys.densetools.dup_mirror(f, K)[源代码]#

有效评价作文 f(-x) 在里面 K[x] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x = ring("x", ZZ)
>>> R.dup_mirror(x**3 + 2*x**2 - 4*x + 2)
-x**3 + 2*x**2 + 4*x + 2
sympy.polys.densetools.dup_scale(f, a, K)[源代码]#

有效评估成分 f(a*x) 在里面 K[x] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x = ring("x", ZZ)
>>> R.dup_scale(x**2 - 2*x + 1, ZZ(2))
4*x**2 - 4*x + 1
sympy.polys.densetools.dup_shift(f, a, K)[源代码]#

泰勒位移的有效评价 f(x + a) 在里面 K[x] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x = ring("x", ZZ)
>>> R.dup_shift(x**2 - 2*x + 1, ZZ(2))
x**2 + 2*x + 1
sympy.polys.densetools.dup_transform(f, p, q, K)[源代码]#

评估功能转换 q**n * f(p/q) 在里面 K[x] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x = ring("x", ZZ)
>>> R.dup_transform(x**2 - 2*x + 1, x**2 + 1, x - 1)
x**4 - 2*x**3 + 5*x**2 - 4*x + 4
sympy.polys.densetools.dmp_compose(f, g, u, K)[源代码]#

评价功能成分 f(g) 在里面 K[X] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_compose(x*y + 2*x + y, y)
y**2 + 3*y
sympy.polys.densetools.dup_decompose(f, K)[源代码]#

计算函数分解 f 在里面 K[x] .

给定一元多项式 f 对于特征为零的字段中的系数,返回列表 [f_1, f_2, ..., f_n] ,其中:

f = f_1 o f_2 o ... f_n = f_1(f_2(... f_n))

f_2, ..., f_n 是至少二次的一元齐次多项式。

与因式分解不同,多项式的完全函数分解不是唯一的,请考虑以下示例:

  1. f o g = f(x + b) o (g - b)

  2. x**n o x**m = x**m o x**n

  3. T_n o T_m = T_m o T_n

在哪里? T_nT_m 是切比雪夫多项式。

实例

>>> from sympy.polys import ring, ZZ
>>> R, x = ring("x", ZZ)
>>> R.dup_decompose(x**4 - 2*x**3 + x**2)
[x**2, x**2 - x]

工具书类

sympy.polys.densetools.dmp_lift(f, u, K)[源代码]#

将代数系数转换为整数 K[X] .

实例

>>> from sympy.polys import ring, QQ
>>> from sympy import I
>>> K = QQ.algebraic_field(I)
>>> R, x = ring("x", K)
>>> f = x**2 + K([QQ(1), QQ(0)])*x + K([QQ(2), QQ(0)])
>>> R.dmp_lift(f)
x**8 + 2*x**6 + 9*x**4 - 8*x**2 + 16
sympy.polys.densetools.dup_sign_variations(f, K)[源代码]#

计算符号的变化数 f 在里面 K[x] .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x = ring("x", ZZ)
>>> R.dup_sign_variations(x**4 - x**2 - x + 1)
2
sympy.polys.densetools.dmp_clear_denoms(f, u, K0, K1=None, convert=False)[源代码]#

明确分母,即转换 K_0K_1 .

实例

>>> from sympy.polys import ring, QQ
>>> R, x,y = ring("x,y", QQ)
>>> f = QQ(1,2)*x + QQ(1,3)*y + 1
>>> R.dmp_clear_denoms(f, convert=False)
(6, 3*x + 2*y + 6)
>>> R.dmp_clear_denoms(f, convert=True)
(6, 3*x + 2*y + 6)
sympy.polys.densetools.dmp_revert(f, g, u, K)[源代码]#

计算 f**(-1) 国防部 x**n 使用牛顿迭代法。

实例

>>> from sympy.polys import ring, QQ
>>> R, x,y = ring("x,y", QQ)

有限域系数稠密单变量多项式的处理#

此模块中的函数带有前缀 gf_ ,表示有限域的经典名称“Galois Fields”。请注意,许多多项式因式分解算法都是通过简化为有限域的情况来工作的,因此在这种情况下有特殊的实现是合理的,这是由性能和某些方法的必要性所证明的,这些方法甚至在一般域上都没有意义。

sympy.polys.galoistools.gf_crt(U, M, K=None)[源代码]#

中国剩余定理。

给定一组整数余数 u_0,...,u_n 以及一组余素数模 m_0,...,m_n ,返回一个整数 u ,这样 u = u_i mod m_i 对于 i = `` 0,…,n

实例

考虑一组残留物 U = [49, 76, 65] 以及一组模 M = [99, 97, 95] . 然后我们有:

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_crt

>>> gf_crt([49, 76, 65], [99, 97, 95], ZZ)
639985

这是正确的结果,因为:

>>> [639985 % m for m in [99, 97, 95]]
[49, 76, 65]

注意:这是一个没有错误检查的低级例程。

sympy.polys.galoistools.gf_crt1(M, K)[源代码]#

中国剩余定理的第一部分。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_crt, gf_crt1, gf_crt2
>>> U = [49, 76, 65]
>>> M = [99, 97, 95]

The following two codes have the same result.

>>> gf_crt(U, M, ZZ)
639985
>>> p, E, S = gf_crt1(M, ZZ)
>>> gf_crt2(U, M, p, E, S, ZZ)
639985

However, it is faster when we want to fix M and compute for multiple U, i.e. the following cases:

>>> p, E, S = gf_crt1(M, ZZ)
>>> Us = [[49, 76, 65], [23, 42, 67]]
>>> for U in Us:
...     print(gf_crt2(U, M, p, E, S, ZZ))
639985
236237
sympy.polys.galoistools.gf_crt2(U, M, p, E, S, K)[源代码]#

中国剩余定理的第二部分。

See gf_crt1 for usage.

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_crt2
>>> U = [49, 76, 65]
>>> M = [99, 97, 95]
>>> p = 912285
>>> E = [9215, 9405, 9603]
>>> S = [62, 24, 12]
>>> gf_crt2(U, M, p, E, S, ZZ)
639985
sympy.polys.galoistools.gf_int(a, p)[源代码]#

胁迫 a mod p 范围内的整数 [-p/2, p/2] .

实例

>>> from sympy.polys.galoistools import gf_int
>>> gf_int(2, 7)
2
>>> gf_int(5, 7)
-2
sympy.polys.galoistools.gf_degree(f)[源代码]#

返回前导度 f .

实例

>>> from sympy.polys.galoistools import gf_degree
>>> gf_degree([1, 1, 2, 0])
3
>>> gf_degree([])
-1
sympy.polys.galoistools.gf_LC(f, K)[源代码]#

返回前导系数 f .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_LC
>>> gf_LC([3, 0, 1], ZZ)
3
sympy.polys.galoistools.gf_TC(f, K)[源代码]#

返回 f .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_TC
>>> gf_TC([3, 0, 1], ZZ)
1
sympy.polys.galoistools.gf_strip(f)[源代码]#

从中删除前导零 f .

实例

>>> from sympy.polys.galoistools import gf_strip
>>> gf_strip([0, 0, 0, 3, 0, 1])
[3, 0, 1]
sympy.polys.galoistools.gf_trunc(f, p)[源代码]#

减所有系数的模 p .

实例

>>> from sympy.polys.galoistools import gf_trunc
>>> gf_trunc([7, -2, 3], 5)
[2, 3, 3]
sympy.polys.galoistools.gf_normal(f, p, K)[源代码]#

规范化所有系数 K .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_normal
>>> gf_normal([5, 10, 21, -3], 5, ZZ)
[1, 2]
sympy.polys.galoistools.gf_from_dict(f, p, K)[源代码]#

创建一个 GF(p)[x] 从dicta多项式。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_from_dict
>>> gf_from_dict({10: ZZ(4), 4: ZZ(33), 0: ZZ(-1)}, 5, ZZ)
[4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4]
sympy.polys.galoistools.gf_to_dict(f, p, symmetric=True)[源代码]#

转换为 GF(p)[x] 多项式到一个字典。

实例

>>> from sympy.polys.galoistools import gf_to_dict
>>> gf_to_dict([4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4], 5)
{0: -1, 4: -2, 10: -1}
>>> gf_to_dict([4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4], 5, symmetric=False)
{0: 4, 4: 3, 10: 4}
sympy.polys.galoistools.gf_from_int_poly(f, p)[源代码]#

创建一个 GF(p)[x] 多项式自 Z[x] .

实例

>>> from sympy.polys.galoistools import gf_from_int_poly
>>> gf_from_int_poly([7, -2, 3], 5)
[2, 3, 3]
sympy.polys.galoistools.gf_to_int_poly(f, p, symmetric=True)[源代码]#

转换为 GF(p)[x] 多项式到 Z[x] .

实例

>>> from sympy.polys.galoistools import gf_to_int_poly
>>> gf_to_int_poly([2, 3, 3], 5)
[2, -2, -2]
>>> gf_to_int_poly([2, 3, 3], 5, symmetric=False)
[2, 3, 3]
sympy.polys.galoistools.gf_neg(f, p, K)[源代码]#

求多项式的反 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_neg
>>> gf_neg([3, 2, 1, 0], 5, ZZ)
[2, 3, 4, 0]
sympy.polys.galoistools.gf_add_ground(f, a, p, K)[源代码]#

计算 f + a 在哪里? f 在里面 GF(p)[x]a 在里面 GF(p) .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_add_ground
>>> gf_add_ground([3, 2, 4], 2, 5, ZZ)
[3, 2, 1]
sympy.polys.galoistools.gf_sub_ground(f, a, p, K)[源代码]#

计算 f - a 在哪里? f 在里面 GF(p)[x]a 在里面 GF(p) .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_sub_ground
>>> gf_sub_ground([3, 2, 4], 2, 5, ZZ)
[3, 2, 2]
sympy.polys.galoistools.gf_mul_ground(f, a, p, K)[源代码]#

计算 f * a 在哪里? f 在里面 GF(p)[x]a 在里面 GF(p) .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_mul_ground
>>> gf_mul_ground([3, 2, 4], 2, 5, ZZ)
[1, 4, 3]
sympy.polys.galoistools.gf_quo_ground(f, a, p, K)[源代码]#

计算 f/a 在哪里? f 在里面 GF(p)[x]a 在里面 GF(p) .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_quo_ground
>>> gf_quo_ground(ZZ.map([3, 2, 4]), ZZ(2), 5, ZZ)
[4, 1, 2]
sympy.polys.galoistools.gf_add(f, g, p, K)[源代码]#

在中添加多项式 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_add
>>> gf_add([3, 2, 4], [2, 2, 2], 5, ZZ)
[4, 1]
sympy.polys.galoistools.gf_sub(f, g, p, K)[源代码]#

减去多项式 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_sub
>>> gf_sub([3, 2, 4], [2, 2, 2], 5, ZZ)
[1, 0, 2]
sympy.polys.galoistools.gf_mul(f, g, p, K)[源代码]#

乘法多项式 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_mul
>>> gf_mul([3, 2, 4], [2, 2, 2], 5, ZZ)
[1, 0, 3, 2, 3]
sympy.polys.galoistools.gf_sqr(f, p, K)[源代码]#

平方多项式 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_sqr
>>> gf_sqr([3, 2, 4], 5, ZZ)
[4, 2, 3, 1, 1]
sympy.polys.galoistools.gf_add_mul(f, g, h, p, K)[源代码]#

返回 f + g*h 在哪里? fgh 在里面 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_add_mul
>>> gf_add_mul([3, 2, 4], [2, 2, 2], [1, 4], 5, ZZ)
[2, 3, 2, 2]
sympy.polys.galoistools.gf_sub_mul(f, g, h, p, K)[源代码]#

计算 f - g*h 在哪里? fgh 在里面 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_sub_mul
>>> gf_sub_mul([3, 2, 4], [2, 2, 2], [1, 4], 5, ZZ)
[3, 3, 2, 1]
sympy.polys.galoistools.gf_expand(F, p, K)[源代码]#

展开结果 factor() 在里面 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_expand
>>> gf_expand([([3, 2, 4], 1), ([2, 2], 2), ([3, 1], 3)], 5, ZZ)
[4, 3, 0, 3, 0, 1, 4, 1]
sympy.polys.galoistools.gf_div(f, g, p, K)[源代码]#

余数除法 GF(p)[x] .

给定一元多项式 fg 有限域中的系数 p 元素,返回多项式 qr (商和余数)使 f = q*g + r .

考虑多项式 x**3 + x + 1x**2 + x 在GF(2)中:

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_div, gf_add_mul

>>> gf_div(ZZ.map([1, 0, 1, 1]), ZZ.map([1, 1, 0]), 2, ZZ)
([1, 1], [1])

结果我们得到了商 x + 1 和余数 1 ,因此:

>>> gf_add_mul(ZZ.map([1]), ZZ.map([1, 1]), ZZ.map([1, 1, 0]), 2, ZZ)
[1, 0, 1, 1]

工具书类

sympy.polys.galoistools.gf_rem(f, g, p, K)[源代码]#

计算多项式余数 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_rem
>>> gf_rem(ZZ.map([1, 0, 1, 1]), ZZ.map([1, 1, 0]), 2, ZZ)
[1]
sympy.polys.galoistools.gf_quo(f, g, p, K)[源代码]#

计算精确商 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_quo
>>> gf_quo(ZZ.map([1, 0, 1, 1]), ZZ.map([1, 1, 0]), 2, ZZ)
[1, 1]
>>> gf_quo(ZZ.map([1, 0, 3, 2, 3]), ZZ.map([2, 2, 2]), 5, ZZ)
[3, 2, 4]
sympy.polys.galoistools.gf_exquo(f, g, p, K)[源代码]#

计算多项式商 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_exquo
>>> gf_exquo(ZZ.map([1, 0, 3, 2, 3]), ZZ.map([2, 2, 2]), 5, ZZ)
[3, 2, 4]
>>> gf_exquo(ZZ.map([1, 0, 1, 1]), ZZ.map([1, 1, 0]), 2, ZZ)
Traceback (most recent call last):
...
ExactQuotientFailed: [1, 1, 0] does not divide [1, 0, 1, 1]
sympy.polys.galoistools.gf_lshift(f, n, K)[源代码]#

高效倍增 f 通过 x**n .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_lshift
>>> gf_lshift([3, 2, 4], 4, ZZ)
[3, 2, 4, 0, 0, 0, 0]
sympy.polys.galoistools.gf_rshift(f, n, K)[源代码]#

有效地划分 f 通过 x**n .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_rshift
>>> gf_rshift([1, 2, 3, 4, 0], 3, ZZ)
([1, 2], [3, 4, 0])
sympy.polys.galoistools.gf_pow(f, n, p, K)[源代码]#

计算 f**n 在里面 GF(p)[x] 使用重复的平方。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_pow
>>> gf_pow([3, 2, 4], 3, 5, ZZ)
[2, 4, 4, 2, 2, 1, 4]
sympy.polys.galoistools.gf_pow_mod(f, n, g, p, K)[源代码]#

计算 f**n 在里面 GF(p)[x]/(g) 使用重复的平方。

给定多项式 fg 在里面 GF(p)[x] 和一个非负整数 n ,有效地计算 f**n (mod g) i、 e.剩余的 f**n 从除法依据 g ,使用重复平方算法。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_pow_mod
>>> gf_pow_mod(ZZ.map([3, 2, 4]), 3, ZZ.map([1, 1]), 5, ZZ)
[]

工具书类

sympy.polys.galoistools.gf_gcd(f, g, p, K)[源代码]#

欧几里德算法 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_gcd
>>> gf_gcd(ZZ.map([3, 2, 4]), ZZ.map([2, 2, 3]), 5, ZZ)
[1, 3]
sympy.polys.galoistools.gf_lcm(f, g, p, K)[源代码]#

计算多项式LCM GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_lcm
>>> gf_lcm(ZZ.map([3, 2, 4]), ZZ.map([2, 2, 3]), 5, ZZ)
[1, 2, 0, 4]
sympy.polys.galoistools.gf_cofactors(f, g, p, K)[源代码]#

计算多项式GCD和余因子 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_cofactors
>>> gf_cofactors(ZZ.map([3, 2, 4]), ZZ.map([2, 2, 3]), 5, ZZ)
([1, 3], [3, 3], [2, 1])
sympy.polys.galoistools.gf_gcdex(f, g, p, K)[源代码]#

扩展欧几里德算法 GF(p)[x] .

给定多项式 fg 在里面 GF(p)[x] ,计算多项式 sth ,这样 h = gcd(f, g)s*f + t*g = h . EEA的典型应用是求解多项式丢番图方程。

考虑多项式 f = (x + 7) (x + 1)g = (x + 7) (x**2 + 1) 在里面 GF(11)[x] . 扩展欧几里德算法的应用给出:

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_gcdex, gf_mul, gf_add

>>> s, t, g = gf_gcdex(ZZ.map([1, 8, 7]), ZZ.map([1, 7, 1, 7]), 11, ZZ)
>>> s, t, g
([5, 6], [6], [1, 7])

我们得到了多项式 s = 5*x + 6t = 6 ,以及其他 gcd(f, g) = x + 7 . 这是正确的,因为:

>>> S = gf_mul(s, ZZ.map([1, 8, 7]), 11, ZZ)
>>> T = gf_mul(t, ZZ.map([1, 7, 1, 7]), 11, ZZ)

>>> gf_add(S, T, 11, ZZ) == [1, 7]
True

工具书类

sympy.polys.galoistools.gf_monic(f, p, K)[源代码]#

计算LC和monic多项式 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_monic
>>> gf_monic(ZZ.map([3, 2, 4]), 5, ZZ)
(3, [1, 4, 3])
sympy.polys.galoistools.gf_diff(f, p, K)[源代码]#

微分多项式 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_diff
>>> gf_diff([3, 2, 4], 5, ZZ)
[1, 2]
sympy.polys.galoistools.gf_eval(f, a, p, K)[源代码]#

评估 f(a) 在里面 GF(p) 使用霍纳方案。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_eval
>>> gf_eval([3, 2, 4], 2, 5, ZZ)
0
sympy.polys.galoistools.gf_multi_eval(f, A, p, K)[源代码]#

评估 f(a) 对于 a 在里面 [a_1, ..., a_n] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_multi_eval
>>> gf_multi_eval([3, 2, 4], [0, 1, 2, 3, 4], 5, ZZ)
[4, 4, 0, 2, 0]
sympy.polys.galoistools.gf_compose(f, g, p, K)[源代码]#

计算多项式组成 f(g) 在里面 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_compose
>>> gf_compose([3, 2, 4], [2, 2, 2], 5, ZZ)
[2, 4, 0, 3, 0]
sympy.polys.galoistools.gf_compose_mod(g, h, f, p, K)[源代码]#

计算多项式组成 g(h) 在里面 GF(p)[x]/(f) .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_compose_mod
>>> gf_compose_mod(ZZ.map([3, 2, 4]), ZZ.map([2, 2, 2]), ZZ.map([4, 3]), 5, ZZ)
[4]
sympy.polys.galoistools.gf_trace_map(a, b, c, n, f, p, K)[源代码]#

计算多项式迹映射 GF(p)[x]/(f) .

给定多项式 f 在里面 GF(p)[x] ,多项式 abc 在商环中 GF(p)[x]/(f) 这样的话 b = c**t (mod f) 为了一些积极的力量 t 属于 p ,和一个正整数 n ,返回映射:

a -> a**t**n, a + a**t + a**t**2 + ... + a**t**n (mod f)

在因式分解中, b = x**p mod fc = x mod f . 这样我们就可以在等次因式分解程序中高效地计算迹多项式,比其他方法(如迭代Frobenius算法)快得多。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_trace_map
>>> gf_trace_map([1, 2], [4, 4], [1, 1], 4, [3, 2, 4], 5, ZZ)
([1, 3], [1, 3])

工具书类

sympy.polys.galoistools.gf_random(n, p, K)[源代码]#

在中生成随机多项式 GF(p)[x] 程度的 n .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_random
>>> gf_random(10, 5, ZZ) 
[1, 2, 3, 2, 1, 1, 1, 2, 0, 4, 2]
sympy.polys.galoistools.gf_irreducible(n, p, K)[源代码]#

生成随机不可约次多项式 n 在里面 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_irreducible
>>> gf_irreducible(10, 5, ZZ) 
[1, 4, 2, 2, 3, 2, 4, 1, 4, 0, 4]
sympy.polys.galoistools.gf_irreducible_p(f, p, K)[源代码]#

多项式不可约性的检验 f 在里面 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_irreducible_p
>>> gf_irreducible_p(ZZ.map([1, 4, 2, 2, 3, 2, 4, 1, 4, 0, 4]), 5, ZZ)
True
>>> gf_irreducible_p(ZZ.map([3, 2, 4]), 5, ZZ)
False
sympy.polys.galoistools.gf_sqf_p(f, p, K)[源代码]#

返回 True 如果 f 是自由的吗 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_sqf_p
>>> gf_sqf_p(ZZ.map([3, 2, 4]), 5, ZZ)
True
>>> gf_sqf_p(ZZ.map([2, 4, 4, 2, 2, 1, 4]), 5, ZZ)
False
sympy.polys.galoistools.gf_sqf_part(f, p, K)[源代码]#

返回a的正方形自由部分 GF(p)[x] 多项式的。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_sqf_part
>>> gf_sqf_part(ZZ.map([1, 1, 3, 0, 1, 0, 2, 2, 1]), 5, ZZ)
[1, 4, 3]
sympy.polys.galoistools.gf_sqf_list(f, p, K, all=False)[源代码]#

返回a的平方自由分解 GF(p)[x] 多项式的。

Given a polynomial f in GF(p)[x], returns the leading coefficient of f and a square-free decomposition f_1**e_1 f_2**e_2 ... f_k**e_k such that all f_i are monic polynomials and (f_i, f_j) for i != j are co-prime and e_1 ... e_k are given in increasing order. All trivial terms (i.e. f_i = 1) are not included in the output.

考虑多项式 f = x**11 + 1 结束 GF(11)[x] ::

>>> from sympy.polys.domains import ZZ

>>> from sympy.polys.galoistools import (
...     gf_from_dict, gf_diff, gf_sqf_list, gf_pow,
... )
... 

>>> f = gf_from_dict({11: ZZ(1), 0: ZZ(1)}, 11, ZZ)

注意 f'(x) = 0 ::

>>> gf_diff(f, 11, ZZ)
[]

This phenomenon does not happen in characteristic zero. However we can still compute square-free decomposition of f using gf_sqf():

>>> gf_sqf_list(f, 11, ZZ)
(1, [([1, 1], 11)])

我们得到了因式分解 f = (x + 1)**11 . 这是正确的,因为:

>>> gf_pow([1, 1], 11, 11, ZZ) == f
True

工具书类

sympy.polys.galoistools.gf_Qmatrix(f, p, K)[源代码]#

计算Berlekamp's Q 矩阵。

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_Qmatrix
>>> gf_Qmatrix([3, 2, 4], 5, ZZ)
[[1, 0],
 [3, 4]]
>>> gf_Qmatrix([1, 0, 0, 0, 1], 5, ZZ)
[[1, 0, 0, 0],
 [0, 4, 0, 0],
 [0, 0, 1, 0],
 [0, 0, 0, 4]]
sympy.polys.galoistools.gf_Qbasis(Q, p, K)[源代码]#

计算 Q .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_Qmatrix, gf_Qbasis
>>> gf_Qbasis(gf_Qmatrix([1, 0, 0, 0, 1], 5, ZZ), 5, ZZ)
[[1, 0, 0, 0], [0, 0, 1, 0]]
>>> gf_Qbasis(gf_Qmatrix([3, 2, 4], 5, ZZ), 5, ZZ)
[[1, 0]]
sympy.polys.galoistools.gf_berlekamp(f, p, K)[源代码]#

无平方因子 f 在里面 GF(p)[x] 对于小型 p .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_berlekamp
>>> gf_berlekamp([1, 0, 0, 0, 1], 5, ZZ)
[[1, 0, 2], [1, 0, 3]]
sympy.polys.galoistools.gf_zassenhaus(f, p, K)[源代码]#

无平方因子 f 在里面 GF(p)[x] 对于介质 p .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_zassenhaus
>>> gf_zassenhaus(ZZ.map([1, 4, 3]), 5, ZZ)
[[1, 1], [1, 3]]
sympy.polys.galoistools.gf_shoup(f, p, K)[源代码]#

无平方因子 f 在里面 GF(p)[x] 大的 p .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_shoup
>>> gf_shoup(ZZ.map([1, 4, 3]), 5, ZZ)
[[1, 1], [1, 3]]
sympy.polys.galoistools.gf_factor_sqf(f, p, K, method=None)[源代码]#

因子无平方多项式 f 在里面 GF(p)[x] .

实例

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_factor_sqf
>>> gf_factor_sqf(ZZ.map([3, 2, 4]), 5, ZZ)
(3, [[1, 1], [1, 3]])
sympy.polys.galoistools.gf_factor(f, p, K)[源代码]#

因子(非平方自由)多项式 GF(p)[x] .

给出一个可能的非平方自由多项式 f 在里面 GF(p)[x] ,返回其不可约的完全因式分解:

f_1(x)**e_1 f_2(x)**e_2 ... f_d(x)**e_d

每一个 f_i 是一元多项式 gcd(f_i, f_j) == 1 ,为了 i != j . 结果被作为一个由导系数组成的元组给出 f 以及一系列因素 f 他们的多样性。

该算法首先计算 f 然后迭代分解每个无平方因子。

考虑一个非平方自由多项式 f = (7*x + 1) (x + 2)**2 在里面 GF(11)[x] . 我们得到它的不可约因子分解如下:

>>> from sympy.polys.domains import ZZ
>>> from sympy.polys.galoistools import gf_factor

>>> gf_factor(ZZ.map([5, 2, 7, 2]), 11, ZZ)
(5, [([1, 2], 1), ([1, 8], 2)])

We arrived with factorization f = 5 (x + 2) (x + 8)**2. We did not recover the exact form of the input polynomial because we requested to get monic factors of f and its leading coefficient separately.

平方自由因子 f 不可简化为不可分解的 GF(p) 使用三种截然不同的方法:

贝莱坎普

对于非常小的值非常有效 p (通常 p < 25

康托·扎森豪斯

有效的平均投入和“典型” p

Shoup Kaltofen Gathen公司

高效,输入和模数非常大

如果要使用特定的因子分解方法,而不是默认的方法,请设置 GF_FACTOR_METHOD 其中一个 berlekampzassenhausshoup 价值观。

工具书类

sympy.polys.galoistools.gf_value(f, a)[源代码]#

字段R中“a”处多项式“f”的值。

实例

>>> from sympy.polys.galoistools import gf_value
>>> gf_value([1, 7, 2, 4], 11)
2204
sympy.polys.galoistools.gf_csolve(f, n)[源代码]#

求f(x)同余0模(n)。

将n划分为典型因子,并对每个因子求解f(x)cong 0 mod(p**e)。将中国剩余定理应用于结果,返回最终答案。

实例

解决 [1,1,7] 全等0模(189):

>>> from sympy.polys.galoistools import gf_csolve
>>> gf_csolve([1, 1, 7], 189)
[13, 49, 76, 112, 139, 175]

参见

sympy.ntheory.residue_ntheory.polynomial_congruence

a higher level solving routine

工具书类

[R792]

《数论导论》第五版,作者:伊万·尼文、扎克曼和蒙哥马利。

稀疏分布多项式和向量的处理#

Dense representations quickly require infeasible amounts of storage and computation time if the number of variables increases. For this reason, there is code to manipulate polynomials in a sparse representation. The Ring object and elements are implemented by the classes PolyRing and PolyElement.

在交换代数中,人们不仅研究多项式,而且还研究多项式 模块 多项式环上。多项式操作模块为有限生成的自由模块提供了基本的低级支持。这主要用于Groebner基计算(参见此处),因此操作函数只提供给所需的扩展。它们带有前缀 sdm_ . 注意,在示例中,自由模块的生成器称为 \(f_1, f_2, \ldots\) .

sympy.polys.distributedmodules.sdm_monomial_mul(M, X)[源代码]#

乘法元组 X 表示单项式的 \(K[X]\) 进入元组 M 表示单项式的 \(F\) .

实例

倍增 \(xy^3\) 进入之内 \(x f_1\) 产量 \(x^2 y^3 f_1\)

>>> from sympy.polys.distributedmodules import sdm_monomial_mul
>>> sdm_monomial_mul((1, 1, 0), (1, 3))
(1, 2, 3)
sympy.polys.distributedmodules.sdm_monomial_deg(M)[源代码]#

返回 M .

实例

例如 \(x^2 y f_5\) 是3:

>>> from sympy.polys.distributedmodules import sdm_monomial_deg
>>> sdm_monomial_deg((5, 2, 1))
3
sympy.polys.distributedmodules.sdm_monomial_divides(A, B)[源代码]#

是否存在一个(多项式)单项式X,使得XA=B?

实例

正面例子:

在下面的例子中,单项式是以x,y和生成器,f_1,f_2等形式给出的。该单项式的元组形式用于调用sdm_monogical_divides。注意:生成器在表达式中最后出现,但在元组中第一个出现,其他因子的出现顺序与它们在单项式表达式中的顺序相同。

\(A = f_1\) divides \(B = f_1\)

>>> from sympy.polys.distributedmodules import sdm_monomial_divides
>>> sdm_monomial_divides((1, 0, 0), (1, 0, 0))
True

\(A = f_1\) divides \(B = x^2 y f_1\)

>>> sdm_monomial_divides((1, 0, 0), (1, 2, 1))
True

\(A = xy f_5\) divides \(B = x^2 y f_5\)

>>> sdm_monomial_divides((5, 1, 1), (5, 2, 1))
True

反面例子:

\(A = f_1\) does not divide \(B = f_2\)

>>> sdm_monomial_divides((1, 0, 0), (2, 0, 0))
False

\(A = x f_1\) does not divide \(B = f_1\)

>>> sdm_monomial_divides((1, 1, 0), (1, 0, 0))
False

\(A = xy^2 f_5\) does not divide \(B = y f_5\)

>>> sdm_monomial_divides((5, 1, 2), (5, 0, 1))
False
sympy.polys.distributedmodules.sdm_LC(f, K)[源代码]#

返回的前导系数 f .

sympy.polys.distributedmodules.sdm_to_dict(f)[源代码]#

从分布式字典中生成多项式。

sympy.polys.distributedmodules.sdm_from_dict(d, O)[源代码]#

从字典创建sdm。

在这里 O 是要使用的单项式顺序。

实例

>>> from sympy.polys.distributedmodules import sdm_from_dict
>>> from sympy.polys import QQ, lex
>>> dic = {(1, 1, 0): QQ(1), (1, 0, 0): QQ(2), (0, 1, 0): QQ(0)}
>>> sdm_from_dict(dic, lex)
[((1, 1, 0), 1), ((1, 0, 0), 2)]
sympy.polys.distributedmodules.sdm_add(f, g, O, K)[源代码]#

添加两个模块元素 fg .

在地面上进行加法运算 K ,单项式根据 O .

实例

所有例子都使用字典序。

\((xy f_1) + (f_2) = f_2 + xy f_1\)

>>> from sympy.polys.distributedmodules import sdm_add
>>> from sympy.polys import lex, QQ
>>> sdm_add([((1, 1, 1), QQ(1))], [((2, 0, 0), QQ(1))], lex, QQ)
[((2, 0, 0), 1), ((1, 1, 1), 1)]

\((xy f_1) + (-xy f_1)\) = 0`

>>> sdm_add([((1, 1, 1), QQ(1))], [((1, 1, 1), QQ(-1))], lex, QQ)
[]

\((f_1) + (2f_1) = 3f_1\)

>>> sdm_add([((1, 0, 0), QQ(1))], [((1, 0, 0), QQ(2))], lex, QQ)
[((1, 0, 0), 3)]

\((yf_1) + (xf_1) = xf_1 + yf_1\)

>>> sdm_add([((1, 0, 1), QQ(1))], [((1, 1, 0), QQ(1))], lex, QQ)
[((1, 1, 0), 1), ((1, 0, 1), 1)]
sympy.polys.distributedmodules.sdm_LM(f)[源代码]#

返回的前导单项式 f .

仅在以下情况下有效 \(f \ne 0\) .

实例

>>> from sympy.polys.distributedmodules import sdm_LM, sdm_from_dict
>>> from sympy.polys import QQ, lex
>>> dic = {(1, 2, 3): QQ(1), (4, 0, 0): QQ(1), (4, 0, 1): QQ(1)}
>>> sdm_LM(sdm_from_dict(dic, lex))
(4, 0, 1)
sympy.polys.distributedmodules.sdm_LT(f)[源代码]#

返回的前导项 f .

仅在以下情况下有效 \(f \ne 0\) .

实例

>>> from sympy.polys.distributedmodules import sdm_LT, sdm_from_dict
>>> from sympy.polys import QQ, lex
>>> dic = {(1, 2, 3): QQ(1), (4, 0, 0): QQ(2), (4, 0, 1): QQ(3)}
>>> sdm_LT(sdm_from_dict(dic, lex))
((4, 0, 1), 3)
sympy.polys.distributedmodules.sdm_mul_term(f, term, O, K)[源代码]#

乘以分布式模块元素 f 通过(多项式)项 term .

系数的乘法是在地磁场上进行的 K ,单体的顺序如下所示 O .

实例

\(0 f_1 = 0\)

>>> from sympy.polys.distributedmodules import sdm_mul_term
>>> from sympy.polys import lex, QQ
>>> sdm_mul_term([((1, 0, 0), QQ(1))], ((0, 0), QQ(0)), lex, QQ)
[]

\(x 0 = 0\)

>>> sdm_mul_term([], ((1, 0), QQ(1)), lex, QQ)
[]

\((x) (f_1) = xf_1\)

>>> sdm_mul_term([((1, 0, 0), QQ(1))], ((1, 0), QQ(1)), lex, QQ)
[((1, 1, 0), 1)]

\((2xy) (3x f_1 + 4y f_2) = 8xy^2 f_2 + 6x^2y f_1\)

>>> f = [((2, 0, 1), QQ(4)), ((1, 1, 0), QQ(3))]
>>> sdm_mul_term(f, ((1, 1), QQ(2)), lex, QQ)
[((2, 1, 2), 8), ((1, 2, 1), 6)]
sympy.polys.distributedmodules.sdm_zero()[源代码]#

返回零模元件。

sympy.polys.distributedmodules.sdm_deg(f)[源代码]#

f .

这是它所有单项式的最大度数。无效if f 是零。

实例

>>> from sympy.polys.distributedmodules import sdm_deg
>>> sdm_deg([((1, 2, 3), 1), ((10, 0, 1), 1), ((2, 3, 4), 4)])
7
sympy.polys.distributedmodules.sdm_from_vector(vec, O, K, **opts)[源代码]#

从表达式的iterable创建sdm。

系数在“地面”字段中创建 K ,项按单项式顺序排列 O . 命名参数被传递到polys转换代码,并可用于指定示例生成器。

实例

>>> from sympy.polys.distributedmodules import sdm_from_vector
>>> from sympy.abc import x, y, z
>>> from sympy.polys import QQ, lex
>>> sdm_from_vector([x**2+y**2, 2*z], lex, QQ)
[((1, 0, 0, 1), 2), ((0, 2, 0, 0), 1), ((0, 0, 2, 0), 1)]
sympy.polys.distributedmodules.sdm_to_vector(f, gens, K, n=None)[源代码]#

转换sdm f 在多项式表达式列表中。

多项式环的生成器通过 gens . 模块的等级是猜测的,或者通过 n . 地面场假定为 K .

实例

>>> from sympy.polys.distributedmodules import sdm_to_vector
>>> from sympy.abc import x, y, z
>>> from sympy.polys import QQ
>>> f = [((1, 0, 0, 1), QQ(2)), ((0, 2, 0, 0), QQ(1)), ((0, 0, 2, 0), QQ(1))]
>>> sdm_to_vector(f, [x, y, z], QQ)
[x**2 + y**2, 2*z]

多项式因式分解算法#

欧几里得算法的许多变体:

经典余数序列#

\(K\) 作为一个领域,并考虑戒指 \(K[X]\) 一个不确定多项式 \(X\) 系数为 \(K\) . 给定两个元素 \(f\)\(g\) 属于 \(K[X]\) 具有 \(g\neq 0\) 有唯一多项式 \(q\)\(r\) 这样的话 \(f = qg + r\)\(\deg(r) < \deg(g)\)\(r = 0\) . 它们表示为 \(\mathrm{{quo}}(f,g)\)\(\mathrm{{rem}}(f,g)\)余数 ),所以我们有 部门标识

\[f=\mathrm{quo}(f,g)g+\mathrm{rem}(f,g)。\]

所以每个理想 \(I\) 属于 \(K[X]\) 是由任何元素生成的主理想 \(\neq 0\) 最低程度(假设 \(I\) 非零)。事实上,如果 \(g\) 是一个多项式 \(f\) 是的任何元素 \(I\)\(\mathrm{{rem}}(f,g)\) 属于 \(I\) 作为线性组合 \(f\)\(g\) ,因此必须为零;因此 \(f\) 是的倍数 \(g\) .

使用此结果可以找到 greatest common divisor (gcd)任何多项式的 \(f,g,\ldots\) 在里面 \(K[X]\) .如果 \(I\) 是由给定多项式的所有线性组合所形成的理想值 \(K[X]\)\(d\) 是它的生成元,那么多项式的每一个公约数也被除 \(d\) . 另一方面,给定的多项式是生成元的倍数 \(d\) ;因此 \(d\) 是多项式的gcd,表示为 \(\mathrm{{gcd}}(f,g,\ldots)\) .

两个多项式的gcd算法 \(f\)\(g\) 在里面 \(K[X]\) 现在可以得到如下结果。根据部门身份, \(r = \mathrm{{rem}}(f,g)\) 是在理想中产生的 \(f\)\(g\) 以及 \(f\) 是在理想中产生的 \(g\)\(r\) . 由此产生了由对产生的理想 \((f,g)\)\((g,r)\) 都是一样的。设置 \(f_0 = f\)\(f_1 = g\) ,并递归定义 \(f_i = \mathrm{{rem}}(f_{{i-2}},f_{{i-1}})\) 对于 \(i\ge 2\) . 递归在有限步数后结束,使用 \(f_{{k+1}}=0\) ,因为多项式的度数是严格递减的。根据上面的话,所有的对 \((f_{{i-1}},f_i)\) 产生同样的理想。尤其是由 \(f\)\(g\) 由生成 \(f_k\) 独自一人 \(f_{{k+1}} = 0\) . 因此 \(d = f_k\) gcd是 \(f\)\(g\) .

多项式序列 \(f_0\), \(f_1,\ldots, f_k\) is called the Euclidean polynomial remainder sequence determined by \((f,g)\) because of the analogy with the classical Euclidean algorithm 对于自然数的gcd。

该算法可以被扩展以获得 \(d\) 依据 \(f\)\(g\) 通过使用全除法恒等式递归地编写每个 \(f_i\) 作为线性组合 \(f\)\(g\) . 这就产生了一个等式

\[d=uf+vg\qquad(u,v\单位:K) [X] )\]

类似于 Bézout's identity 对于整数。

sympy.polys.euclidtools.dmp_half_gcdex(f, g, u, K)[源代码]#

半扩展欧几里德算法 \(F[X]\) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
sympy.polys.euclidtools.dmp_gcdex(f, g, u, K)[源代码]#

扩展欧几里德算法 \(F[X]\) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
sympy.polys.euclidtools.dmp_invert(f, g, u, K)[源代码]#

计算的乘法逆 \(f\)\(g\) 在里面 \(F[X]\) .

实例

>>> from sympy.polys import ring, QQ
>>> R, x = ring("x", QQ)
sympy.polys.euclidtools.dmp_euclidean_prs(f, g, u, K)[源代码]#

欧氏多项式余数序列 \(K[X]\) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)

简化余数序列#

像往常一样,假设系数场 \(K\) 是积分域的分数域 \(A\) . 在这种情况下,欧几里德余数序列中多项式的系数(分子和分母)往往增长得非常快。

如果 \(A\) 是一个唯一的因式分解域,可以通过消除分子和分母的公因子来减少系数。进一步的简化是可能的,注意到 \(K[X]\) 不是唯一的:它可以乘以任何(非零)常数因子。

任意多项式 \(f\) 在里面 \(K[X]\) 可以通过提取其系数分子的分母和公因子来简化。这就产生了表示 \(f = cF\) 在哪里? \(c\in K\)内容 属于 \(f\)\(F\) 是一个 原始的 多项式,即 \(A[X]\) 有互质系数。

可以通过替换给定多项式来启动算法 \(f\)\(g\) 它们的原始部分。这只会修改 \(\mathrm{{rem}}(f,g)\) 一个常数因子。用它的本原部分代替它,递归地继续得到欧氏余数序列中多项式的所有本原部分,包括本原 \(\mathrm{{gcd}}(f,g)\) .

这个序列是 本原多项式余数序列 . 这是一个例子 一般多项式余数序列 其中计算的余数被常数乘数(或除数)修改,以简化结果。

sympy.polys.euclidtools.dmp_primitive_prs(f, g, u, K)[源代码]#

本原多项式余数序列 \(K[X]\) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)

子合成序列#

原始多项式序列的系数并没有过大的增长,但原始部分的计算需要额外的处理工作。此外,该方法只适用于唯一因子分解域的分数域,不包括一般的数域。

柯林斯 [柯林斯67] 意识到所谓的 次结式多项式 一对多项式也构成了广义余数序列。这些多项式的系数可表示为给定多项式系数的行列式。因此,它们的大小(对数)只能线性增长。另外,如果给定多项式的系数在子域中 \(A\) 次结式多项式也是如此。这意味着子结果序列与原始余数序列相似,而不依赖于 \(A\) .

为了了解子结果如何与余数序列相关联,请回忆一下所有的多项式 \(h\) 序列中是给定多项式的线性组合 \(f\)\(g\)

\[h=uf+vg\]

用多项式 \(u\)\(v\) 在里面 \(K[X]\) . 此外,从扩展的欧几里德算法中可以看出 \(u\)\(v\) 相对较低,一步一步增长有限。

Let \(n = \deg(f)\), and \(m = \deg(g)\), and assume \(n\ge m\). If \(\deg(h) = j < m\), the coefficients of the powers \(X^k\) (\(k > j\)) in the products \(uf\) and \(vg\) cancel each other. In particular, the products must have the same degree, say, \(l\). Then \(\deg(u) = l - n\) and \(\deg(v) = l - m\) with a total of \(2l -n - m + 2\) coefficients to be determined.

On the other hand, the equality \(h = uf + vg\) implies that \(l - j\) linear combinations of the coefficients are zero, those associated with the powers \(X^i\) (\(j < i \leq l\)), and one has a given non-zero value, namely the leading coefficient of \(h\).

为了满足这些要求 \(l - j + 1\) 线性方程待确定的系数总数不能低于 \(l - j + 1\) ,一般来说。这就导致了不平等 \(l \ge n + m - j - 1\) . 拿 \(l = n + m - j - 1\) ,我们得到 \(\deg(u) = m - j - 1\)\(\deg(v) = n - j - 1\) .

在案件中 \(j = 0\) the matrix of the resulting system of linear equations is the Sylvester matrix \(S(f,g)\) associated to \(f\) and \(g\), an \((n+m)\times (n+m)\) matrix with coefficients of \(f\) and \(g\) as entries. Its determinant is the resultant \(\mathrm{{res}}(f,g)\) 一对的 \((f,g)\) . 非零当且仅当 \(f\)\(g\) 相对最好。

对于任何 \(j\) 间隔时间 \(0\)\(m\) 线性系统的矩阵是 \((n+m-2j)\times (n+m-2j)\) 西尔维斯特矩阵的子阵。其决定因素 \(s_j(f,g)\) 被称为 \(j\)标量子合成 属于 \(f\)\(g\) .

如果 \(s_j(f,g)\) 不是零,关联的方程 \(h = uf + vg\) 有一个独特的解决方案 \(\deg(h) = j\) 以及 \(h\) 具有任何给定的值;具有领先系数的值 \(s_j(f,g)\)\(j\)次结式多项式 或者,简单地说, 子结果 一对的 \((f,g)\) ,并表示 \(S_j(f,g)\) . 这种选择保证了剩余系数也是西尔维斯特矩阵的某些子行列式。特别是,如果 \(f\)\(g\)\(A[X]\) ,也是 \(S_j(f,g)\) 也。子结果的这种结构适用于任何 \(j\) 之间 \(0\)\(m\) 不管价值 \(s_j(f,g)\) ;如果为零,则 \(\deg(S_j(f,g)) < j\) .

子结果的性质如下。让 \(n_0 = \deg(f)\)\(n_1 = \deg(g)\)\(n_2, \ldots, n_k\) 是余数序列中多项式次数的递减序列。让 \(0 \le j \le n_1\) ;然后

  • \(s_j(f,g)\ne 0\) 当且仅当 \(j = n_i\) 对某些人来说 \(i\) .

  • \(S_j(f,g)\ne 0\) 当且仅当 \(j = n_i\)\(j = n_i - 1\) 对某些人来说 \(i\) .

通常情况下, \(n_{{i-1}} - n_i = 1\) 对于 \(1 < i \le k\) .如果 \(n_{{i-1}} - n_i > 1\) 对某些人来说 \(i\) (the 反常的 案例),那么 \(S_{{n_{{i-1}}-1}}(f,g)\)\(S_{{n_i}}(f,g)\) 是彼此的常数倍数。因此任何一个都可以包含在多项式余数序列中。前者由更小的行列式给出,所以它的系数应该更小。

柯林斯定义了 子余数序列 通过设置

\[f{i=S{n{i-1}-1}(f,g)\qquad(2\le i\le k)。\]

在正常情况下,这些与 \(S_{{n_i}}(f,g)\) . 他还导出了常数的表达式 \(\gamma_i\) 在余数公式中

\[\伽马射线{i=\mathrm{rem}(f{i-2},f{i-1})\]

根据 \(f_1,\ldots,f_{{i-1}}\) ,在野外工作 \(K\) .

布朗和特劳布 [布朗特拉布71] 后来发展了一种计算系数的递归程序 \(\gamma_i\) . 他们的算法处理域的元素 \(A\) 排他性(假设 \(f,g\in A[X]\) ). 然而,在异常情况下却出现了一个问题,即 \(A\) 只能推测是准确的。

随后布朗证明了这一点 [布朗78] 他证明了除法的结果实际上是一个标量子结果。更具体地说,在计算 \(f_i\)\(s_{{n_{{i-2}}}}(f,g)\) (定理3)。这个发现的含义是标量子结果作为算法的副产品来计算,除了 \(s_{{n_k}}(f,g)\) 找到后就不需要了 \(f_{{k+1}} = 0\) . 完成最后一步,我们得到所有非零标量子结果,包括最后一个,如果这个结果不为零,则为结果。

sympy.polys.euclidtools.dmp_inner_subresultants(f, g, u, K)[源代码]#

子结果PRS算法 \(K[X]\) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = 3*x**2*y - y**3 - 4
>>> g = x**2 + x*y**3 - 9
>>> a = 3*x*y**4 + y**3 - 27*y + 4
>>> b = -3*y**10 - 12*y**7 + y**6 - 54*y**4 + 8*y**3 + 729*y**2 - 216*y + 16
>>> prs = [f, g, a, b]
>>> sres = [[1], [1], [3, 0, 0, 0, 0], [-3, 0, 0, -12, 1, 0, -54, 8, 729, -216, 16]]
>>> R.dmp_inner_subresultants(f, g) == (prs, sres)
True
sympy.polys.euclidtools.dmp_subresultants(f, g, u, K)[源代码]#

计算 \(K[X]\) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = 3*x**2*y - y**3 - 4
>>> g = x**2 + x*y**3 - 9
>>> a = 3*x*y**4 + y**3 - 27*y + 4
>>> b = -3*y**10 - 12*y**7 + y**6 - 54*y**4 + 8*y**3 + 729*y**2 - 216*y + 16
>>> R.dmp_subresultants(f, g) == [f, g, a, b]
True
sympy.polys.euclidtools.dmp_prs_resultant(f, g, u, K)[源代码]#

合成算法 \(K[X]\) 使用子结果pr。

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = 3*x**2*y - y**3 - 4
>>> g = x**2 + x*y**3 - 9
>>> a = 3*x*y**4 + y**3 - 27*y + 4
>>> b = -3*y**10 - 12*y**7 + y**6 - 54*y**4 + 8*y**3 + 729*y**2 - 216*y + 16
>>> res, prs = R.dmp_prs_resultant(f, g)
>>> res == b             # resultant has n-1 variables
False
>>> res == b.drop(x)
True
>>> prs == [f, g, a, b]
True
sympy.polys.euclidtools.dmp_zz_modular_resultant(f, g, p, u, K)[源代码]#

计算的结果 \(f\)\(g\) 模a素数 \(p\) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = x + y + 2
>>> g = 2*x*y + x + 3
>>> R.dmp_zz_modular_resultant(f, g, 5)
-2*y**2 + 1
sympy.polys.euclidtools.dmp_zz_collins_resultant(f, g, u, K)[源代码]#

柯林斯模结式算法 \(Z[X]\) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = x + y + 2
>>> g = 2*x*y + x + 3
>>> R.dmp_zz_collins_resultant(f, g)
-2*y**2 - 5*y + 1
sympy.polys.euclidtools.dmp_qq_collins_resultant(f, g, u, K0)[源代码]#

柯林斯模结式算法 \(Q[X]\) .

实例

>>> from sympy.polys import ring, QQ
>>> R, x,y = ring("x,y", QQ)
>>> f = QQ(1,2)*x + y + QQ(2,3)
>>> g = 2*x*y + x + 3
>>> R.dmp_qq_collins_resultant(f, g)
-2*y**2 - 7/3*y + 5/6
sympy.polys.euclidtools.dmp_resultant(f, g, u, K, includePRS=False)[源代码]#

计算 \(K[X]\) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> f = 3*x**2*y - y**3 - 4
>>> g = x**2 + x*y**3 - 9
>>> R.dmp_resultant(f, g)
-3*y**10 - 12*y**7 + y**6 - 54*y**4 + 8*y**3 + 729*y**2 - 216*y + 16
sympy.polys.euclidtools.dmp_discriminant(f, u, K)[源代码]#

计算多项式的判别式 \(K[X]\) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y,z,t = ring("x,y,z,t", ZZ)
>>> R.dmp_discriminant(x**2*y + x*z + t)
-4*y*t + z**2
sympy.polys.euclidtools.dmp_rr_prs_gcd(f, g, u, K)[源代码]#

使用环上的子结果计算多项式GCD。

返回 (h, cff, cfg) 这样的话 a = gcd(f, g)cff = quo(f, h)cfg = quo(g, h) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y, = ring("x,y", ZZ)
>>> f = x**2 + 2*x*y + y**2
>>> g = x**2 + x*y
>>> R.dmp_rr_prs_gcd(f, g)
(x + y, x + y, x)
sympy.polys.euclidtools.dmp_ff_prs_gcd(f, g, u, K)[源代码]#

使用域上的子结果计算多项式GCD。

返回 (h, cff, cfg) 这样的话 a = gcd(f, g)cff = quo(f, h)cfg = quo(g, h) .

实例

>>> from sympy.polys import ring, QQ
>>> R, x,y, = ring("x,y", QQ)
>>> f = QQ(1,2)*x**2 + x*y + QQ(1,2)*y**2
>>> g = x**2 + x*y
>>> R.dmp_ff_prs_gcd(f, g)
(x + y, 1/2*x + 1/2*y, x)
sympy.polys.euclidtools.dmp_zz_heu_gcd(f, g, u, K)[源代码]#

启发式多项式GCD \(Z[X]\) .

给定一元多项式 \(f\)\(g\) 在里面 \(Z[X]\) ,返回它们的GCD和余因子,即多项式 hcffcfg 因此:

h = gcd(f, g), cff = quo(f, h) and cfg = quo(g, h)

该算法是纯启发式的,这意味着它可能无法计算GCD。这将通过引发异常来表示。在这种情况下,您需要切换到另一个GCD方法。

该算法通过计算多项式f和g在某些点上的GCD并计算这些求值的(快速)整数GCD来计算多项式GCD。通过插值从整数图像中恢复多项式GCD。求值过程将f和g变量逐级缩减为一个大整数。最后一步是验证插值多项式是否是正确的GCD。这给了输入多项式的辅助因子作为副作用。

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y, = ring("x,y", ZZ)
>>> f = x**2 + 2*x*y + y**2
>>> g = x**2 + x*y
>>> R.dmp_zz_heu_gcd(f, g)
(x + y, x + y, x)

工具书类

sympy.polys.euclidtools.dmp_qq_heu_gcd(f, g, u, K0)[源代码]#

启发式多项式GCD \(Q[X]\) .

返回 (h, cff, cfg) 这样的话 a = gcd(f, g)cff = quo(f, h)cfg = quo(g, h) .

实例

>>> from sympy.polys import ring, QQ
>>> R, x,y, = ring("x,y", QQ)
>>> f = QQ(1,4)*x**2 + x*y + y**2
>>> g = QQ(1,2)*x**2 + x*y
>>> R.dmp_qq_heu_gcd(f, g)
(x + 2*y, 1/4*x + 1/2*y, 1/2*x)
sympy.polys.euclidtools.dmp_inner_gcd(f, g, u, K)[源代码]#

计算多项式GCD和 \(f\)\(g\) 在里面 \(K[X]\) .

返回 (h, cff, cfg) 这样的话 a = gcd(f, g)cff = quo(f, h)cfg = quo(g, h) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y, = ring("x,y", ZZ)
>>> f = x**2 + 2*x*y + y**2
>>> g = x**2 + x*y
>>> R.dmp_inner_gcd(f, g)
(x + y, x + y, x)
sympy.polys.euclidtools.dmp_gcd(f, g, u, K)[源代码]#

计算的多项式GCD \(f\)\(g\) 在里面 \(K[X]\) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y, = ring("x,y", ZZ)
>>> f = x**2 + 2*x*y + y**2
>>> g = x**2 + x*y
>>> R.dmp_gcd(f, g)
x + y
sympy.polys.euclidtools.dmp_lcm(f, g, u, K)[源代码]#

计算的多项式LCM \(f\)\(g\) 在里面 \(K[X]\) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y, = ring("x,y", ZZ)
>>> f = x**2 + 2*x*y + y**2
>>> g = x**2 + x*y
>>> R.dmp_lcm(f, g)
x**3 + 2*x**2*y + x*y**2
sympy.polys.euclidtools.dmp_content(f, u, K)[源代码]#

返回多元系数的GCD。

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y, = ring("x,y", ZZ)
>>> R.dmp_content(2*x*y + 6*x + 4*y + 12)
2*y + 6
sympy.polys.euclidtools.dmp_primitive(f, u, K)[源代码]#

返回多元内容和原始多项式。

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y, = ring("x,y", ZZ)
>>> R.dmp_primitive(2*x*y + 6*x + 4*y + 12)
(2*y + 6, x + 2)
sympy.polys.euclidtools.dmp_cancel(f, g, u, K, include=True)[源代码]#

消去有理函数中的公因式 \(f/g\) .

实例

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)
>>> R.dmp_cancel(2*x**2 - 2, x**2 - 2*x + 1)
(2*x + 2, x - 1)

特征零点的多项式因式分解:

sympy.polys.factortools.dmp_trial_division(f, factors, u, K)[源代码]#

用试算法确定多元多项式的因子重数。

sympy.polys.factortools.dmp_zz_mignotte_bound(f, u, K)[源代码]#

多元多项式的Mignotte界 \(K[X]\) .

sympy.polys.factortools.dup_zz_hensel_step(m, f, g, h, s, t, K)[源代码]#

亨塞尔的一步 \(Z[x]\) .

给定正整数 \(m\)\(Z[x]\) 多项式 \(f\)\(g\)\(h\)\(s\)\(t\) 因此:

f = g*h (mod m)
s*g + t*h = 1 (mod m)

lc(f) is not a zero divisor (mod m)
lc(h) = 1

deg(f) = deg(g) + deg(h)
deg(s) < deg(h)
deg(t) < deg(g)

返回多项式 \(G\)\(H\)\(S\)\(T\) ,这样:

f = G*H (mod m**2)
S*G + T*H = 1 (mod m**2)

工具书类

sympy.polys.factortools.dup_zz_hensel_lift(p, f, f_list, l, K)[源代码]#

多因素Hensel提升 \(Z[x]\) .

给予质数 \(p\) ,多项式 \(f\) 结束 \(Z[x]\) 这样的话 \(lc(f)\) 是单位模 \(p\) ,一元对互素多项式 \(f_i\) 结束 \(Z[x]\) 令人满意的::

f = lc(f) f_1 ... f_r (mod p)

and a positive integer \(l\), returns a list of monic polynomials \(F_1,\ F_2,\ \dots,\ F_r\) satisfying:

f = lc(f) F_1 ... F_r (mod p**l)

F_i = f_i (mod p), i = 1..r

工具书类

sympy.polys.factortools.dup_zz_zassenhaus(f, K)[源代码]#

因子本原平方自由多项式 \(Z[x]\) .

sympy.polys.factortools.dup_zz_irreducible_p(f, K)[源代码]#

用艾森斯坦准则检验不可约性。

sympy.polys.factortools.dup_cyclotomic_p(f, K, irreducible=False)[源代码]#

有效地测试 f 是一个分圆多项式。

实例

>>> from sympy.polys import ring, ZZ
>>> R, x = ring("x", ZZ)
>>> f = x**16 + x**14 - x**10 + x**8 - x**6 + x**2 + 1
>>> R.dup_cyclotomic_p(f)
False
>>> g = x**16 + x**14 - x**10 - x**8 - x**6 + x**2 + 1
>>> R.dup_cyclotomic_p(g)
True

工具书类

Bradford, Russell J., and James H. Davenport. "Effective tests for cyclotomic polynomials." In International Symposium on Symbolic and Algebraic Computation, pp. 244-251. Springer, Berlin, Heidelberg, 1988.

sympy.polys.factortools.dup_zz_cyclotomic_poly(n, K)[源代码]#

高效生成n次分圆多项式。

sympy.polys.factortools.dup_zz_cyclotomic_factor(f, K)[源代码]#

有效因子多项式 \(x**n - 1\)\(x**n + 1\) 在里面 \(Z[x]\) .

给定一元多项式 \(f\) 在里面 \(Z[x]\) 返回因子的列表 \(f\) ,前提是 \(f\) 在表格中 \(x**n - 1\)\(x**n + 1\) 对于 \(n >= 1\) . 否则返回None。

因子分解是使用 \(f\) ,这使得该方法比任何其他直接因子分解方法(如Zassenhaus的)快得多。

工具书类

sympy.polys.factortools.dup_zz_factor_sqf(f, K)[源代码]#

因子无平方(非本原)多项式 \(Z[x]\) .

sympy.polys.factortools.dup_zz_factor(f, K)[源代码]#

因子(非平方自由)多项式 \(Z[x]\) .

给定一元多项式 \(f\) 在里面 \(Z[x]\) 计算其完全因子化 \(f_1, ..., f_n\) 整数上的不可约:

f = content(f) f_1**k_1 ... f_n**k_n

因式分解是通过将输入多项式化为一个本原无平方多项式并使用Zassenhaus算法进行因式分解来计算的。审判庭用于恢复因素的多重性。

结果以元组形式返回,该元组包含:

(content(f), [(f_1, k_1), ..., (f_n, k_n))

实例

考虑多项式 \(f = 2*x**4 - 2\) ::

>>> from sympy.polys import ring, ZZ
>>> R, x = ring("x", ZZ)

>>> R.dup_zz_factor(2*x**4 - 2)
(2, [(x - 1, 1), (x + 1, 1), (x**2 + 1, 1)])

结果我们得到了以下因子分解:

f = 2 (x - 1) (x + 1) (x**2 + 1)

注意,这是对整数的完全因式分解,但是对于高斯整数,我们可以对最后一项进行因子分解。

默认情况下,多项式 \(x**n - 1\)\(x**n + 1\) 使用分圆分解来加速计算。要禁用此行为,请设置分圆=False。

工具书类

sympy.polys.factortools.dmp_zz_wang_non_divisors(E, cs, ct, K)[源代码]#

Wang/EEZ:计算一组有效的除数。

sympy.polys.factortools.dmp_zz_wang_test_points(f, T, ct, A, u, K)[源代码]#

Wang/EEZ:测试适用性评估点。

sympy.polys.factortools.dmp_zz_wang_lead_coeffs(f, T, cs, E, H, A, u, K)[源代码]#

Wang/EEZ:计算正确的引导系数。

sympy.polys.factortools.dmp_zz_diophantine(F, c, A, d, p, u, K)[源代码]#

Wang/EEZ:求解多元丢番图方程。

sympy.polys.factortools.dmp_zz_wang_hensel_lifting(f, H, LC, A, p, u, K)[源代码]#

Wang/EEZ:并行Hensel提升算法。

sympy.polys.factortools.dmp_zz_wang(f, u, K, mod=None, seed=None)[源代码]#

因子本原平方自由多项式 \(Z[X]\) .

给定多元多项式 \(f\) 在里面 \(Z[x_1,...,x_n]\) ,它是原始的和自由的 \(x_1\) ,计算因子分解 \(f\) 变成整数上的不可约数。

该过程基于王的增强扩展Zassenhaus算法。该算法通过查看 \(f\) 作为一元多项式 \(Z[x_2,...,x_n][x_1]\) ,为其计算求值映射:

x_2 -> a_2, ..., x_n -> a_n

where \(a_i\), for \(i = 2, \dots, n\), are carefully chosen integers. The mapping is used to transform \(f\) into a univariate polynomial in \(Z[x_1]\), which can be factored efficiently using Zassenhaus algorithm. The last step is to lift univariate factors to obtain true multivariate factors. For this purpose a parallel Hensel lifting procedure is used.

参数 seed 传递给_randint,可用于种子randint(当为整数时)或(出于测试目的)可以是一个数字序列。

工具书类

sympy.polys.factortools.dmp_zz_factor(f, u, K)[源代码]#

因子(非平方自由)多项式 \(Z[X]\) .

Given a multivariate polynomial \(f\) in \(Z[x]\) computes its complete factorization \(f_1, \dots, f_n\) into irreducibles over integers:

f = content(f) f_1**k_1 ... f_n**k_n

因子分解是通过将输入多项式化为一个原始无平方多项式,然后使用增强的扩展Zassenhaus(EEZ)算法进行分解。审判庭用于恢复因素的多重性。

结果以元组形式返回,该元组包含:

(content(f), [(f_1, k_1), ..., (f_n, k_n))

考虑多项式 \(f = 2*(x**2 - y**2)\) ::

>>> from sympy.polys import ring, ZZ
>>> R, x,y = ring("x,y", ZZ)

>>> R.dmp_zz_factor(2*x**2 - 2*y**2)
(2, [(x - y, 1), (x + y, 1)])

结果我们得到了以下因子分解:

f = 2 (x - y) (x + y)

工具书类

sympy.polys.factortools.dmp_ext_factor(f, u, K)[源代码]#

代数数域上的因子多元多项式。

sympy.polys.factortools.dup_gf_factor(f, K)[源代码]#

有限域上的因子一元多项式。

sympy.polys.factortools.dmp_factor_list(f, u, K0)[源代码]#

多元多项式的不可约因子 \(K[X]\) .

sympy.polys.factortools.dmp_factor_list_include(f, u, K)[源代码]#

多元多项式的不可约因子 \(K[X]\) .

sympy.polys.factortools.dmp_irreducible_p(f, u, K)[源代码]#

返回 True 如果是多元多项式 f 在它的领域内没有任何因素。

Groebner基算法#

Groebner基可以用来回答计算交换代数中的许多问题。它们的计算相当复杂,而且对性能非常敏感。我们在这里介绍各种Groebner基计算算法的低层实现;请参阅手册的前一节了解用法。

sympy.polys.groebnertools.groebner(seq, ring, method=None)[源代码]#

计算一组多项式的Groebner基 \(K[X]\) .

包装(默认)改进的Buchberger和其他计算Groebner基的算法。算法的选择可以通过 method 参数或 sympy.polys.polyconfig.setup() 在哪里 method 要么可以 buchbergerf5b .

sympy.polys.groebnertools.spoly(p1, p2, ring)[源代码]#

计算LCM(LM(p1)、LM(p2))/LM(p1) p1 - LCM(LM(p1), LM(p2))/LM(p2) p2这是S-poly,前提是p1和p2是monic

sympy.polys.groebnertools.red_groebner(G, ring)[源代码]#

计算约化Groebner基,摘自BeckerWeispfenning93,第216页

选择已生成理想的生成器子集,并为其计算约化的Groebner基。

sympy.polys.groebnertools.is_groebner(G, ring)[源代码]#

检查G是否是Groebner基。

sympy.polys.groebnertools.is_minimal(G, ring)[源代码]#

检查G是否是最小Groebner基。

sympy.polys.groebnertools.is_reduced(G, ring)[源代码]#

如果减少了EBG基础支票。

sympy.polys.fglmtools.matrix_fglm(F, ring, O_to)[源代码]#

转换约化Groebner基 F 零维理想w.r.t。 O_from 降低了Groebner基w.r.t。 O_to .

工具书类

[R801]

J、 C.Faugere,P.Gianni,D.Lazard,T.Mora(1994年)。零维Groebner基的序变换高效计算

还提供了模块的Groebner基算法:

sympy.polys.distributedmodules.sdm_spoly(f, g, O, K, phantom=None)[源代码]#

计算 fg .

地面场假定为 K ,单项式根据 O .

这是无效的,如果 fg 是零。

如果 \(f\)\(g\) 涉及不同的基本要素 \(F\) ,它们的s-poly定义为零。否则它是某种线性组合 \(f\)\(g\) 其中前导项取消。看到了吗 [SCA,定义2.3.6] 有关详细信息。

如果 phantom 不是 None ,它应该是一对模块元素,在其中执行与on相同的操作 fg . 在本例中,返回两个结果。

实例

>>> from sympy.polys.distributedmodules import sdm_spoly
>>> from sympy.polys import QQ, lex
>>> f = [((2, 1, 1), QQ(1)), ((1, 0, 1), QQ(1))]
>>> g = [((2, 3, 0), QQ(1))]
>>> h = [((1, 2, 3), QQ(1))]
>>> sdm_spoly(f, h, lex, QQ)
[]
>>> sdm_spoly(f, g, lex, QQ)
[((1, 2, 1), 1)]
sympy.polys.distributedmodules.sdm_ecart(f)[源代码]#

计算 f .

This is defined to be the difference of the total degree of \(f\) and the total degree of the leading monomial of \(f\) [SCA, defn 2.3.7].

如果f为零,则无效。

实例

>>> from sympy.polys.distributedmodules import sdm_ecart
>>> sdm_ecart([((1, 2, 3), 1), ((1, 0, 1), 1)])
0
>>> sdm_ecart([((2, 2, 1), 1), ((1, 5, 1), 1)])
3
sympy.polys.distributedmodules.sdm_nf_mora(f, G, O, K, phantom=None)[源代码]#

计算 f 关于 G 还有秩序 O .

地面场假定为 K ,单项式根据 O .

弱正规形的定义见 [SCA.2,定义3] . 它们不是独一无二的。此函数根据 \(G\) .

弱正规形最重要的性质是:如果 \(R\) 环与单项式序相关(如果序是全局的,我们只有 \(R = K[x_1, \ldots, x_n]\) ,否则是一定的本地化), \(I\) 任何理想 \(R\)\(G\) 标准基础 \(I\) ,那么对于任何人 \(f \in R\) ,我们有 \(f \in I\) 当且仅当 \(NF(f | G) = 0\) .

这是计算任意单项式弱正规形的广义Mora算法 [SCA,算法2.3.9] .

如果 phantom 不是 None ,它应该是一对“幻影”参数,对其执行与上相同的计算 fG ,然后返回两个结果。

sympy.polys.distributedmodules.sdm_groebner(G, NF, O, K, extended=False)[源代码]#

计算 G 关于秩序 O .

该算法使用正规形式 NF ,例如 sdm_nf_mora . 地面场假定为 K ,单项式根据 O .

\(N\) 表示由元素生成的子模块 \(G\) . 标准基础 \(N\) 是子集 \(S\) 属于 \(N\) ,这样 \(in(S) = in(N)\) ,对于任何子集 \(X\) 属于 \(F\)\(in(X)\) 表示由元素的初始形式生成的子模块 \(X\) . [SCA,定义2.3.2]

如果标准基的任何子集都不是标准基,则称为最小基。

有人可能会说,标准基地总是发电机组。

最低标准基数并非唯一。此算法根据 \(G\) .

如果 extended=True 计算了初始生成元到groebner基的转移矩阵。也就是说,返回一个系数向量的列表,用 G .

此函数实现“糖”策略,请参阅

Giovini等人:“一个糖立方体,请”或布氏算法中的选择策略。

选项#

选项管理器 Poly 以及公共API函数。

class sympy.polys.polyoptions.Options(gens, args, flags=None, strict=False)[源代码]#

多项式操作模块的选项管理器。

实例

>>> from sympy.polys.polyoptions import Options
>>> from sympy.polys.polyoptions import build_options
>>> from sympy.abc import x, y, z
>>> Options((x, y, z), {'domain': 'ZZ'})
{'auto': False, 'domain': ZZ, 'gens': (x, y, z)}
>>> build_options((x, y, z), {'domain': 'ZZ'})
{'auto': False, 'domain': ZZ, 'gens': (x, y, z)}

Options

  • 扩展---布尔选项

  • Gens---选项

  • Wrt---选项

  • 排序---选项

  • 订单---选项

  • 字段---布尔选项

  • 贪心---布尔选项

  • 域---选项

  • Split---布尔选项

  • 高斯---布尔选项

  • 扩展---选项

  • 模数---选项

  • 对称---布尔选项

  • Strict---boolean选项

Flags

  • Auto---布尔标志

  • Frac---布尔标志

  • 形式---布尔标志

  • Polys---布尔标志

  • Include---布尔标志

  • All---布尔标志

  • Gen---旗子

  • 系列---布尔标志

clone(updates={})[源代码]#

Clone self and update specified options.

sympy.polys.polyoptions.build_options(gens, args=None)[源代码]#

从关键字参数或。。。选项。

配置#

多项式操作算法的配置实用程序。

sympy.polys.polyconfig.setup(key, value=None)[源代码]#

将值指定给(或重置)配置项。

例外情况#

这些是多项式模块定义的例外。

TODO分类和解释

class sympy.polys.polyerrors.BasePolynomialError[源代码]#

多项式相关异常的基类。

class sympy.polys.polyerrors.ExactQuotientFailed(f, g, dom=None)[源代码]#
class sympy.polys.polyerrors.OperationNotSupported(poly, func)[源代码]#
class sympy.polys.polyerrors.HeuristicGCDFailed[源代码]#
class sympy.polys.polyerrors.HomomorphismFailed[源代码]#
class sympy.polys.polyerrors.IsomorphismFailed[源代码]#
class sympy.polys.polyerrors.ExtraneousFactors[源代码]#
class sympy.polys.polyerrors.EvaluationFailed[源代码]#
class sympy.polys.polyerrors.RefinementFailed[源代码]#
class sympy.polys.polyerrors.CoercionFailed[源代码]#
class sympy.polys.polyerrors.NotInvertible[源代码]#
class sympy.polys.polyerrors.NotReversible[源代码]#
class sympy.polys.polyerrors.NotAlgebraic[源代码]#
class sympy.polys.polyerrors.DomainError[源代码]#
class sympy.polys.polyerrors.PolynomialError[源代码]#
class sympy.polys.polyerrors.UnificationFailed[源代码]#
class sympy.polys.polyerrors.GeneratorsNeeded[源代码]#
class sympy.polys.polyerrors.ComputationFailed(func, nargs, exc)[源代码]#
class sympy.polys.polyerrors.GeneratorsError[源代码]#
class sympy.polys.polyerrors.UnivariatePolynomialError[源代码]#
class sympy.polys.polyerrors.MultivariatePolynomialError[源代码]#
class sympy.polys.polyerrors.PolificationFailed(opt, origs, exprs, seq=False)[源代码]#
class sympy.polys.polyerrors.OptionError[源代码]#
class sympy.polys.polyerrors.FlagError[源代码]#

参考文献#

模块化GCD#

sympy.polys.modulargcd.modgcd_univariate(f, g)[源代码]#

计算中两个多项式的GCD \(\mathbb{{Z}}[x]\) 使用模块化算法。

该算法计算两个一元整数多项式的GCD \(f\)\(g\) 通过计算 \(\mathbb{{Z}}_p[x]\) 合适的底漆 \(p\) 然后利用中国剩余定理重构系数。只为那些很有可能是理想的GCD的候选人进行审判。

参数:

f :多元元素

一元整多项式

g :多元元素

一元整多项式

返回:

h :多元元素

多项式的GCD \(f\)\(g\)

cff :多元元素

的辅因子 \(f\) ,即 \(\frac{{f}}{{h}}\)

cfg :多元元素

的辅因子 \(g\) ,即 \(\frac{{g}}{{h}}\)

实例

>>> from sympy.polys.modulargcd import modgcd_univariate
>>> from sympy.polys import ring, ZZ
>>> R, x = ring("x", ZZ)
>>> f = x**5 - 1
>>> g = x - 1
>>> h, cff, cfg = modgcd_univariate(f, g)
>>> h, cff, cfg
(x - 1, x**4 + x**3 + x**2 + x + 1, 1)
>>> cff * h == f
True
>>> cfg * h == g
True
>>> f = 6*x**2 - 6
>>> g = 2*x**2 + 4*x + 2
>>> h, cff, cfg = modgcd_univariate(f, g)
>>> h, cff, cfg
(2*x + 2, 3*x - 3, x + 1)
>>> cff * h == f
True
>>> cfg * h == g
True

工具书类

  1. [Monagan00]

sympy.polys.modulargcd.modgcd_bivariate(f, g)[源代码]#

计算中两个多项式的GCD \(\mathbb{{Z}}[x, y]\) 使用模块化算法。

该算法计算了两个二元整数多项式的GCD \(f\)\(g\) 通过计算 \(\mathbb{{Z}}_p[x, y]\) 合适的底漆 \(p\) 然后利用中国剩余定理重构系数。计算二元GCD \(\mathbb{{Z}}_p\) ,多项式 \(f \; \mathrm{{mod}} \, p\)\(g \; \mathrm{{mod}} \, p\) 在评估 \(y = a\) 当然 \(a \in \mathbb{{Z}}_p\) 然后他们的单变量GCD \(\mathbb{{Z}}_p[x]\) 是计算出来的。对这些进行插值可以得到 \(\mathbb{{Z}}_p[x, y]\) . 验证结果 \(\mathbb{{Z}}[x, y]\) ,试划分完成,但只适用于非常有可能达到预期GCD的候选人。

参数:

f :多元元素

二元整数多项式

g :多元元素

二元整数多项式

返回:

h :多元元素

多项式的GCD \(f\)\(g\)

cff :多元元素

的辅因子 \(f\) ,即 \(\frac{{f}}{{h}}\)

cfg :多元元素

的辅因子 \(g\) ,即 \(\frac{{g}}{{h}}\)

实例

>>> from sympy.polys.modulargcd import modgcd_bivariate
>>> from sympy.polys import ring, ZZ
>>> R, x, y = ring("x, y", ZZ)
>>> f = x**2 - y**2
>>> g = x**2 + 2*x*y + y**2
>>> h, cff, cfg = modgcd_bivariate(f, g)
>>> h, cff, cfg
(x + y, x - y, x + y)
>>> cff * h == f
True
>>> cfg * h == g
True
>>> f = x**2*y - x**2 - 4*y + 4
>>> g = x + 2
>>> h, cff, cfg = modgcd_bivariate(f, g)
>>> h, cff, cfg
(x + 2, x*y - x - 2*y + 2, 1)
>>> cff * h == f
True
>>> cfg * h == g
True

工具书类

  1. [Monagan00]

sympy.polys.modulargcd.modgcd_multivariate(f, g)[源代码]#

计算中两个多项式的GCD \(\mathbb{{Z}}[x_0, \ldots, x_{{k-1}}]\) 使用模块化算法。

该算法计算了两个多元整数多项式的GCD \(f\) and \(g\) by calculating the GCD in \(\mathbb{{Z}}_p[x_0, \ldots, x_{{k-1}}]\) for suitable primes \(p\) and then reconstructing the coefficients with the Chinese Remainder Theorem. To compute the multivariate GCD over \(\mathbb{{Z}}_p\) the recursive subroutine _ 使用modgcd多变量。验证结果 `mathbb{{Z}}[x_0, ldots, x_{{k-1}}]() ,试划分完成,但只适用于非常有可能达到预期GCD的候选人。

参数:

f :多元元素

多元整数多项式

g :多元元素

多元整数多项式

返回:

h :多元元素

多项式的GCD \(f\)\(g\)

cff :多元元素

的辅因子 \(f\) ,即 \(\frac{{f}}{{h}}\)

cfg :多元元素

的辅因子 \(g\) ,即 \(\frac{{g}}{{h}}\)

实例

>>> from sympy.polys.modulargcd import modgcd_multivariate
>>> from sympy.polys import ring, ZZ
>>> R, x, y = ring("x, y", ZZ)
>>> f = x**2 - y**2
>>> g = x**2 + 2*x*y + y**2
>>> h, cff, cfg = modgcd_multivariate(f, g)
>>> h, cff, cfg
(x + y, x - y, x + y)
>>> cff * h == f
True
>>> cfg * h == g
True
>>> R, x, y, z = ring("x, y, z", ZZ)
>>> f = x*z**2 - y*z**2
>>> g = x**2*z + z
>>> h, cff, cfg = modgcd_multivariate(f, g)
>>> h, cff, cfg
(z, x*z - y*z, x**2 + 1)
>>> cff * h == f
True
>>> cfg * h == g
True

工具书类

  1. [Monagan00]

  2. [Brown71]

sympy.polys.modulargcd._modgcd_multivariate_p(f, g, p, degbound, contbound)[源代码]#

计算中两个多项式的GCD \(\mathbb{{Z}}_p[x_0, \ldots, x_{{k-1}}]\) .

该算法通过对多项式的求值,逐步减少了问题的求解 \(f\)\(g\)\(x_{{k-1}} = a\) 适合 \(a \in \mathbb{{Z}}_p\) 然后递归地调用自身来计算 \(\mathbb{{Z}}_p[x_0, \ldots, x_{{k-2}}]\) . 如果这些递归调用对于足够的计算点成功,则 \(k\) 变量被插值,否则算法返回 None . 每次计算GCD或内容时,都会将它们的度数与边界进行比较。如果遇到大于界限的度数,则当前调用将返回 None 必须选择一个新的评价点。如果在某一点上度较小,则相应的界被更新,算法将失败。

参数:

f :多元元素

带系数的多元整数多项式 \(\mathbb{{Z}}_p\)

g :多元元素

带系数的多元整数多项式 \(\mathbb{{Z}}_p\)

p :整数

质数,模 \(f\)\(g\)

脱胶 :整数对象列表

degbound[i] is an upper bound for the degree of the GCD of \(f\) and \(g\) in the variable \(x_i\)

接触 :整数对象列表

contbound[i] 是中GCD内容程度的上界 \(\mathbb{{Z}}_p[x_i][x_0, \ldots, x_{{i-1}}]\)contbound[0] 不使用,所以可以任意选择。

返回:

h :多元元素

多项式的GCD \(f\)\(g\)None

工具书类

  1. [Monagan00]

  2. [Brown71]

sympy.polys.modulargcd.func_field_modgcd(f, g)[源代码]#

计算两个多项式的GCD \(f\)\(g\) 在里面 \(\mathbb Q(\alpha)[x_0, \ldots, x_{{n-1}}]\) 使用模块化算法。

该算法首先计算原始关联 \(\check m_{{\alpha}}(z)\) 最小多项式的 \(m_{{\alpha}}\) 在里面 \(\mathbb{{Z}}[z]\) 以及 \(f\)\(g\) 在里面 \(\mathbb{{Z}}[x_1, \ldots, x_{{n-1}}][z]/(\check m_{{\alpha}})[x_0]\) . 然后计算GCD \(\mathbb Q(x_1, \ldots, x_{{n-1}})[z]/(m_{{\alpha}}(z))[x_0]\) . 这是通过计算 \(\mathbb{{Z}}_p(x_1, \ldots, x_{{n-1}})[z]/(\check m_{{\alpha}}(z))[x_0]\) 合适的底漆 \(p\) 然后利用中国剩余定理和有理重构法对系数进行重构。GCD结束 \(\mathbb{{Z}}_p(x_1, \ldots, x_{{n-1}})[z]/(\check m_{{\alpha}}(z))[x_0]\) 是用递归子例程计算的,它计算 \(x_{{n-1}} = a\) 合适的评估点 \(a \in \mathbb Z_p\) 然后递归地调用自身,直到基域不再包含任何参数。为 \(\mathbb{{Z}}_p[z]/(\check m_{{\alpha}}(z))[x_0]\) 采用欧几里德算法。然后对这些递归调用的结果进行插值,并使用有理函数重构来获得正确的系数。结果,都在 \(\mathbb Q(x_1, \ldots, x_{{n-1}})[z]/(m_{{\alpha}}(z))[x_0]\)\(\mathbb{{Z}}_p(x_1, \ldots, x_{{n-1}})[z]/(\check m_{{\alpha}}(z))[x_0]\) ,经无分数试验部门验证。

除了上述GCD计算外,还有一些GCD \(\mathbb Q(\alpha)[x_1, \ldots, x_{{n-1}}]\) 必须进行计算,因为将多项式视为一元多项式会导致GCD的虚假内容。为了这个 func_field_modgcd 递归调用。

参数:

f, g :多元元素

多项式 \(\mathbb Q(\alpha)[x_0, \ldots, x_{{n-1}}]\)

返回:

h :多元元素

多项式的monic GCD \(f\)\(g\)

cff :多元元素

的辅因子 \(f\) ,即 \(\frac f h\)

cfg :多元元素

的辅因子 \(g\) ,即 \(\frac g h\)

实例

>>> from sympy.polys.modulargcd import func_field_modgcd
>>> from sympy.polys import AlgebraicField, QQ, ring
>>> from sympy import sqrt
>>> A = AlgebraicField(QQ, sqrt(2))
>>> R, x = ring('x', A)
>>> f = x**2 - 2
>>> g = x + sqrt(2)
>>> h, cff, cfg = func_field_modgcd(f, g)
>>> h == x + sqrt(2)
True
>>> cff * h == f
True
>>> cfg * h == g
True
>>> R, x, y = ring('x, y', A)
>>> f = x**2 + 2*sqrt(2)*x*y + 2*y**2
>>> g = x + sqrt(2)*y
>>> h, cff, cfg = func_field_modgcd(f, g)
>>> h == x + sqrt(2)*y
True
>>> cff * h == f
True
>>> cfg * h == g
True
>>> f = x + sqrt(2)*y
>>> g = x + y
>>> h, cff, cfg = func_field_modgcd(f, g)
>>> h == R.one
True
>>> cff * h == f
True
>>> cfg * h == g
True

工具书类

  1. [Hoeij04]

无证#

poly模块的许多部分仍然没有文档记录,即使在文档中也很少见。请贡献!