У меня есть несколько выражений, которые я сгенерировал в Mathematica, которые я хотел бы экспортировать в исходный код внешней C-программы. "CForm" почти делает то, что я хочу, за исключением того, что возведение в степень выражается в виде вызовов Power(). Мои выражения включают только малые полномочия, поэтому я бы предпочел, чтобы выражение в C использовало встроенное умножение, а не вызов Power().
Например, CForm[2 hgt^2 k1inv^3 mx0 wid^2 + hgt^2 k1inv^3 wid^3] дает
2*Power(hgt,2)*Power(k1inv,3)*mx0*Power(wid,2) +
Power(hgt,2)*Power(k1inv,3)*Power(wid,3)
.. тогда как я хотел бы сгенерировать:
2*hgt*hgt*k1inv*k1inv*k1inv*mx0*wid*wid +
hgt*hgt*k1inv*k1inv*k1inv*wid*wid*wid
Мои первоначальные попытки выделить внутренние части Power[..] выражения и переназначить его на умножение с помощью x_Symbol^y_Integer /; y > 1 :> Fold[Times, 1, Table[#1, {#2}]] были заглушены математикой, немедленно конвертировав мои тщательно сгенерированные подвыражения a*a*a обратно в Power[a,3]; -) Я знаю, что это только пытается помочь, но я не могу понять, как попросить его остановиться, в этом случае...
Как я написал этот вопрос, мне пришло в голову, что я могу записать вывод CForm в строку, а затем выполнить сопоставление строк и манипуляции с ним, но это хороший способ пойти? Я думаю, что я предпочитаю работать над этим как выражение Mathematica, поскольку я делаю свое переназначение, а затем выводю.?