1

I need a noncommutative multiplication that is

  1. Associative
  2. Distributive
  3. $A**0=0$, $A**1=A$
  4. 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.

8k14
  • 225
  • 1
  • 6
  • If you want it to agree with ordinary multiplication, do Unprotect[NonCommutativeMultiply]; NonCommutativeMultiply[x___]:=Times[x] (you probably also need to set its attributes to those of Times). 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 make NonCommutativeMultiply into Times. – Daniel Lichtblau Mar 17 '14 at 14:58

1 Answers1

6

Try NCAlgebra. After setting some symbols to be commutative or noncommutative:

<< NC`
<< NCAlgebra`
SetCommutative[k]
SetNonCommutative[A, B]

the expressions

A ** (k B)
(k A) ** B
k A ** B

all evaluate to k A ** B.

Mauricio de Oliveira
  • 2,001
  • 13
  • 15