多项式级数运算#

任何有限泰勒级数,在所有实际用途上都是多项式。该模块利用稀疏多项式的高效表示和运算,实现了快速多变量级数操作。与Symphy相比的典型加速 series 方法的范围在20-100之间,随着处理的序列越来越大,间隙会扩大。

所有函数在用户指定的环上展开任意给定的级数。因此,计算系列的系数取决于所使用的环。例如::

>>> from sympy.polys import ring, QQ, RR
>>> from sympy.polys.ring_series import rs_sin
>>> R, x, y = ring('x, y', QQ)
>>> rs_sin(x*y, x, 5)
-1/6*x**3*y**3 + x*y

QQ 代表理性领域。这里所有的系数都是有理数。建议使用 QQ 与戒指系列,因为它自动选择最快的理性类型。

类似地,如果使用实域:

>>> R, x, y = ring('x, y', RR)
>>> rs_sin(x*y, x, 5)
-0.166666666666667*x**3*y**3 + x*y

虽然多项式的定义将多项式模的使用限制在泰勒级数上,但我们将其扩展到允许Laurent甚至Puiseux级数(含分数指数):

>>> from sympy.polys.ring_series import rs_cos, rs_tan
>>> R, x, y = ring('x, y', QQ)

>>> rs_cos(x + x*y, x, 3)/x**3
-1/2*x**(-1)*y**2 - x**(-1)*y - 1/2*x**(-1) + x**(-3)

>>> rs_tan(x**QQ(2, 5)*y**QQ(1, 2), x, 2)
1/3*x**(6/5)*y**(3/2) + x**(2/5)*y**(1/2)

默认情况下, PolyElement 不允许非自然数作为指数。它将一个分数转换成整数,并在获得负指数时引发错误。目标 ring series 模块是快速的系列扩展,而不是使用 polys 模块。我们使用它作为后端的原因很简单,因为它实现了稀疏表示和我们需要的大多数基本函数。但是,这种默认行为 polys 限制了 ring series .

注意,在 polys - dict . 稀疏多项式 (PolyElement )使用Python dict逐项存储多项式项,其中指数元组是键,该项的系数是值。为什么理性中没有理性的价值观 dict 从而支持有理指数。

所以我们采取的方法是修改稀疏 polys 允许非自然指数。结果很简单。我们只需删除对 int 中的指数 __pow__ 方法 PolyElement . 所以:

>>> x**QQ(3, 4)
x**(3/4)

而不是 1 和之前一样。

虽然这个改变违反了多项式的定义,但它还没有破坏任何东西。理想情况下,我们不应该修改 polys 无论如何。但是拥有 series 我们想要的能力,没有其他简单的方法。如果需要的话,我们可以把 polys 从核心 polys . 如果能找到其他优雅的解决方案,那就太好了。

此模块的函数返回的所有系列都是 PolyElement 班级。要将它们与其他SymPy类型一起使用,请将它们转换为 Expr ::

>>> from sympy.polys.ring_series import rs_exp
>>> from sympy.abc import a, b, c
>>> series = rs_exp(x, x, 5)
>>> a + series.as_expr()
a + x**4/24 + x**3/6 + x**2/2 + x + 1

rs_series#

直接使用初等环级数函数确实可以提供更多的控制,但同时也有局限性。为所需的系列扩展创建一个适当的环,并知道调用哪个环系列函数,并不是每个人都熟悉的事情。

\(rs\_series\) 是一个接受任意 Expr 并通过调用适当的环系列函数返回其展开。返回的序列是最简单(几乎)可能的环上的多项式。它在解析给定表达式时递归地构建环,并在需要时向环中添加生成器。例如:

>>> from sympy.polys.ring_series import rs_series
>>> from sympy.functions.elementary.trigonometric import sin
>>> rs_series(sin(a + b), a, 5) 
1/24*sin(b)*a**4 - 1/2*sin(b)*a**2 + sin(b) - 1/6*cos(b)*a**3 + cos(b)*a

>>> rs_series(sin(exp(a*b) + cos(a + c)), a, 2) 
-sin(c)*cos(cos(c) + 1)*a + cos(cos(c) + 1)*a*b + sin(cos(c) + 1)

