# [Maxima] How to prevent evaluation.

Richard Hennessy rich.hennessy at verizon.net
Mon Dec 28 15:33:28 CST 2009

```Quoting helps as Barton said but the fastest way is to use if instead of %if.  I am trying to make piecewise evaluate
faster.  Consider this.

(%i29) %if(i>0, 'expand((x-a)^100), 'expand((x-b)^100));
Evaluation took 0.0000 seconds (0.0000 elapsed)
100                 100
(out29)                                                       %if(i > 0, expand((x - a)   ), expand((x - b)   ))
(%i30) for i:-2000 thru 2000 do ev(%,nouns);
Evaluation took 25.8900 seconds (25.8900 elapsed)
(out30)                                                                              done
(%i31) piecewise([minf, expand((x-b)^100), 0, expand((x-a)^100), inf],i)\$
Evaluation took 0.0100 seconds (0.0100 elapsed)
(%i32) for i:-2000 thru 2000 do ev(%,nouns);
Evaluation took 41.0300 seconds (41.0300 elapsed)
(out32)                                                                              done
(%i33) if i>0 then expand((x-a)^100) else expand((x-b)^100);
Evaluation took 0.0000 seconds (0.0000 elapsed)
100                     100
(out33)                                                    if i > 0 then expand((x - a)   ) else expand((x - b)   )
(%i34) for i:-2000 thru 2000 do ev(%,nouns);
Evaluation took 12.8700 seconds (12.8700 elapsed)
(out34)                                                                              done

The last way is the fastest.  What I think I need to do is dynamically generate an if then else statement as the output
from piecewise().  I am not at all clear on how to do that.

Rich

From: Stavros Macrakis
Sent: Monday, December 28, 2009 10:15 AM
To: Richard Hennessy
Cc: Maxima List
Subject: Re: [Maxima] How to prevent evaluation.

What are you trying to do and why are you using %if rather than if?

These days, regular 'if' returns an expression if the condition cannot be evaluated, e.g.

(%i2) if a>0 then 1 else 0;
(%o2)                        if a > 0 then 1 else 0

-s

On Sun, Dec 27, 2009 at 5:16 PM, Richard Hennessy <rich.hennessy at verizon.net> wrote:

I tried this to see the timing information.

(%i3) showtime:true;
Evaluation took 0.0000 seconds (0.0000 elapsed)
(out3)
(%i4) for i : 1 thru 2000 do %if(i>0, expand((x-y)^100), expand((x-y)^100));
Evaluation took 13.0200 seconds (13.0200 elapsed)
(out4) done...

It seems like in the %if function both the then part and the else part are always expanded even when only one needs
to be evaluated.  Is there a way to stop evaluation of both parts?  This would make possible major speed improvements
dealing with large expressions.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.math.utexas.edu/pipermail/maxima/attachments/20091228/e4fbd95e/attachment.htm
```