Wolfram mathematica 在Mathematica中,如何简化像a==+;/-b变成a^2==b^2?

Wolfram mathematica 在Mathematica中,如何简化像a==+;/-b变成a^2==b^2?,wolfram-mathematica,simplify,Wolfram Mathematica,Simplify,在Mathematica中,如何将像a==b | | a==-b这样的表达式简化为a^2=b^2?我尝试过的每个函数(包括Reduce、Simplify和FullSimplify)都不能做到这一点 请注意,我希望它适用于任意(多项式)表达式a和b。再比如, a == b || a == -b || a == i b || a == -i b a == b || a == -b || c == d (对于虚拟的i)和 两者都应该简化为a^4==b^4 注意:解决方案应在逻辑级别工作,以免损害其

在Mathematica中,如何将像
a==b | | a==-b
这样的表达式简化为
a^2=b^2
?我尝试过的每个函数(包括Reduce、Simplify和FullSimplify)都不能做到这一点

请注意,我希望它适用于任意(多项式)表达式
a
b
。再比如,

a == b || a == -b || a == i b || a == -i b
a == b || a == -b || c == d
(对于虚拟的
i
)和

两者都应该简化为
a^4==b^4

注意:解决方案应在逻辑级别工作,以免损害其他不相关的逻辑案例。比如说,

a == b || a == -b || a == i b || a == -i b
a == b || a == -b || c == d
应该成为

a^2 == b^2 || c == d.

可以将一组可能性转换为必须等于零的乘积

expr = a == b || a == -b || a == I*b || a == -I*b;
eqn = Apply[Times, Apply[Subtract, expr, 1]] == 0

Out[30]= (a - b)*(a - I*b)*(a + I*b)*(a + b) == 0
现在简化一下

Simplify[eqn]

Out[32]= a^4 == b^4

Daniel Lichtblau

布尔表达式可以转换为代数形式,如下所示:

In[18]:= (a == b || a == -b || a == I b || a == -I b) /. {Or -> Times,
    Equal -> Subtract} // Expand

Out[18]= a^4 - b^4
编辑

为了使转换省去其他变量中的部分,可以编写
转换函数,并在
中使用Simplify

In[41]:= Clear[OrCombine];
OrCombine[Verbatim[Or][e__Equal]] := Module[{g},
  g = GatherBy[{e}, Variables[Subtract @@ #] &];
  Apply[Or, 
   Function[
     h, ((Times @@ (h /. {Equal -> Subtract})) // Expand) == 0] /@ g]
  ]

In[43]:= OrCombine[(a == b || a == -b || a == I b || a == -I b || 
   c == d)]

Out[43]= a^4 - b^4 == 0 || c - d == 0
或者:

In[40]:= Simplify[(a == b || a == -b || a == I b || a == -I b || 
   c == d), TransformationFunctions -> {Automatic, OrCombine}]

Out[40]= a^4 == b^4 || c == d

你想要的简化在数学上是错误的。在上面的示例中,我假设您想要a^2==b^2,对吗?除非绝对保证a的绝对值为1或0,否则这不是一个简化,而是一个新的表达式。尝试将
a
b
的值设为2。使用绝对值适用于实数,但在将实数扩展到复平面时则不适用。不能,因为a==+-b和a^2==b不相等。a==+-b和a^2==b^2是。@Sjoerd C.de Vries是的,谢谢你指出这点。@Woodrow Douglass我的数学有个错误。请看新版本。很好,与丹尼尔的相似,但也不同。结果不再是一个方程了,我想丹尼尔和我提供了基本相同的解决方案,独立地。在我看来,等式是通过将得到的多项式等于零来获得的。虽然这是一个完全如我所说的问题的解决方案,但该解决方案不应损害其他无关的情况。例如,
(a==b | | a==b | | a==ib | | a==ib | | c==d)/。{Or->Times,Equal->Subtract}//Expand
应该是
a^4==b^4 | | c==d
,而不是^4c-b^4c-a^4d+b^4d`。或者至少类似于
a^4==b^4 | c==d
。虽然这两个答案都很好,但我选择这个答案是正确的,因为它有一点好处,即结果仍然是一个逻辑表达式。