I need a noncommutative multiplication that is
- Associative
- Distributive
- $A**0=0$, $A**1=A$
- Agrees with the commutative multiplication ($A**(k B)=(k A)**B=k (A**B)$)
I have found a code
Unprotect[NonCommutativeMultiply];
Clear[NonCommutativeMultiply]
(*Factor out numerics -- could generalize to some ScalarQ*)
nc : NonCommutativeMultiply[a__] /; MemberQ[{a}, _?NumericQ] :=
NCMFactorNumericQ[NCM[a]] /. NCM -> NonCommutativeMultiply
(*Simplify Powers*)
b___ ** a_^n_. ** a_^m_. ** c___ :=
NCM[b, a^(n + m), c] /. NCM -> NonCommutativeMultiply
(*Expand Brackets*)
nc : NonCommutativeMultiply[a___, b_Plus, c___] :=
Distribute[NCM[a, b, c]] /. NCM -> NonCommutativeMultiply
(*Sort Subscripts*)
c___ ** Subscript[a_, i_] **Subscript[b_, j_] ** d___ /; i > j :=
c ** Subscript[b, j] ** Subscript[a, i] ** d
Protect[NonCommutativeMultiply];
Unprotect[NCM];
Clear[NCM]
NCMFactorNumericQ[nc_NCM] :=
With[{pos = Position[nc, _?NumericQ, 1]}, Times \@@ Extract[nc, pos] Delete[nc, pos]]
NCM[a_] := a
NCM[] := 1
Protect[NCM];
Here 1, 2, 3 are satisfied and 4 is not. Could you please help me to modify it.
Unprotect[NonCommutativeMultiply]; NonCommutativeMultiply[x___]:=Times[x]
(you probably also need to set its attributes to those ofTimes
). If you want it to have a notion of scalars that get pulled out, that's a very different matter. So you really need to spell out more carefully what it is you want, if in fact it is not to makeNonCommutativeMultiply
intoTimes
. $\endgroup$