>>> rs_series(sin(a + b)*cos(a + c)*tan(a**2 + b), a, 2) 
cos(b)*cos(c)*tan(b)*a - sin(b)*sin(c)*tan(b)*a + sin(b)*cos(c)*tan(b)

它可以扩展涉及多个函数的复杂多元表达式,最重要的是,它的速度非常快:

>>> %timeit ((sin(a) + cos(a))**10).series(a, 0, 5) 
1 loops, best of 3: 1.33 s per loop

>>> %timeit rs_series((sin(a) + cos(a))**10, a, 5) 
100 loops, best of 3: 4.13 ms per loop

\(rs\_series\) 快了300多倍。给定一个要展开的表达式,解析它有一些固定的开销。因此,为了提高速度,命令变得更为突出:

>>> %timeit rs_series((sin(a) + cos(a))**10, a, 100) 
10 loops, best of 3: 32.8 ms per loop

要找出给定表达式的正确环, \(rs\_series\) 使用 sring 函数,它反过来使用 polys . 如上所述,不允许使用非自然指数。但限制是指数,而不是生成元。所以, polys 允许各种符号项作为生成器,以确保指数是自然数:

>>> from sympy.polys.rings import sring
>>> R, expr = sring(1/a**3 + a**QQ(3, 7)); R
Polynomial ring in 1/a, a**(1/7) over ZZ with lex order

在上面的例子中, \(1/a\)\(a**(1/7)\) 将被视为完全不同的原子。为了所有实际目的,我们可以 \(b = 1/a\)\(c = a**(1/7)\) 然后进行操作。实际上,表达包括 \(1/a\)\(a**(1/7)\) (以及他们的能力)永远不会简化:

>>> expr*R(1/a)
(1/a)**4 + (1/a)*(a**(1/7))**3

这导致了与前面所面临的操作Laurent和Puiseux系列类似的问题。幸运的是,这次我们有了一个优雅的解决方案,能够将 seriespolys 彼此的行为。我们引入一个布尔标志 series 在允许的列表中 Options 对于多项式(请参见 sympy.polys.polyoptions.Options ). 因此,当我们想要 sring 为了允许有理指数,我们提供一个 series=True 旗到 sring ::

>>> rs_series(sin(a**QQ(1, 3)), a, 3)
-1/5040*a**(7/3) + 1/120*a**(5/3) - 1/6*a + a**(1/3)

贡献#

\(rs\_series\) 尚未完全实施。到目前为止,它只支持包含 sincosexptan . 添加其余的功能一点也不困难,它们将逐步添加。如果您有兴趣提供帮助,请阅读 ring_series.py . 目前,它不支持Puiseux系列(尽管基本函数支持)。预计很快就会解决这个问题。

您还可以向添加更多函数 ring_series.py . 目前只支持基本函数。长期目标是取代SymPy的 series 方法与 rs_series .

参考文献#

此模块中的函数带有前缀 rs_ ,代表“戒指系列”。它们在稀疏表示中处理有限幂级数 polys.ring.ring .

初等函数

sympy.polys.ring_series.rs_log(p, x, prec)[源代码]#

的对数 pO(x**prec) .

笔记

截断 integral dx p**-1*d p/dx 使用。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_log
>>> R, x = ring('x', QQ)
>>> rs_log(1 + x, x, 8)
1/7*x**7 - 1/6*x**6 + 1/5*x**5 - 1/4*x**4 + 1/3*x**3 - 1/2*x**2 + x
>>> rs_log(x**QQ(3, 2) + 1, x, 5)
1/3*x**(9/2) - 1/2*x**3 + x**(3/2)
sympy.polys.ring_series.rs_LambertW(p, x, prec)[源代码]#

计算Lambert W函数主分支的级数展开式。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_LambertW
>>> R, x, y = ring('x, y', QQ)
>>> rs_LambertW(x + x*y, x, 3)
-x**2*y**2 - 2*x**2*y - x**2 + x*y + x

参见

LambertW

sympy.polys.ring_series.rs_exp(p, x, prec)[源代码]#

