gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:30:32 25 4
gpt4 key购买 nike

Mathematicas NonCommutativeMultiply (**) 不会简化诸如

a**0=0**a=0  
a**1=1**a=a

或者
a**a=a^2.  

我想重新定义 **去做这个。我正在使用 NCAlgebra 来做到这一点,但我需要 ReplaceRepeated (//.) 和 NCAlgebra,正如他们的文档所说,专门破坏了 mathematica 中的这个功能。

有人可以告诉我如何清除 ** 的属性吗?并重新定义这个乘法做与平常一样的事情,加上处理 1 和 0。我真的不需要乘法来处理 a**a ,但如果它足够简单就好了。我最需要的东西 **处理1和0。

最佳答案

以下仅当您删除 NonCommutativeMultiply 的 Flat 属性时才有效
(这是我在测试过程中做错的事情……菜鸟错误!)

最简单的做法是

Unprotect[NonCommutativeMultiply];
NonCommutativeMultiply[a___, 1, b___] := a ** b
NonCommutativeMultiply[___, 0, ___] := 0
NonCommutativeMultiply[a_] := a
Protect[NonCommutativeMultiply];

需要最后的表达式,以便 a**1简化为 a而不是 NonCommutativeMultiply[a] .您可能还需要 NonCommutativeMultiply[]:=1所以像 1**1 这样的表达式适当简化 (*)。
所有这一切的唯一问题是对于大型表达式,模式会根据所有内容进行检查,这会变得非常慢。

上面对 0 和 1 的两个定义可以组合并推广到
NonCommutativeMultiply[a___, n_?NumericQ, b___] := n a ** b

它将表达式中的任何数字项分解出来。
但这在大型表达式中会更慢,因为检查每个术语以查看其数字。

简化您的 a**aa^2 ,你需要类似的东西
NonCommutativeMultiply[a___, b_, b_, c___] := a ** b^2 ** c

或更一般地
NonCommutativeMultiply[a___, b_^n_., b_^m_., c___] := a ** b^(n + m) ** c

(*) 请注意,这只是因为 Mathematica 放置其 DownValues 的默认顺序。在这种情况下, in 不一定是最好的。更改顺序,以便 NonCommutativeMultiply[a_]来之前 a___ ** n_?NumericQ ** b___然后 NonCommutativeMultiply[]不会由规则生成,并且您不需要最后一个模式(除非您以其他方式生成 NonCommutativeMultiply[])。

关于wolfram-mathematica - 重新定义 Mathematica 中的非交换乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5023863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com