Simplifying expressions for use in C programs
- To: mathgroup at smc.vnet.net
- Subject: [mg22051] Simplifying expressions for use in C programs
- From: Wagner Truppel <wtruppel at uci.edu>
- Date: Fri, 11 Feb 2000 02:38:32 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
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
- Follow-Ups:
- Re: Simplifying expressions for use in C programs
- From: Wagner Truppel <wtruppel@uci.edu>
- Re: Simplifying expressions for use in C programs