级数模的指数化 O(x**prec)

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_exp
>>> R, x = ring('x', QQ)
>>> rs_exp(x**2, x, 7)
1/6*x**6 + 1/2*x**4 + x**2 + 1
sympy.polys.ring_series.rs_atan(p, x, prec)[源代码]#

级数的反正切

返回 p ,约为0。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_atan
>>> R, x, y = ring('x, y', QQ)
>>> rs_atan(x + x*y, x, 4)
-1/3*x**3*y**3 - x**3*y**2 - x**3*y - 1/3*x**3 + x*y + x

参见

atan

sympy.polys.ring_series.rs_asin(p, x, prec)[源代码]#

级数的反正弦

返回asin的级数展开 p ,约为0。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_asin
>>> R, x, y = ring('x, y', QQ)
>>> rs_asin(x, x, 8)
5/112*x**7 + 3/40*x**5 + 1/6*x**3 + x

参见

asin

sympy.polys.ring_series.rs_tan(p, x, prec)[源代码]#

一系列的正切。

返回tan的级数展开 p ,约为0。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_tan
>>> R, x, y = ring('x, y', QQ)
>>> rs_tan(x + x*y, x, 4)
1/3*x**3*y**3 + x**3*y**2 + x**3*y + 1/3*x**3 + x*y + x

参见

_tan1, tan

sympy.polys.ring_series._tan1(p, x, prec)[源代码]#

的帮助函数 rs_tan() .

用牛顿法返回一元级数tan的级数展开式。它利用了atan的级数展开比tan容易的特点。

考虑 \(f(x) = y - \arctan(x)\) 设r是用牛顿法求出的f(x)的根。那么 \(f(r) = 0\)\(y = \arctan(x)\) 在哪里? \(x = \tan(y)\) 根据需要。

sympy.polys.ring_series.rs_cot(p, x, prec)[源代码]#

级数余切

返回cot的系列扩展 p ,约为0。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_cot
>>> R, x, y = ring('x, y', QQ)
>>> rs_cot(x, x, 6)
-2/945*x**5 - 1/45*x**3 - 1/3*x + x**(-1)

参见

cot

sympy.polys.ring_series.rs_sin(p, x, prec)[源代码]#

正弦级数

返回罪恶的级数展开 p ,约为0。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_sin
>>> R, x, y = ring('x, y', QQ)
>>> rs_sin(x + x*y, x, 4)
-1/6*x**3*y**3 - 1/2*x**3*y**2 - 1/2*x**3*y - 1/6*x**3 + x*y + x
>>> rs_sin(x**QQ(3, 2) + x*y**QQ(7, 5), x, 4)
-1/2*x**(7/2)*y**(14/5) - 1/6*x**3*y**(21/5) + x**(3/2) + x*y**(7/5)

参见

sin

sympy.polys.ring_series.rs_cos(p, x, prec)[源代码]#

级数的余弦

返回cos的级数展开 p ,约为0。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_cos
>>> R, x, y = ring('x, y', QQ)
>>> rs_cos(x + x*y, x, 4)
-1/2*x**2*y**2 - x**2*y - 1/2*x**2 + 1
>>> rs_cos(x + x*y, x, 4)/x**QQ(7, 5)
-1/2*x**(3/5)*y**2 - x**(3/5)*y - 1/2*x**(3/5) + x**(-7/5)

参见

cos

sympy.polys.ring_series.rs_cos_sin(p, x, prec)[源代码]#

返回元组 (rs_cos(p, x, prec)`, `rs_sin(p, x, prec)) .

比单独呼叫rs_cos和rs_sin快

sympy.polys.ring_series.rs_atanh(p, x, prec)[源代码]#

级数的双曲反正切

返回 p ,约为0。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_atanh
>>> R, x, y = ring('x, y', QQ)
>>> rs_atanh(x + x*y, x, 4)
1/3*x**3*y**3 + x**3*y**2 + x**3*y + 1/3*x**3 + x*y + x

参见

atanh

sympy.polys.ring_series.rs_sinh(p, x, prec)[源代码]#

双曲正弦级数

返回sinh的级数展开 p ,约为0。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_sinh
>>> R, x, y = ring('x, y', QQ)
>>> rs_sinh(x + x*y, x, 4)
1/6*x**3*y**3 + 1/2*x**3*y**2 + 1/2*x**3*y + 1/6*x**3 + x*y + x

