将有限的Laurent级数(Laurent多项式)表示为字典

时间:2018-11-07 15:27:54

标签: python sympy polynomials

假设您有一个多元多项式表达式,并且希望通过每个单项式的次数和系数将其表征为字典。

示例:

p=Poly(3*x1**2 -  x1*x2 + 5*x2 +7)

您要

dic={"(2,0)":3 , "(1,1)":-1 , "(0,1)": 5 , "(0,0)": 7}

p.as_dict()很好地解决了这个问题。

现在,您遇到了同样的问题,但是现在多元多项式表达式允许使用负指数(有限的Laurent级数)。

所以,如果您有:

p=Poly(3*x1**-2 -  x1*x2 + 5*x2)

p.as_dict()将打印:

{(0, 0, 2): 3, (0, 1, 0): 5, (1, 1, 0): -1}

但是,我想要这个:

{(-2, 0): 3, (0, 1): 5, (1, 1): -1}

我怎样才能优雅地做到这一点?

1 个答案:

答案 0 :(得分:0)

将表达式乘以每个变量的足够大的幂以使其成为实际的多项式似乎是最容易的。将其转换为字典,然后减去乘以的幂。设置:

x1, x2 = symbols('x1 x2')
syms = (x1, x2)    #  specify the desired order of symbols: do not rely on default order being what you want
expr = 3*x1**(-2) - x1*x2 + 5*x2  # just an expression so far, not a polynomial

主要代码:

d = max(Poly(expr).degree_list())
prelim = Poly(expr*prod([x**d for x in syms]), syms).as_dict()
final = {tuple(deg - d for deg in key): prelim[key] for key in prelim}

说明:Poly(expr)在变量x1,x2、1 / x1中创建多项式。通过让 d是每个变量的最大次数,可以确保x1**d * x2**d * expr不会具有负幂。该产品在(x1, x2)中被制成多项式,并转换为“初步”字典:{(0, 2): 3, (2, 3): 5, (3, 3): -1}。然后,通过在各处减去d来调整字典。最终结果:

{(-2, 0): 3, (0, 1): 5, (1, 1): -1}