重新定义Mathematica中的非交换乘法

Can*_*ath 7 wolfram-mathematica

Mathematicas NonCommutativeMultiply(**)不简化术语

a**0=0**a=0  
a**1=1**a=a  
Run Code Online (Sandbox Code Playgroud)

要么

a**a=a^2.  
Run Code Online (Sandbox Code Playgroud)

我想重新定义**这样做.我正在使用NCAlgebra来做这个,但我需要ReplaceRepeated(//.)和NCAlgebra,正如他们的文档所说,在mathematica中特别打破了这个功能.

有些人可以告诉我如何清除属性**并重新定义这个乘法做正常做的事情加上处理1和0.我真的不需要乘法来处理a**a,但如果它足够简单会很好.我需要**处理的主要问题是1和0.

Sim*_*mon 7

下面只有在你删除NonCommutativeMultiply的Flat属性时才有效 (这是我在测试过程中误做的事情......一个新手的错误!)

最简单的事情是

Unprotect[NonCommutativeMultiply];
NonCommutativeMultiply[a___, 1, b___] := a ** b
NonCommutativeMultiply[___, 0, ___] := 0
NonCommutativeMultiply[a_] := a
Protect[NonCommutativeMultiply];
Run Code Online (Sandbox Code Playgroud)

需要最终表达式,以便a**1简化a而不是NonCommutativeMultiply[a].您可能还需要NonCommutativeMultiply[]:=1这样的表达式,如1**1正确简化(*).所有这一切的唯一问题是,对于大型表达式,模式会针对所有内容进行检查,这会非常慢.

以上对0和1的两个定义可以组合并推广到

NonCommutativeMultiply[a___, n_?NumericQ, b___] := n a ** b
Run Code Online (Sandbox Code Playgroud)

这会影响表达式中的任何数字术语.但是这会在大型表达式中减慢甚至更多,因为每个术语都会被检查以查看它的数字.

为了简化你的a**a需要a^2,你需要类似的东西

NonCommutativeMultiply[a___, b_, b_, c___] := a ** b^2 ** c
Run Code Online (Sandbox Code Playgroud)

或更一般地说

NonCommutativeMultiply[a___, b_^n_., b_^m_., c___] := a ** b^(n + m) ** c
Run Code Online (Sandbox Code Playgroud)

(*)请注意,这只是因为Mathematica的默认顺序DownValues在这种情况下不一定是最好的.更改顺序,以便NonCommutativeMultiply[a_]到来之前a___ ** n_?NumericQ ** b___NonCommutativeMultiply[]不会受规则生成,你就不会需要一个最后的模式(除非你产生NonCommutativeMultiply[]一些其他的方式).