login  home  contents  what's new  discussion  bug reports     help  links  subscribe  changes  refresh  edit

One of the most frustrating things as a novice axiom user is to try to figure out how to get FriCAS output to appear in the desired form. For instance:

(a + b)/2

\label{eq1}{{1 \over 2}\  b}+{{1 \over 2}\  a}(1)
Type: Polynomial(Fraction(Integer))

but if one wanted it formatted as a single fraction

(a + b)/2 :: FRAC POLY INT

\label{eq2}{b + a}\over 2(2)
Type: Fraction(Polynomial(Integer))

However, this doesn't always work:

1/2 - exp(-t)

\label{eq3}{-{2 \ {{e}^{- t}}}+ 1}\over 2(3)
Type: Expression(Integer)

but if one wanted the output to appear as:

\frac{1}{2} + e^{(-t)}

1/2 - exp(-t) :: POLY FRAC Integer
Cannot convert the value from type Expression(Integer) to Polynomial (Fraction(Integer)) .

this doesn't work. So how does one deal with output formatting for Expression Integers?

In this particular case you have to say

1/2 - exp(-t) :: EXPR FRAC INT

\label{eq5}-{{e}^{- t}}+{1 \over 2}(5)
Type: Expression(Fraction(Integer))

since you have an expression here, not a polynomial.

In general, to modify the way FriCAS outputs your expressions, you have to write a wrapper domain that replaces coerce: % -> OutputForm with your own code. This is not difficult, I have done this to convince FriCAS to output expressions in distributed form.

Here are some more detailed explanations:

How can I affect the way FriCAS displays its results?

Whenever FriCAS needs to write an element of a domain, i.e., an expression from Expression Integer, a number from PrimeField 5, a factored polynomial from Factored Polynomial Fraction Integer, etc., to the screen, it calls the operation with the signature coerce: % -> OutputForm from that domain.

For example, to output a polynomial in factored form, the "real" way to do it is to coerce it into the domain Factored Polynomial Integer:


Type: Polynomial(Integer)
(x^2-y^2)::Factored Polynomial Integer

\label{eq7}-{{\left(y - x \right)}\ {\left(y + x \right)}}(7)
Type: Factored(Polynomial(Integer))

Thus, philosophically, the way things are output depends only on the domain, and if we want to implement a different way, we need to implement a new domain. This is very easy, see DistributedExpression.

How does this work in Polynomial Integer, Expression Integer?

The domain EXPR INT contains expressions in the form p/q where p and q are polynomials -- with the variables being the "kernels" -- and the polynomials are displayed in the same form as in POLY INT, which is unfortunately slightly confusing. Roughly: "larger" variables are factored out:


\label{eq8}{a \  z}+ a(8)
Type: Polynomial(Integer)

\label{eq9}{\left(a + 1 \right)}\  z(9)
Type: Polynomial(Integer)

since "z" is "larger" than "a". Of course, "larger" is simply a rather arbitrary, but fortunately fixed internal order of the variables. For Expressions, this order is not even fixed (but you can see difference only in some large, tricky cases).

Can I make FriCAS display (xy+x+1)/(y+1) as x+1/(y+1)?

As follows from the above, this currently cannot be done within the domain EXPR INT. However, one can avoid combining subexpression with surrounding terms using box operator:


\label{eq10}{\left({1 \over{y + 1}}\right)}+ x(10)
Type: Expression(Integer)

Similarly, one can use paren operator to present expressions in factored form:

paren(exp(x) - x)*paren(exp(x) + x)

\label{eq11}{\left({{e}^{x}}- x \right)}\ {\left({{e}^{x}}+ x \right)}(11)
Type: Expression(Integer)

Note that box and paren inhibit normal simplification, so

paren(x) - x

\label{eq12}{\left(x \right)}- x(12)
Type: Expression(Integer)

will not simplify to 0. One needs to use distribute to cancel effect of box or 'paren':

distribute(paren(x) - x)

Type: Expression(Integer)

I think that there are several possibilities, which I will explain on an old example, the problem of displaying expressions in "fully expanded" form:

  • one can write a domain which only overrides the output functionality, and applies the simplifications every time the element is written on the screen. That's what I have done for DistributedExpression. This is the quick and dirty way.
  • one writes a new domain with a new representation. For DistributedExpression I failed to do so, since the proper representation would be DMP, but this only accepts a List Symbol as variables, for expressions I need to allow an arbitrary OrderedSet however.
  • one abstracts the form and writes a new functor, as for example Factored. I'm not quite sure, but it may be that a functor Distributed would be the best solution. I would have to look why the original developers chose to implement DistributedMultivariatePolynomials instead.

So, the conclusion is that you might want to write a function first that takes - for example - an expression and returns a list of expressions. It would be easy to make this into a new domain "MyExpression?". I vaguely recall that Maxima has such a function.

  Subject:   Be Bold !!
  ( 12 subscribers )  
Please rate this page: