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.
在这篇文章中一些非常友善的 stackoverflow 贡献者的帮助下,我NonCommutativeMultiply (**)在 Mathematica 中 得到了以下新定义:
Unprotect[NonCommutativeMultiply];
ClearAll[NonCommutativeMultiply]
NonCommutativeMultiply[] := 1
NonCommutativeMultiply[___, 0, ___] := 0
NonCommutativeMultiply[a___, 1, b___] := a ** b
NonCommutativeMultiply[a___, i_Integer, b___] := i*a ** b
NonCommutativeMultiply[a_] := a
c___ ** Subscript[a_, i_] ** Subscript[b_, j_] ** d___ /; i > j :=
c ** Subscript[b, j] ** Subscript[a, i] ** d
SetAttributes[NonCommutativeMultiply, {OneIdentity, Flat}]
Protect[NonCommutativeMultiply];
这种乘法很棒,但是,它不处理表达式开头的负值,即
a**b**c + (-q)**c**a
应该简化为
a**b**c - q**c**a
,但不会。
在我的乘法中,变量q(以及任何整数定标器)是可交换的;我仍在尝试编写一个SetCommutative函数,但没有成功。我并不迫切需要SetCommutative,这会很好。 …