我有一个数学表达式,我想简化它,如果它是可行的,使它具有最少的操作,因此是最快的计算。我对精度,速度都不感兴趣。我发现许多在线网站简化了数学表达,但仅用于人类可读的目的,而不是计算机。有没有算法/方法呢?
顺便说一下我的一个表达方式是:
a(a*x+b*y+c*z)+d(d*x-b*z+c*y)+z(d*y-c*x+a*z)-b(d*z-a*y+b*x)
休息是类似的。
答案 0 :(得分:1)
让我们从
开始a*(a*x+b*y+c*z)+d*(d*x-b*z+c*y)+z*(d*y-c*x+a*z)-b*(d*z-a*y+b*x)
有16次乘法和11次加法/减法。
第三个括号看起来有点奇怪,有z作为乘数,我可能在这里预期一个常数c。
如果我们扩展
a*a*x+a*b*y+a*c*z+d*d*x-d*b*z+d*c*y+z*d*y-c*x*z+a*z*z-b*d*z-a*b*y+b*b*x
最多24次乘法和11次加法/减法。
按x,y,z的幂分组
(a*a+d*d+b*b)*x-c*x*z+(a*b+d*c-a*b)*y+d*y*z+(a*c-d*b-b*d)*z+a*z*z
提供18次乘法和11次加法。我们本可以去
(a*a+d*d+b*b-c*z)*x+(a*b+d*c-a*b+d*z)*y+(a*c-d*b-b*d+a*z)*z
15次乘法和11次加法。有一些简化 当a b y取消时,有两个d b z。
(a*a+d*d+b*b-c*z)*x+(d*c+d*z)*y+(a*c-2*d*b+a*z)*z
13次乘法8次加法。
进一步分组
(a*a+d*d+b*b-c*z)*x+(c+z)*d*y+(a*(c+z)-2*d*b)*z
下降到11次乘法8次加法。有一个共同的c + z术语,所以我们可以使用一个临时变量
c_z = c+z
(a*a+d*d+b*b-c*z)*x+c_z*d*y+(a*c_z-2*d*b)*z
11次乘法和7次加法。我认为,这是你将获得的最好成绩。
首先要注意的是,这并不比初始版本好。 18个操作与27个相比,可能节省了三分之一的评估时间。您可能会发现这不是您的计划的瓶颈。
有一种名为Horner's Rule的算法可以简化多项式的评估。如果您拥有单个变量的更高权力,这往往会更好。
以上建议使用算法
所以在你的情况下,扩展给出了
a*a*x+a*b*y+a*c*z+d*d*x-d*b*z+d*c*y+z*d*y-c*x*z+a*z*z-b*d*z-a*b*y+b*b*x
取消和收集类似条款
a*a*x+a*c*z+d*d*x+d*c*y+z*d*y-c*x*z+a*z*z-2*b*d*z+b*b*x
使用
找到最常见的符号,例如x
,组
(a*a+d*d-c*z+b*b)*x+a*c*z+d*c*y+z*d*y+a*z*z-2*b*d*z
重复。常用符号为z
,
(a*a+d*d-c*z+b*b)*x+(a*c+d*y+a*z-2*b*d)*z+d*c*y
重复。这次最常见的符号是第二个括号内的a
。
(a*a+d*d-c*z+b*b)*x+((c+z)*a+d*y-2*b*d)*z+d*c*y
再次重复,这次最常见的符号为d
(a*a+d*d-c*z+b*b)*x+((c+z)*a+(y-2*b)*d)*z+d*c*y
给出11次乘法和8次加法/减法的版本。
第一个常见符号的替代方法是d
a*a*x+a*c*z+d*d*x+d*c*y+z*d*y-c*x*z+a*z*z-2*b*d*z+b*b*x
d
a*a*x+a*c*z+ (d*x+c*y+z*y-2*b*z)*d-c*x*z+a*z*z+b*b*x
X
(a*a-c*z+b*b)*x+a*c*z+ (d*x+c*y+z*y-2*b*z)*d+a*z*z
一
(a*a-c*z+b*b)*x+(c*z+z*z)*a+ (d*x+c*y+z*y-2*b*z)*d
ž
(a*a-c*z+b*b)*x+((c+z)*z)*a+ (d*x+c*y+(y-2*b)*z)*d
再一次有11次乘法和8次加法/减法的解。