Ask Your Question

uniform way to iterate over terms of uni-/multi-variate polynomials

asked 2019-10-04 02:01:44 +0200

Max Alekseyev gravatar image

updated 2019-10-04 13:40:20 +0200

I deal with polynomials of varying number of variables, and need a uniform way to iterate over their terms. What works for multivariate polynomials does not for univariate ones, and vice versa. Is there a uniform approach here?

Is it possible to force multivariate methods work on univariate polynomials?

UPDATE. Please notice that I do not explicitly define polynomial rings, while polynomials come converted from symbolic expressions with apriori unknown number of variables. I've updated the example below to have polynomials of this kind.


sage: x,y,z = var('x,y,z')
sage: P = x + 2*y + x*y + 3
sage: P = (x + 2*y + x*y + 3).polynomial(QQ)
sage: Q = (z + 5).polynomial(QQ)
sage: for c,t in P: print c,t
1 x*y
1 x
2 y
3 1
sage: for c,t in Q: print c,t
ValueError                                Traceback (most recent call last)
<ipython-input-26-3ef1c7d76c79> in <module>()
----> 1 for c,t in Q: print c,t

ValueError: need more than 1 value to unpack
edit retag flag offensive close merge delete

1 Answer

Sort by » oldest newest most voted

answered 2019-10-04 09:00:03 +0200

rburing gravatar image

updated 2019-10-05 10:46:32 +0200

Define R2 as a multivariate polynomial ring in 1 variable:

sage: R2.<z> = PolynomialRing(QQ, 1)
sage: Q = z + 5
sage: for c,t in Q: print c,t
1 z
5 1

This ring (and its elements) will have different methods than the ordinary univariate ring (elements).

Alternatively: keep your original ring, define R3 = PolynomialRing(QQ, 1, name='z') and use R3(Q).

An answer to the new question:

def to_multivariate_poly(expr, base_ring):
    vars = expr.variables()
    if len(vars) == 0:
        vars = ['x']
    R = PolynomialRing(base_ring, len(vars), names=vars)
    return R(expr)

Then you can do:

sage: x,y,z = var('x,y,z')
sage: P = to_multivariate_poly(x + 2*y + x*y + 3, QQ)
sage: for c,t in P: print c,t
1 x*y
1 x
2 y
3 1
sage: Q = to_multivariate_poly(z + 5, QQ)
sage: for c,t in Q: print c,t
1 z
5 1
edit flag offensive delete link more


Thanks, but I don't explicitly define rings (in contrast to the example). Polynomials come converted from symbolic expressions. Say, if we have a polynomial $f$, how to convert it to multivariate-polynomial type? (even if it depends on a single variable or is a constant)

Max Alekseyev gravatar imageMax Alekseyev ( 2019-10-04 10:37:35 +0200 )edit

It's not very nice to change your question when it has received a correct answer, even if you suffered from the XY problem. Anyway, I updated the answer. In the future, please ask the new question separately (and link to the previous question).

rburing gravatar imagerburing ( 2019-10-05 10:49:37 +0200 )edit

I did not change the question - I just clarified it. In either case thanks for both answers.

Max Alekseyev gravatar imageMax Alekseyev ( 2019-10-05 13:45:43 +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

1 follower


Asked: 2019-10-04 02:01:44 +0200

Seen: 338 times

Last updated: Oct 05 '19