On Apr 16, 2011, at 11:18 AM, Mateusz Paprocki wrote: > Hi, > > On 16 April 2011 18:47, refp16 <[email protected]> wrote: > How do I extract the nth term of an expanded polynomial that is > ordered in a particular way (increasing exponents)? > > For example, from: > > 1 + x**3 + 2*x**9 + 2*x**12 + 3*x**27 + 3*x**30 + 6*x**36 + 6*x**39 > > I want the 7th term. > > I have tried args but this gives me a tuple that is not ordered in the > same way as its polynomial: > > (1, 2*x**12, 3*x**30, 6*x**36, 3*x**27, x**3, 6*x**39, 2*x**9) > > My polynomial is type <class 'sympy.core.add.Add'> and I built it > using the following code: > > from sympy import * > x,y,z = symbols('xyz') > > aux = 1 + x**3 > for n in range(2, 4): > baseTerm = 1 + n*x**3**n > aux = aux * baseTerm > auxex = aux.expand() > print auxex > > I also tried methods of the Poly class, but I believe they don´t work > precisely because my polynomial is not a Poly object. Would one way be > converting to Poly and then using those methods? How would I convert? > > I will assume you use SymPy 0.6.7 (the procedure will be a little different > for development version of SymPy). You can extract terms of polynomials in > two ways: > > In [1]: aux = 1 + x**3 > > In [2]: for n in range(2, 4): > ...: baseTerm = 1 + n*x**3**n > ...: aux = aux * baseTerm > ...: > ...: > > In [3]: f = aux.expand() > > In [4]: f > Out[4]: > 3 9 12 27 30 36 39 > 1 + x + 2⋅x + 2⋅x + 3⋅x + 3⋅x + 6⋅x + 6⋅x > > Either using coeff() method from Basic: > > In [5]: f.coeff(x**12) > Out[5]: 2 > > In [6]: f.coeff(x**15) # this returns None, not 0 > > or convert `f` to an instance of Poly class and also use coeff(): > > In [7]: g = Poly(f, x) > > In [8]: g.coeff(12) > Out[8]: 2 > > In [9]: g.coeff(15) # now this is really zero > Out[9]: 0
This works only if you know the power of the polynomial you want. Strictly speaking, the way to get the nth term in the order that the expression is printed is to do something like In [285]: sorted(auxex.args, cmp=Basic.compare_pretty)[6] Out[285]: 36 6⋅x If you're using Poly, this is easier In [290]: Poly(auxex).terms()[-7] Out[290]: ((36,), 6) > > > The latter code takes me to another question: Sum is the sum operator, > but don´t we have a product operator? > > There are both: > > In [1]: sum(k, (k, 1, n)) > Out[1]: > 2 > n n > ─ + ── > 2 2 > > In [2]: product(k, (k, 1, n)) > Out[2]: n! > > In [3]: sum(k, (k, 1, 10)) > Out[3]: 55 > > In [4]: product(k, (k, 1, 10)) > Out[4]: 3628800 > > However, if you have to add or multiply elements of an iterable container, > then it may be simpler (and much faster) to appropriate constructors directly: > > In [5]: Add(x, y, z) > Out[5]: x + y + z > > In [6]: Mul(x, y, z) > Out[6]: x⋅y⋅z If you have these in a list, you should do it like In [291]: a = [x, y, z] In [292]: Add(*a) Out[292]: x + y + z In [293]: Mul(*a) Out[293]: x⋅y⋅z Aaron Meurer > > > Thank you. > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/sympy?hl=en. > > > Mateusz > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/sympy?hl=en. -- You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/sympy?hl=en.
