On Thu, Sep 27, 2012 at 7:16 PM, Aaron Meurer <[email protected]> wrote: > On Thu, Sep 27, 2012 at 6:02 PM, Geoffrey Irving <[email protected]> wrote: >> On Wed, Sep 26, 2012 at 10:29 PM, Aaron Meurer <[email protected]> wrote: >>> On Wed, Sep 26, 2012 at 10:44 PM, Geoffrey Irving <[email protected]> wrote: >>>> Hello, >>>> >>>> I am porting some code over from Sage, and am wondering if it's >>>> possible to reproduce Sage's nested algebra constructions. >>>> Specifically, in Sage you can do something like >>>> >>>> R = SR['x','y','z'] >>>> >>>> which creates a multivariate polynomial with three unknowns where the >>>> coefficients are themselves symbolic expressions (elements of the >>>> symbolic ring SR). Since R is a polynomial ring, there are various >>>> ways to extract and manipulate the set of monomials and coefficients >>>> which preserve the structure of the symbolic coefficient expressions, >>>> which I am using for code generation purposes: >>>> https://github.com/otherlab/simplicity. >>>> >>>> Is there a way to do this kind of nested algebra in sympy? >>> >>> Yes, you can do this and a lot more using the polys module. For example: >>> >>> In [5]: Poly(x**2 + y*z + 2*t, t, domain=ZZ[x, y, z]) >>> Out[5]: Poly(2*t + x**2 + y*z, t, domain='ZZ[x,y,z]') >>> >>> Here I have created a polynomial in the variable t, with coefficients >>> from ZZ[x, y, z] (ZZ means the integers). >>> >>> You can also use QQ (rationals), RR (floating point reals, though note >>> that this doesn't always work at the moment), and EX, which is a >>> generic domain that allows arbitrary coefficients. If you don't >>> choose one, it is generated automatically. You can also create >>> polynomials in terms of functions like sin(x). For example of EX: >>> >>> In [9]: Poly(x**2 + y*z + 2*sin(x)*t, t, domain=EX) >>> Out[9]: Poly(2*sin(x)*t + x**2 + y*z, t, domain='EX') >>> >>> Note that in this case, and in the case where one of the variables is >>> a function, Poly does not know about any algebraic relationships in >>> the variables, so you may get wrong results. >>> >>> I hope that answers your question. >> >> That's exactly what I wanted. Thanks! >> >>>> Another question: if I know that two symbolic expression are >>>> polynomials, will expand() produce results that are always safely >>>> hashable for use in dictionaries? If not, is there some other way to >>>> convert a general symbolic expression into something that can safely >>>> be compared for equality and hashed? >>> >>> All SymPy expressions are hashable. This includes the regular >>> expressions and instances of Poly. The only exception is Matrix, which >>> is mutable by default (but we do have an ImmutableMatrix suitable for >>> hashing). >>> >>> Note that if you are interested in mathematical equality, == and hash >>> only compare structural information. So for example, (x + y)**2 == >>> x**2 + 2*x*y + y**2 will come out as False. If you are interested in >>> mathematical equality, either use Poly (if you are only dealing with >>> polynomials), which will canonicalize things, or subtract one >>> expression from another and try to simplify it to zero. >> >> Yep, Poly((x+y)**2) seems to do what I need. >> >> One more presumably easy question: how do I get an ordered list of the >> variables in a multivariate polynomial? p.terms() gives me a list of >> (powers,coefficient) pairs, but I don't know how to interpret the >> powers without the ordering of the variables. I checked through the >> tab completed list but only found p.atoms(), which returns an >> unordered set. > > atoms wouldn't give what you want anyway (atoms(Symbol) gives all > Symbol objects in the expression, and there may be Symbols that are > not generators and there may be generators that are not Symbols). > > What you want is Poly.gens.
Perfect. Thanks again! Geoffrey -- 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.
