I work with an exterior algebra over $R^n$. I have the basis $\{1,\omega_i\}_{i=1}^n$ in this algebra, and my differential operator is defined as
$$d\omega_k=\sum_{i>j>0,i+j=k} (i-j)w_i\wedge w_j.$$
As you see, my sum depends directly on the indexes of the elements of the basis. I surely can define the wedge and the differential operator in Mathematica, and they will calculate the derivative for any polynome I want. My problem is to find a good way to describe the elements of the basis, which will permit me use these formulas easily. It can not be just the integers $1, .. n$ for every element $\omega_1, .. \omega_n$, because Mathematica will multiply them as normal numbers, not treating them as elements of the exterior algebra; it cannot be just symbols such as w1
, w2
, ... because I cannot easily extract the numbers from them to calculate the derivatives (or I just don't know how).
I tried to represent them with {1}
, {2}
, and so on. I also used noncommutative multiplication with additional relations as the exterior multiplication. Example of what my notebook can calculate:
In[30]:= d[{5} ** {4}]
Out[30]= {4} ** {3} ** {2} + 2 {5} ** {3} ** {1}
That's nice. I defined multiplication and differentiation without problems, except for one small thing -- multiplying by a scalar. For example, consider the expression $2\omega_4+\omega_5$. In this notation it appears as 2 {4} + {5}
. Mathematica proceeds to {8} + {5}
and then to {13}
, which is completely wrong.
In[31]:= 2 {4} + {5}
Out[31]= {13}
This only happens when working with dimension 1. For higher grades everything's fine because Mathematica's multiplication doesn't misbehave when working with non-commutative elements:
In[32]:= 2 {4} ** {3} + 6 {5} ** {2}
Out[32]= 2 {4} ** {3} + 6 {5} ** {2}
In[33]:= (2 {4} ** {3} + 6 {5} ** {2}) ** {3}
Out[33]= -6 {5} ** {3} ** {2}
But this is still not what I want -- lower dimensions are important to me, so my question is: how do I represent the basis elements without these problems? I can try to partially clear Times
, but I don't think this is best way, as the multiplication of lists may be vital later in the code.