Ask Your Question

How do I Pass a tuple as an argument for a multivariate polynomial?

asked 2010-08-30 03:57:29 +0200

allmar gravatar image

updated 2011-04-28 16:48:21 +0200

Kelvin Li gravatar image

I can't find any support documentation on this, but I'm sure it must be possible. To give some context, I'm working on a module for invariant theory which allows for computing matrices acting on polynomials:

Say I define a polynomial h(x1,x2) = a*x1^2 + b*x1x2 + c*x2^2 in QQ[x1,x2], and an ordered pair (2-tuple) v = (x1,-x2). How do I pass v such that h(v) is h(x1,-x2) ? In other words, I want to assign each coordinate of the tuple v to it's corresponding coordinate of the argument of h. Actually, a generalization to a polynomial in n variables which takes an n-tuple as an argument would be the most helpful. Below is the error that I received when trying to do this:

TypeError                                 Traceback (most recent call last)

/home/martin/Sage/sage-4.5.2/<ipython console> in <module>()

/home/martin/Sage/sage-4.5.2/local/lib/python2.6/site-packages/sage/symbolic/ in sage.symbolic.expression.Expression.__call__ (sage/symbolic/expression.cpp:15476)()

/home/martin/Sage/sage-4.5.2/local/lib/python2.6/site-packages/sage/symbolic/callable.pyc in _call_element_(self, _the_element, *args, **kwds)

449         d = dict(zip(map(repr, self.arguments()), args))

450         d.update(kwds)

--> 451         return SR(_the_element.substitute(**d))

/home/martin/Sage/sage-4.5.2/local/lib/python2.6/site-packages/sage/symbolic/ in sage.symbolic.expression.Expression.substitute (sage/symbolic/expression.cpp:14850)()

/home/martin/Sage/sage-4.5.2/local/lib/python2.6/site-packages/sage/symbolic/ in sage.symbolic.expression.Expression.coerce_in (sage/symbolic/expression.cpp:10193)()

/home/martin/Sage/sage-4.5.2/local/lib/python2.6/site-packages/sage/structure/ in sage.structure.parent_old.Parent._coerce_ (sage/structure/parent_old.c:3288)()

/home/martin/Sage/sage-4.5.2/local/lib/python2.6/site-packages/sage/structure/ in sage.structure.parent.Parent.coerce (sage/structure/parent.c:7045)()

TypeError: no canonical coercion from Ambient free module of rank 2 over the integral domain Multivariate Polynomial Ring in x1, x2 over Rational Field to Callable function ring with arguments (x1, x2)
edit retag flag offensive close merge delete


you can put <pre> ... </pre> around the code block to make it more readable (prevent markdown formatting)

niles gravatar imageniles ( 2010-08-30 08:58:48 +0200 )edit

the same effect has selecting a block of text and clicking the editor button with zeroes and ones.

Evgeny gravatar imageEvgeny ( 2010-08-30 14:17:31 +0200 )edit

if you select a span of text and click "code formatting" button - the selection will be "backticked" and as a result displayed with a fixed width font.

Evgeny gravatar imageEvgeny ( 2010-08-30 14:18:40 +0200 )edit

1 Answer

Sort by ยป oldest newest most voted

answered 2010-08-30 04:36:36 +0200

vdelecroix gravatar image

updated 2010-08-30 04:37:17 +0200


Here is a possibility

sage: R.<a,b> = PolynomialRing(QQ,['a','b'])
sage: R
Multivariate Polynomial Ring in a, b over Rational Field
sage: P = a^3*b^5+3*a^2+2*b^4
sage: P
sage: P(5,6)   # standard way
sage: P(a=5,b=6)  # another one
sage: v = (5,6)
sage: P(*v)   # the * operator unfold a tuple as 5,6
sage: d = {'a': 5, 'b': 6}
sage: P(**v)  # the ** operator unfold a dictionary as a=5,b=6

But if v is a vector and not a tuple the trick won't work.

Hoping this would be useful, Vincent

edit flag offensive delete link more


And for the many-variable case, you can use `d = dict(zip(R.gens(),v))` and `h.subs(d)` (I think the post above forgot to mention this last part). If v really has to be a vector, you could probably convert it to a tuple or list first.

niles gravatar imageniles ( 2010-08-30 08:54:55 +0200 )edit

Niles: for me P.subs(a=5,b=6) does not work for an element of a polynomial ring (but does for symbolic expressions).

vdelecroix gravatar imagevdelecroix ( 2010-08-30 09:26:32 +0200 )edit

Digression: flatten() is useful in related use-cases. The max_level keyword argument is very useful when there is multiple nesting.

ccanonc gravatar imageccanonc ( 2010-08-30 14:15:05 +0200 )edit

vdelecroix: I think you have to pass the dictionary object to `subs()`

niles gravatar imageniles ( 2010-08-30 16:11:43 +0200 )edit

What about the efficiency of each/any of the above methods? In particular, is unpacking the dictionary quicker than unpacking the list?

tdstephens3 gravatar imagetdstephens3 ( 2011-06-14 17:16:16 +0200 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools


Asked: 2010-08-30 03:57:29 +0200

Seen: 1,784 times

Last updated: Aug 30 '10