参见

sinh

sympy.polys.ring_series.rs_cosh(p, x, prec)[源代码]#

级数的双曲余弦

返回cosh的级数展开 p ,约为0。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_cosh
>>> R, x, y = ring('x, y', QQ)
>>> rs_cosh(x + x*y, x, 4)
1/2*x**2*y**2 + x**2*y + 1/2*x**2 + 1

参见

cosh

sympy.polys.ring_series.rs_tanh(p, x, prec)[源代码]#

级数的双曲正切

返回tanh的级数展开 p ,约为0。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_tanh
>>> R, x, y = ring('x, y', QQ)
>>> rs_tanh(x + x*y, x, 4)
-1/3*x**3*y**3 - x**3*y**2 - x**3*y - 1/3*x**3 + x*y + x

参见

tanh

sympy.polys.ring_series.rs_hadamard_exp(p1, inverse=False)[源代码]#

返回 sum f_i/i!*x**isum f_i*x**i 在哪里 x 是第一个变量。

如果 invers=True 返回 sum f_i*i!*x**i

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_hadamard_exp
>>> R, x = ring('x', QQ)
>>> p = 1 + x + x**2 + x**3
>>> rs_hadamard_exp(p)
1/6*x**3 + 1/2*x**2 + x + 1

Operations

sympy.polys.ring_series.rs_mul(p1, p2, x, prec)[源代码]#

返回给定两个级数的乘积,模 O(x**prec) .

x 是序列变量或它在生成器中的位置。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_mul
>>> R, x = ring('x', QQ)
>>> p1 = x**2 + 2*x + 1
>>> p2 = x + 1
>>> rs_mul(p1, p2, x, 3)
3*x**2 + 3*x + 1
sympy.polys.ring_series.rs_square(p1, x, prec)[源代码]#

求级数模的平方 O(x**prec)

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_square
>>> R, x = ring('x', QQ)
>>> p = x**2 + 2*x + 1
>>> rs_square(p, x, 3)
6*x**2 + 4*x + 1
sympy.polys.ring_series.rs_pow(p1, n, x, prec)[源代码]#

返回 p1**nO(x**prec)

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_pow
>>> R, x = ring('x', QQ)
>>> p = x + 1
>>> rs_pow(p, 4, x, 3)
6*x**2 + 4*x + 1
sympy.polys.ring_series.rs_series_inversion(p, x, prec)[源代码]#

多元级数反演 1/pO(x**prec) .

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_series_inversion
>>> R, x, y = ring('x, y', QQ)
>>> rs_series_inversion(1 + x*y**2, x, 4)
-x**3*y**6 + x**2*y**4 - x*y**2 + 1
>>> rs_series_inversion(1 + x*y**2, y, 4)
-x*y**2 + 1
>>> rs_series_inversion(x + x**2, x, 4)
x**3 - x**2 + x - 1 + x**(-1)
sympy.polys.ring_series.rs_series_reversion(p, x, n, y)[源代码]#

一系列的逆转。

p 是一系列的 O(x**n) 形式为\(p=ax+f(x)\),其中\(a\)是与0不同的数字。

\(f(x)=\sum{k=2}^{n-1}a_kx_k\)

参数:

a_k :可以多项式依赖于其他变量,未指明。

x:名为x的变量。y:名为y的变量。

返回:

求解\(p=y\),即给定\(ax+f(x)-y=0\)

找到解\(x=r(y)\)\(O(y^n)\)

算法

如果\(r\u i\)是顺序为\(i\)的解决方案,那么:\(ar\u i+f(r_i)-y=O\左(y^{i+1}\右)\)

如果\(r{i+1}\)是顺序为\(i+1\)的解,那么:\(ar{i+1}+f(r{i+1})-y=O\左(y^{i+2}\右)\)

我们有\(r{i+1}=r\u i+e\),这样,\(ae+f(r_i)=O\左(y^{i+2}\右)\)\(e=-f(r_i)/a\)

