Ask Your Question
0

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

asked 2019-10-03 19:01:44 -0500

Max Alekseyev gravatar image

updated 2019-10-04 06:40:20 -0500

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.

Example:

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
1

answered 2019-10-04 02:00:03 -0500

rburing gravatar image

updated 2019-10-05 03:46:32 -0500

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

Comments

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 03:37:35 -0500 )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 03:49:37 -0500 )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 06:45:43 -0500 )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

Stats

Asked: 2019-10-03 19:01:44 -0500

Seen: 44 times

Last updated: Oct 05