# How do I iterate through factors of a monomial?

I am (very naively) trying to implement a certain non-linear map of polynomial rings. I can get the monomials in a polynomial by simply iterating through a polynomial:

>>> R.<x,y,z>=QQ[]
>>> list(x*y^3 + 2*x*y)
[(1, x*y^3), (2, x*y)]


How do I now iterate through the factors of each monomial, i.e. convert x*y^3 into something like [(x, 1), (y, 3)] or even just [x, y, y, y]?

Also, what is the correct way to do the opposite conversion, i.e. [x, y, y, y] to x*y^3?

I hope you won't be offended by such newbie questions. I couldn't find this in any of the tutorials easily (did I miss the right one?) Thank you!

edit retag close merge delete

Sort by » oldest newest most voted
R.<x,y,z>=QQ[]
[u for u in factor(x*y^3)]
#[(x, 1), (y, 3)]

more

1

list(factor(x*y^3)) also works.

( 2012-06-10 19:43:42 -0600 )edit

This works, thank you!

( 2012-06-11 00:51:19 -0600 )edit

This works:

sage: (x*y^3).factor_list()
[(x, 1), (y, 3)]
sage: mul([x, y, y, y])
x*y^3


And, if you want to go from the factor list to the expression:

sage: a = (x*y^3).factor_list()
sage: mul(t^m for t, m in a)
x*y^3


Hope this helps!

more

1

I think something like mul(t^m for t,m in a) is simpler.

( 2012-06-10 08:16:53 -0600 )edit

Yes, you're right. I changed it.

( 2012-06-10 08:35:50 -0600 )edit

Thank you very much, don't know how long I'd be looking for it without your help. However, I have to do list((x*y^3).factor()). For some reason, (x*y^3).factor_list() gives an error ('sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingu\ lar' object has no attribute 'factor_list').

( 2012-06-11 00:49:41 -0600 )edit

I see it has to do with R.<x,y,z>=QQ[]. Looks like a bug.

( 2012-06-11 07:48:06 -0600 )edit