因此,我们使用递归关系:\(r{i+1}=r}i-f(r_i)/a\),边界条件为:\(rˉ1=y\)

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_series_reversion, rs_trunc
>>> R, x, y, a, b = ring('x, y, a, b', QQ)
>>> p = x - x**2 - 2*b*x**2 + 2*a*b*x**2
>>> p1 = rs_series_reversion(p, x, 3, y); p1
-2*y**2*a*b + 2*y**2*b + y**2 + y
>>> rs_trunc(p.compose(x, p1), y, 3)
y
sympy.polys.ring_series.rs_nth_root(p, n, x, prec)[源代码]#

第n根的多元级数展开 p .

参数:

p :表达式

计算根的多项式。

n :整数

要计算的根的顺序。

x : PolyElement

prec :整数

展开级数的顺序。

笔记

The result of this function is dependent on the ring over which the polynomial has been defined. If the answer involves a root of a constant, make sure that the polynomial is over a real field. It cannot yet handle roots of symbols.

实例

>>> from sympy.polys.domains import QQ, RR
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_nth_root
>>> R, x, y = ring('x, y', QQ)
>>> rs_nth_root(1 + x + x*y, -3, x, 3)
2/9*x**2*y**2 + 4/9*x**2*y + 2/9*x**2 - 1/3*x*y - 1/3*x + 1
>>> R, x, y = ring('x, y', RR)
>>> rs_nth_root(3 + x + x*y, 3, x, 2)
0.160249952256379*x*y + 0.160249952256379*x + 1.44224957030741
sympy.polys.ring_series.rs_trunc(p1, x, prec)[源代码]#

在中截断序列 x 精确变量 prec ,即模 O(x**prec)

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_trunc
>>> R, x = ring('x', QQ)
>>> p = x**10 + x**5 + x + 1
>>> rs_trunc(p, x, 12)
x**10 + x**5 + x + 1
>>> rs_trunc(p, x, 10)
x**5 + x + 1
sympy.polys.ring_series.rs_subs(p, rules, x, prec)[源代码]#

基于中映射的截断替换 rules .

精确返回序列 prec 在发电机里 x

注意,替换不是一个接一个地完成的

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_subs
>>> R, x, y = ring('x, y', QQ)
>>> p = x**2 + y**2
>>> rs_subs(p, {x: x+ y, y: x+ 2*y}, x, 3)
2*x**2 + 6*x*y + 5*y**2
>>> (x + y)**2 + (x + 2*y)**2
2*x**2 + 6*x*y + 5*y**2

不同于

>>> rs_subs(rs_subs(p, {x: x+ y}, x, 3), {y: x+ 2*y}, x, 3)
5*x**2 + 12*x*y + 8*y**2
参数:

p : PolyElement 输入序列。

规则dict 具有替换映射。

x : PolyElement 其中要进行序列截断。

prec : Integer 截断后级数的阶数。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_subs
>>> R, x, y = ring('x, y', QQ)
>>> rs_subs(x**2+y**2, {y: (x+y)**2}, x, 3)
 6*x**2*y**2 + x**2 + 4*x*y**3 + y**4
sympy.polys.ring_series.rs_diff(p, x)[源代码]#

返回的偏导数 p 关于 x .

参数:

x : PolyElement 关于哪个 p 是有区别的。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_diff
>>> R, x, y = ring('x, y', QQ)
>>> p = x + x**2*y**3
>>> rs_diff(p, x)
2*x*y**3 + 1
sympy.polys.ring_series.rs_integrate(p, x)[源代码]#

整合 p 关于 x .

参数:

x : PolyElement 关于哪个 p 是集成的。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_integrate
>>> R, x, y = ring('x, y', QQ)
>>> p = x + x**2*y**3
>>> rs_integrate(p, x)
1/3*x**3*y**3 + 1/2*x**2
sympy.polys.ring_series.rs_newton(p, x, prec)[源代码]#

多项式的截断牛顿和的计算 p

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_newton
>>> R, x = ring('x', QQ)
>>> p = x**2 - 2
>>> rs_newton(p, x, 5)
8*x**4 + 4*x**2 + 2
sympy.polys.ring_series.rs_compose_add(p1, p2)[源代码]#

