# Why won't sage (maxima) factor the symbolic expression 2*a3 - 2*a6?

Here is some sample code.

maxima_calculus('algebraic: true;')

var('a3 a6')

(2*a3 - 2*a6).factor()

Does it not bother with integer factors with linear expressions, for some reason? It seems to handle more complicated expressions well, but now I'm a bit skeptical. For example, sage factors 2*a3^2 + 4*a3*a6 + 2*a6^2 just fine.

edit retag close merge delete

Just an information: I tried with Maxima (version 19.01.2x) itself (not in SageMath) and it factorizes correctly:

Enter: factor(2 * a3 - 2 * a6);

The output is: -2*(a6-a3)

( 2020-12-03 08:46:47 +0200 )edit

Thanks for the reply! That's definitely strange. The answer below gave a few more instances of sage factoring like this.

( 2020-12-04 22:25:29 +0200 )edit

Sort by » oldest newest most voted

contemplate :

sage: maxima.factor(2*a3 - 2*a6)
-2*(_SAGE_VAR_a6-_SAGE_VAR_a3)
sage: maxima.factor(2*a3 - 2*a6).sage()
2*a3 - 2*a6


Appaeently, Sage's output algorithm chooses the sum of two monomials to the product of such a sum by another monomial. Because it is "simplet" ? And, BTW :

sage: (2*a3 - 2*a6).factor()
2*a3 - 2*a6
sage: (2*a3 - 2*a6).collect_common_factors()
2*a3 - 2*a6
sage: (2*a3 - 2*a6).maxima_methods().factor()
2*a3 - 2*a6


HTH,

more

I guess it's time to replace ".factor( with "maxima.factor(" everywhere in my code. Thanks a lot! I'm curious if this is a bug or working as intended.

( 2020-12-04 22:24:10 +0200 )edit

I guess it's time to replace ".factor( with "maxima.factor(" everywhere in my code.

Nope. Consider :

sage: var("a,b")
(a, b)
sage: a.parent()
Symbolic Ring
sage: maxima(a).parent()
Maxima
sage: maxima(a)*b
_SAGE_VAR_a*_SAGE_VAR_b
sage: (maxima(a)*b).parent()
Maxima


And there is no guarantee that you can do to a Maxima object the same things you do to a Symbolic Ring object.

( 2020-12-05 10:19:20 +0200 )edit

Sage has several ways to factor polynomial expressions.

Defined as symbolic expressions living in the symbolic ring, they factor as observed in the question.

It seems symbolic expressions in Sage are not able to hold a factor if it is a constant. As observed in the answer by @Emmanuel Charpentier, this is in contrast to Maxima.

To further illustrate that, consider the following example:

sage: a3, a6 = SR.var('a3, a6')
sage: q = (a3 - a6)
sage: p = x * q
sage: p
(a3 - a6)*x
sage: p.subs({x: 2})
2*a3 - 2*a6


There might or might not be a way to remedy that for symbolic expressions.

Defined in a polynomial ring, such expressions will factor differently though.

Define a polynomial ring over the integers:

sage: R.<a3, a6> = ZZ[]
sage: R
Multivariate Polynomial Ring in a3, a6 over Integer Ring


Define a polynomial in that ring:

sage: p = 2*a3 - 2*a6
sage: p
2*a3 - 2*a6


Factor it:

sage: p.factor()
2 * (a3 - a6)


Note that factoring in polynomials over the rationals would work differently.

more