Re: Simplifying expressions for use in C programs
- To: mathgroup at smc.vnet.net
- Subject: [mg22073] Re: Simplifying expressions for use in C programs
- From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
- Date: Sat, 12 Feb 2000 04:04:31 -0500 (EST)
- Organization: Universitaet Leipzig
- References: <880g01$4sk@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hi, it does not exatly what you need but: http://www.mathsource.com/Content/Enhancements/Language/0205-939 For your polynoms Hoerner[] may give better results. Regards Jens Wagner Truppel wrote: > > Hi, > > I'm currently working with very large expressions that are going to > be hard-coded in a C program, and I'd like to pre-process them using > Mathematica so as to accomplish the following tasks: > > - minimize the number of multiplications > - re-define common sub-expressions as new variables > > For instance, if > > d = - x * z^2 * y^2 - (z^5 - x * y^2)*y^3 + (x^3 - y^5)^2 + (z^5 - x * y^2)^3 > > which is much much simpler than the simplest expression I actually > have to deal with, I'd like to have Mathematica pre-process it and > output something like this (sans the comments, added here to clarify > my notation for powers): > > x3 = x * x * x; > > y2 = y * y; > y3 = y * y2; > y5 = y2 * y3; > > z2 = z * z; > z5 = z * z2 * z2; > > aux1 = (x^3 - y^5); > aux1p2 = aux1 * aux1; /* p2 stands for power 2 */ > > aux2 = (z^5 - x * y^2); > aux2p3 = aux2 * aux2 * aux2; /* p3 stands for power 3 */ > > d = - x + z2 + y2 - aux2 * y3 + aux1p2 + aux2p3; > > (variable type declarations can easily be added, of course) > > Naturally, I'd start with calling Simplify[], whose default behavior > tries to minimize the number of terms in the input expression. > Figuring out all the powers appearing in the expression doesn't seem > hard (something like Cases[d, _^_, {0,Infinity}] ought to do it), and > figuring out how to break those powers in a way that minimizes the > number of multiplications also isn't too difficult. > > For instance, since x already appears in d, but x^2 does not, x3 is > defined as x*x*x rather than x*x2, which would require another > variable to be defined (although the number of multiplications > remains two in both cases, since x2 = x*x). Similarly, since y3 has > to be defined anyway, y5 can be defined as y2*y3, but z5 = z*z2*z2 > since z2 does not have to be defined. I've already written a function > to break powers in this fashion: given a list of positive integers, > choose one at a time and try to write it as the sum of either a pair > or a triplet of the smaller ones. If such pair or triplet cannot be > found for a given number, insert half the troubled number (or both > the Ceiling[] and the Floor[] of half of the number, if it's odd) > into the list and start all over again, with the larger list. > > My biggest problem is actually recognizing sub-expressions that > appear frequently. Performing that simplification would save a > substantial amount of computation given the expressions I'm dealing > with. > > I'm wondering if anyone has had to do things like these or if there > are already Mathematica notebooks freely available that can perform > this sort of pre-processing. > > Thanks for any and all help. > Wagner Truppel > wtruppel at uci.edu