计算合成和 prod(p2(x - beta) for beta root of p1)

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_compose_add
>>> R, x = ring('x', QQ)
>>> f = x**2 - 2
>>> g = x**2 - 3
>>> rs_compose_add(f, g)
x**4 - 10*x**2 + 1

工具书类

[R823]

A、 Bostan,P.Flajolet,B.Salvy和E.Schost“两个代数数的快速计算”,研究报告4579,国家信息与自动化研究所

效用函数

sympy.polys.ring_series.rs_is_puiseux(p, x)[源代码]#

测试是否 p Puiseux系列在吗 x .

如果在中具有负幂,则引发异常 x .

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_is_puiseux
>>> R, x = ring('x', QQ)
>>> p = x**QQ(2,5) + x**QQ(2,3) + x
>>> rs_is_puiseux(p, x)
True
sympy.polys.ring_series.rs_puiseux(f, p, x, prec)[源代码]#

返回的puiseux系列 \(f(p, x, prec)\) .

功能时使用 f 仅对常规系列实现。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_puiseux, rs_exp
>>> R, x = ring('x', QQ)
>>> p = x**QQ(2,5) + x**QQ(2,3) + x
>>> rs_puiseux(rs_exp,p, x, 1)
1/2*x**(4/5) + x**(2/3) + x**(2/5) + 1
sympy.polys.ring_series.rs_puiseux2(f, p, q, x, prec)[源代码]#

返回的puiseux系列 \(f(p, q, x, prec)\) .

功能时使用 f 仅对常规系列实现。

sympy.polys.ring_series.rs_series_from_list(p, c, x, prec, concur=1)[源代码]#

返回序列 \(sum c[n]*p**n\)\(O(x**prec)\) .

它通过并发求和来减少乘法的次数。

\(ax = [1, p, p**2, .., p**(J - 1)]\) \(s = sum(c[i]*ax[i]\) for i in \(range(r, (r + 1)*J))*p**((K - 1)*J)\) with \(K >= (n + 1)/J\)

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_series_from_list, rs_trunc
>>> R, x = ring('x', QQ)
>>> p = x**2 + x + 1
>>> c = [1, 2, 3]
>>> rs_series_from_list(p, c, x, 4)
6*x**3 + 11*x**2 + 8*x + 6
>>> rs_trunc(1 + 2*p + 3*p**2, x, 4)
6*x**3 + 11*x**2 + 8*x + 6
>>> pc = R.from_list(list(reversed(c)))
>>> rs_trunc(pc.compose(x, p), x, 4)
6*x**3 + 11*x**2 + 8*x + 6
sympy.polys.ring_series.rs_fun(p, f, *args)[源代码]#

用代换法计算的多元级数的函数。

f方法名的情况用于计算 \(rs\_tan\)\(rs\_nth\_root\) 多变量序列:

\(rs\_fun(p, tan, iv, prec)\)

tan系列首先针对虚拟变量_x计算,即, \(rs\_tan(\_x, iv, prec)\) . 然后我们用p代替x,得到期望的级数

参数:

p : PolyElement 要展开的多元级数。

f\(ring\_series\) 要应用于的函数 \(p\) .

[args[-2]] : PolyElement 关于这一点,该系列将被扩展。

[args[-1]] :展开系列的必需顺序。

实例

>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import rs_fun, _tan1
>>> R, x, y = ring('x, y', QQ)
>>> p = x + x*y + x**2*y + x**3*y**2
>>> rs_fun(p, _tan1, x, 4)
1/3*x**3*y**3 + 2*x**3*y**2 + x**3*y + 1/3*x**3 + x**2*y + x*y + x
sympy.polys.ring_series.mul_xin(p, i, n)[源代码]#

返回 \(p*x_i**n\) .

\(x\_i\) 第i个变量是 p .

sympy.polys.ring_series.pow_xin(p, i, n)[源代码]#
>>> from sympy.polys.domains import QQ
>>> from sympy.polys.rings import ring
>>> from sympy.polys.ring_series import pow_xin
>>> R, x, y = ring('x, y', QQ)
>>> p = x**QQ(2,5) + x + x**QQ(2,3)
>>> index = p.ring.gens.index(x)
>>> pow_xin(p, index, 15)
x**15 + x**10 + x**6