计算代数软件以最小化多项式集合中的运算数量
我有一些多项式系统,这些多项式表达式比较简单,但要手动优化起来却挺麻烦的。表达式是分组的,在每组中有一些变量的公共项。
我想知道有没有像Mathematica、Matlab或sympy这样的计算机代数系统,可以优化多个有公共项的多项式,以减少运算次数。如果这个系统还能减少中间项的数量,从而减少寄存器的使用,那就更好了。
如果没有这样的系统,我打算自己做一个,使用Python的符号代数库Sympy。如果你正在开发这样的包,或者对开发或使用这样的工具感兴趣,请告诉我。
这里有一个虚构的例子
x0 = ((t - q*A)*x + B)*y
y0 = ((t - q*A)*y + B)*z
z0 = ((t - q*A)*z + B)*x
所以你显然可以把(t - qA)这个项提取出来。如果你把项的数量增加到很多,并且有各种公共项的组合,手动处理起来就会变得很困难。我手头的方程涉及多达40个项,而每组的大小大约是20。希望这能帮到你。
谢谢
4 个回答
Mathematica确实可以对你提到的多项式方程组进行各种变换,其中一些变换可以减少项的数量。不过,这是否适合你就不一定了,因为你似乎没有相关的版本可用。我想,Maple和其他大多数计算机代数系统(CAS)也差不多。
但是你提到的
减少寄存器的数量
说明你实际上是在进行一些编译时的数据流分析。你可能也想看看这个领域的相关文献。有些文献确实提到了对表达式进行类似计算机代数的变换。
你有没有考虑过 Maxima 呢?
这是一个很棒的符号计算软件,它是免费的、开源的,而且有一个活跃的社区,可以在你遇到不太明显的问题时提供很好的帮助。这个软件可以在所有三大主流操作系统上使用,并且有现成的Windows版本。
它提供了多种代数操作命令,可以用来处理表达式和方程组(就像你要处理的那样):比如展开、因式分解、简化、分式简化、线性方程求解等等。
这页内容(Maxima for Symbolic Computation)可以帮助你入门——下载、安装,提供一些例子,并指引你找到更多资源,包括快速命令参考和一些编写自己脚本的指南。
你在找的东西是sympy吗?我觉得它支持多项式,虽然我不确定它是否支持你想要的所有功能(不过,调整它来添加你觉得缺少的功能应该比从头开始自己写要简单得多;-)。