#!/usr/bin/env python
# coding: utf-8
# # 10. Alternating forms on modules
#
# This notebook is part of the [Introduction to manifolds in SageMath](https://sagemanifolds.obspm.fr/intro_to_manifolds.html) by Andrzej Chrzeszczyk (Jan Kochanowski University of Kielce, Poland).
# In[1]:
version()
# **Warning:** In this notebook $M$ denotes a module --- not a manifold
#
#
#
# ### Reminder. Bases and dual bases
#
#
# Le us assume that $e=(e_1,\ldots,e_n)$ is a basis in a finite dimensional vector space $V$ or more generally finite rank free module $M$ over a ring $R$ (defined in notebook 6), so every vector $v$ can be uniquely represented as a linear combination $v=\sum_i\alpha_i e_i=\alpha_i e_i$, $\ \alpha_i\in R$.
#
#
#
# **Example 10.1**
#
# Define a basis in a 3-dimensional module over the symbolic ring `SR`.
# In[2]:
N=3 # dim. of the module M
get_ipython().run_line_magic('display', 'latex')
M = FiniteRankFreeModule(SR, 3, name='M') # module M
e = M.basis('e') ;e # basis of M
# If $(e_1,\ldots,e_n)$ is a basis we denote by $(e^1,\ldots,e^n)$
# the dual basis, i.e. the family of linear forms $M\to R$, such that
# $e^i(e_j)=\delta_j^i=
# \begin{cases}
# 1,& \text{if } i=j,\\
# 0, & \text{otherwise.}
# \end{cases}
# $
#
#
#
# **Example 10.2**
#
# Let us define the dual basis to the basis from the previous example.
# In[3]:
# continuation
d=e.dual_basis()
matrix(N,N,lambda i,j:d[i](e[j])) # matrix of all e^i(e_j)
#
#
# ### Elements of dual basis are coordinate functions
#
#
#
# If $(e_1,\ldots,e_n)$ is a basis and $(e^1,\ldots,e^n)$ its dual basis, then for $w=\alpha_je_j$ we have
#
# $$e^i(w)=e^i(\alpha_je_j)=\alpha_je^i(e_j)=\alpha_j\delta^i_j=\alpha_i,$$
#
# so the $i$-th element of the dual basis is the $i$-th coordinate function:
# $$e^i(\alpha_je_j)=\alpha_i.$$
#
#
#
# **Example 10.3**
#
# For example let us check the values of all elements of the dual basis $d=(e^0,e^1,e^2)$ on the vector
# $w=\alpha_0e_0+\alpha_1e_1+\alpha_2e_2$.
# In[4]:
# continuation
al=var('α',n=N) #\alpha+{Tab}
w=sum([al[k]*e[k] for k in range(N)]) # w=al_k*e_k
w.disp() # show w
# In[5]:
[d[i](w) for i in range(N)] # compute e^i(w) for i=0,1,2,
#
#
# ### Permutations
#
#
# By a **permutation** of a set $Y$ we mean a bijection $\sigma: Y\to Y$. In the sequel we will restrict ourselves to finite sets $Y=\{1,2,\ldots,k\}.$
# In that case, the permutation is just the reordering $(1,2,\ldots,k)\to(\sigma(1),\sigma(2),\ldots,\sigma(k)).$ To define a permutation, it is sufficient to define the image $(\sigma(1),\sigma(2),\ldots,\sigma(k))$.
#
#
#
# **Example 10.4**
#
# We can define a permutation of the set $(1,2,3)$ by its image $(p(1),p(2),p(3))$.
# In[6]:
p = Permutation([2,1,3]);p # (1,2,3)->(2,1,3)
# The action of $p$ on (1,2,3):
# In[7]:
a = [1,2,3] # a -sequence to permute
p.action(a) # permutation of a
#
#
# ### Sign of permutation
#
#
#
# The permutations form a group if we define the multiplication as the composition: $\sigma\tau=\sigma\circ\tau.$ The group of permutations of the set $\{1,2,\ldots,k\}$ is usually denoted by ${S_k}$.
#
# An **inversion of a permutation** $\sigma$ is a pair $(i, j)$ such that $i < j$
# and $\sigma(i) > \sigma(j)$.
# A permutation is **even** or **odd** depending on whether it is the product of an even or odd number of inversions. The **sign of a permutation** $\sigma$, denoted by $\mathrm{sign}(\sigma)$ is defined to be +1 or -1 depending on whether the permutation is even or odd. The sign of permutations satisfies
#
# $$\mathrm{sign}(\sigma\tau)=\mathrm{sign}(\sigma)\mathrm{sign}(\tau).$$
#
#
#
# **Example 10.5**
#
# Let us compute for example the sign of the permutation $(4,2,1,3,5)$ of $(1,2,3,4,5)$.
# In[8]:
p=Permutation([4,2,1,3,5])
sign(p)
# In[9]:
# even number of inversions
p.inversions()
# In[10]:
p.number_of_inversions()
#
#
# **Example 10.6**
# Now let us list all permutations from $S_3$ and their signs.
# In[11]:
S3=Permutations(3).list() # S_3
[(p,sign(p)) for p in S3] # signs of all permutations from S_3
#
#
# ## Alternating forms
#
#
#
# Let $M^k=M\times\dots\times M,$ where $M$ is a vector space or a module. Recall that by a $k$-**linear form on $M$** (or covariant tensor of type $(0,k)$) we mean a function $t:
# M^k\to R$ which is linear in each of its arguments, i.e for $i=1,\ldots,k$
#
# $$t(v_1,\ldots,\alpha v_i+\beta w_i,\ldots, v_k)=
# \alpha t(v_1,\ldots,v_i,\ldots,v_k)+\beta t(v_1,\ldots,w_i,\ldots, v_k),\quad \alpha,\beta\in R,\quad v_i,w_i\in M.$$
#
# A $k$-**linear** form $t:M^k\to R$ is **alternating** if it changes sign every time two of its variables are interchanged, that is, if
#
# $$t (v_1 , . . . , v_i , . . . , v_j , . . . , v_k ) = −t (v_1 , . . . , v_j , . . . , v_i , . . . , v_k ).$$
#
# Let us recall that in the notebook 9a the $k$-linear forms on $M$ were called **covariant tensors from $T^{(0,k)}M$**.
#
#
# In notations used by `SageMath` the module of alternating $k$-forms on a module $M$ is denoted by $\Lambda^k(M^*)$ ( it is a submodule of $T^{(0,k)}M$).
#
#
#
# **Example 10.7**
#
# Define a 3-linear form and alternating 3-form on a module M.
# In[12]:
M = FiniteRankFreeModule(SR, 3, name='M') # module M of rank 3 over SR
# SR is a field, so M is vect.sp.
e = M.basis('e') # basis of M
t=M.tensor((0,3),name='t');print(t) # covariant tensor of type (0,3)
# For alternating forms we have a special command: `alternating_form`.
# In[13]:
a=M.alternating_form(3);a # alternating form on M
# In[14]:
# the mathematical object of which "a" is an element.
print(a.parent())
show(a.parent())
#
#
# ### Antisymmetrization operation
#
#
#
# If $t$ is a covariant tensor from $T^{(0,k)}M$, then we can define an alternating $k$-form called Alt($t$) in the following way
# \begin{equation}
# \mathrm{Alt}(t)(v_1,\ldots,v_k)=\frac{1}{k!}\sum_{\sigma\in S_k}\mathrm{sign}(\sigma)\;t(v_{\sigma(1)},\ldots,v_{\sigma(k)}),
# \label{}\tag{10.1}
# \end{equation}
# for $v_i\in M$.
# The antisymmetrization operation in SageMath Manifolds is accessible by the method
# `antisymmetrize`.
#
#
#
# **Example 10.8**
#
# Let us define a tensor of type $(0,2)$ on a 3-dimensional module $M$ and its antisymmetrization.
# In[15]:
M = FiniteRankFreeModule(SR, 3, name='M') # module M of rank 3
e = M.basis('e') # basis of M
t = M.tensor((0,2)); print('t:',t) # tensor of type (0,2)
t[:] = [[1,-2,3], [4,5,6], [7,8,-9]]; # components of t
ta=t.antisymmetrize();print('ta:',ta) # antisymmetrization of t
#
#
# In the next series of cells we try to show some details of the antisymmetrization operation Alt.
#
#
# **Example 10.9**
#
# If $k=2$ there are only two permutations in $S_k$, with signs +1, -1 so the sum from the antisymmetrization definition (10.1), applied to
# $\ t=t_{ij}e^i\otimes e^j,\ i,j=0,1\ $ computed on the vectors $(v_0,v_1)=(e_0,e_1)$ reduces to
# $\frac{1}{2!}(t_{01}-t_{10})$.
#
# Define tensor $t$:
# In[16]:
get_ipython().run_line_magic('display', 'latex')
N=3
Mo = FiniteRankFreeModule(SR, N, name='Mo') # 3-dim module M
e = Mo.basis('e') # basis of M
t=Mo.tensor((0,2)) # (0,2) type tensor
symb_mat=[[var('t'+str(i)+str(j))
for j in range(N)] for i in range(N)] # matrix of components
t[:]=symb_mat # define all components
t.disp() # show t
# and list components of $t$ in the sum (10.1):
# In[17]:
S2=Permutations(2).list() # list of perm.from S_2
[t(e[p[0]-1],e[p[1]-1]) for p in S2] # elements in the sum (10.1)
# permutations p[i] give numbers from {1,..,k},
# we need indices from {0,..,k-1}, therefore we are subtracting 1
# Compute the sum from the definition (10.1) of antisymmetrization for $(v_0,v_1)=(e_0,e_1)$:
# In[18]:
1/factorial(2)*sum([sign(p)*t(e[p[0]-1],e[p[1]-1]) for p in S2])
# Check if SageMath Manifolds `antisymmetrize` gives the same result:
# In[19]:
ta=t.antisymmetrize()
ta(e[0],e[1])
#
#
#
# **Example 10.10**
#
# Now let us check how the antisymmetrization works for covariant tensors from $T^{(0,3)}M$. We define symbolic 3-dimensional tables first.
# In[20]:
get_ipython().run_line_magic('display', 'latex')
N=4 # dimension of module
symb_ten3=[[[var('t'+str(i0)+str(i1)+str(i2))
for i2 in range(N)]
for i1 in range(N)]
for i0 in range(N)] # components of t
symb_ten3 # show components
# Since $S_3$ contains 3!=6 elements, the sum from antisymmetrization definition (10.1) contains 6 summands.
# In[21]:
# continuation
Mo = FiniteRankFreeModule(SR, N, name='Mo') # module Mo of dimension 4
e = Mo.basis('e') # basis of M
t = Mo.tensor((0,3), name='t') # tensor t of type (0,3)
t[:]=symb_ten3 # components of t
S3=Permutations(3).list() # permutation group S_3
# Let us apply the antisymmetrization definition (10.1) for $(v_0,v_1,v_2)=(e_0,e_1,e_2)$.
# In[22]:
1/factorial(3)*sum([sign(p)*t(e[p[0]-1],e[p[1]-1],e[p[2]-1]) for p in S3])
# Let us check what gives the `antisymmetrize` method:
# In[23]:
ta=t.antisymmetrize()
ta(e[0],e[1],e[2])
# In[24]:
#ta.antisymmetrize?
# Note that in the above calculations we restricted ourselves to one component of the antisymmetrized tensor.
#
# To display the full result we need the notion of tensor and wedge products.
#
#
# ### Reminder. Tensor product
#
#
#
# Recall the definition (9.1a) of the tensor product
#
# For $\ t\in T^{(0,k)}M,\,s\in T^{(0,m)}M\ $ we define the **tensor product** $\ \ t\otimes s\in T^{(0,k+m)}M$ by
#
# \begin{equation}
# (t ⊗ s )(v_1 ,\ldots , v_{k+m} ) ≡ t (v_1 ,\ldots, v_k ) s (v_{k+1} , . . . , v_{k+m} ),
# \tag{9.1a}
# \end{equation}
#
# for $v_1,\ldots,v_{k+m}\in M$.
#
#
# ### Wedge product
#
#
#
# Using the antisymmetrization operation Alt we can define the wedge product between alternating forms
# $t ∈ \Lambda^k(M^*)$ and $s ∈ \Lambda^m(M^*)$, which gives
# $t ∧ s ∈ \Lambda^{k+m}(M^*)$ defined by
# \begin{equation}
# t ∧ s =\frac{(k + m)!}{k!m!}\mathrm{Alt}(t ⊗ s).
# \label{}\tag{10.2}
# \end{equation}
#
#
#
# **Example 10.11**
#
# If $a,b\in \Lambda^1(M^*),$ then since $S_2$ contains only two permutations of opposite sign we see that Alt$(a\otimes b)$ is equal to
# $\frac{1}{2!}(t\otimes s -s\otimes t)$ and $t\wedge s=\frac{(1+1)!}{1!1!}\Big(\frac{1}{2!}((t\otimes s -s\otimes t)\Big)=t\otimes s -s\otimes t$.
#
#
#
# One can prove that for $t\in \Lambda^k(M^*),s\in\Lambda^m(M^*),r\in\Lambda^l(M^*)$
#
# $$(t ∧ s) ∧ r = t ∧ (s ∧ r),$$
#
# (in notebook 14 we prove this for differential forms).
#
# Since the order of parentheses in that formula is not essential
# we can replace both sides by $t\wedge s\wedge r$, analogously we can form the wedge products of larger number of forms: $t_1\wedge\ldots\wedge t_i$.
#
#
# ### Bases in the space of alternating forms $\Lambda^k(M^*)$
#
#
#
# To show concrete examples of alternating forms we will use bases in the spaces of alternating $k$-forms.
#
# If $e^1,\ldots,e^n$ is a basis of $M^*$, then the set
#
# $$
# \{e^{i_1}\wedge\dots\wedge e^{i_k}: 1\leq i_1<\ldots
#
# **Example 10.12**
#
# Take two 1-forms $a$ and $b$:
# In[25]:
get_ipython().run_line_magic('display', 'latex')
M = FiniteRankFreeModule(SR, 3, name='M') # module M of dimension 3
e = M.basis('e') # basis of M
a=M.alternating_form(1) # 1-form a
b=M.alternating_form(1) # 1-form b
a[:]=var('a',n=3) # a0,a1,a2 # components of a
b[:]=var('b',n=3) # b0,b1,b2 # components of b
a.disp() # show a
# In[26]:
# the mathematical object of which "a" is an element.
a.parent()
# In[27]:
a[:] # comp. in the basis e
# In[28]:
b.disp() # show b
# Compute the wedge product $a\wedge b$:
# In[29]:
t=a.wedge(b);print(t) # wedge prod. a/\b
t.disp() # show wedge prod.
# Let us check the result using the definition of wedge product.
# In[30]:
get_ipython().run_line_magic('display', 'latex')
tt=factorial(1+1)/factorial(1)/factorial(1)*(a*b).antisymmetrize()
tt.disp() # show the result of application of definition of a/\b
# Let us note that for 1-forms with components $a_0,a_1,a_2$ and $b_0,b_1,b_2$ the components of $a\wedge b$ are just the minors of
# $\Big(\begin{matrix}
# a_0,a_1,a_2\\
# b_0,b_1,b_2
# \end{matrix}\Big).
# $
# In[31]:
ma=matrix([a[:],b[:]]);ma # matrix with comp. of a and b as rows
# In[32]:
ma.minors(2) # 2x2 minors of matrix ma
#
#
# **Example 10.13**
#
# Let us compute the wedge product of three 1-forms in a 3-dimensional module.
# In[33]:
M = FiniteRankFreeModule(SR, 3, name='M') # module M of dimension 3
e = M.basis('e') # basis of M
d=e.dual_basis() # dual basis
a=M.alternating_form(1) # 1-form a
b=M.alternating_form(1) # 1-form b
c=M.alternating_form(1) # 1-form c
a[:]=var('a',n=3) # components of a
b[:]=var('b',n=3) # components of b
c[:]=var('c',n=3) # components of c
abc=(a.wedge(b)).wedge(c) # a/\b/]c
abc.disp() # show abc
# In[34]:
# the mathematical object of which "abc" is an element.
abc.parent()
# We can recognize in the result the Laplace expansion of the determinant det $\left(\begin{matrix}
# a_0,a_1,a_2\\
# b_0,b_1,b_2\\
# c_0,c_1,c2
# \end{matrix}\right),
# $
# so we obtain
# $\quad a\wedge b\wedge c=$
# det $\left(\begin{matrix}
# a_0,a_1,a_2\\
# b_0,b_1,b_2\\
# c_0,c_1,c2
# \end{matrix}\right)
# e^0\wedge e^1\wedge e^2.
# $
#
# SageMath Manifolds also recognizes that equality:
# In[35]:
# compare abc and the 3-form with unique component equal to
# det of the matrix of coefficients of a,b,c
abc==det(matrix([a[:],b[:],c[:]]))*(d[0].wedge(d[1])).wedge(d[2])
#
#
# **Example 10.14**
#
# For alternating 2-forms the antisymmetry property $a(v_1,v_2)=-a(v_2,v_1)$ implies, that the corresponding component matrices must be antisymmetric, so only upper or lower triangles of the component matrices must be defined.
# In[36]:
M = FiniteRankFreeModule(SR, 3, name='M') # module M of dimension 3
e = M.basis('e') # basis of M
c=var('c',n=3) # c_0,c_1,c_2
c=M.alternating_form(2) # 2-form
c[0,1]=c0; c[0,2]=c1; c[1,2]=c2 # components of 2-form
c[:] # show component matr.
# In[37]:
a=M.alternating_form(1) # 1-form a
a[:]=var('a',n=3) # components of a
a.disp() # show a
# Compute
# 1-form times 2-form in 3-dimensional module:
# In[38]:
# continuation
ac=a.wedge(c);ac
# In[39]:
ac.disp() # show ac
# Let us apply the definition of wedge product for comparison.
# In[40]:
(factorial(3)/factorial(2)*(a*c).antisymmetrize()).disp()
#
#
# **Example 10.15**
#
# **Clarification of the factor $\mathbf {\frac{1}{k!m!}}$ in the wedge product definition**.
#
# Let us perform the wedge product between a 2-form and 3-form in 5-dimensional module.
# In[41]:
# 2form times 3form in 5-dimensions
get_ipython().run_line_magic('display', 'latex')
var('a12,a24,a35') # symbolic components of 2-form w1
var('b123,b234,b345') # symbolic components of 3-form w2
V = FiniteRankFreeModule(SR,rank=5, name='V', start_index=1)
e = V.basis('e'); # basis of V
w1=V.alternating_form(2) # w1 is 2-form with
w1[1,2],w1[2,4],w1[3,5]=a12,a24,a35; # components a12,a24,a35
w2=V.alternating_form(3) # w2 is 3-form
w2[1,2,3],w2[2,3,4],w2[3,4,5]=b123,b234,b345; # with components
# b123,b234,b345
w1.display() # show w1
# In[42]:
w2.display() # show w2
# Here is the wedge product according to SageMath Manifolds:
# In[43]:
w1.wedge(w2).display() # show w1/\w2
# Let us apply the definition of wedge product for comparison:
# In[44]:
w=w1*w2
w0=factorial(2+3)/factorial(3)/factorial(2)*w.antisymmetrize()
w0.display()
# If we drop the factor $\frac{1}{2!3!}$ and expand the sum from the antisymmetrization definition (cf. (10.1)) we obtain (the factor $(2+3)!$ is canceled by the factor $\frac{1}{(2+3)!}$ from that definition):
# In[45]:
S5=Permutations(5).list()
s0=sum([sign(p)*w1(e[p[0]],e[p[1]])*w2(e[p[2]],e[p[3]],e[p[4]])
for p in S5])
s0
# The last sum contains $2!\cdot 3!=12$ repeated elements.
#
# Below we display all permutations from $S_5$ which give nonzero elements in the sum from the definition of wedge product. All mentioned permutations $p$ give the same result of
#
# $${\rm{sign}}(p)\,w_1(e_{p(0)},e_{p(1)})\,w_2(e_{p(2)},e_{p(3)},e_{p(4)})$$
#
# equal to $\ \ a_{12}b_{345}:$
# In[46]:
# (shows only the nonzero elements of the sum of 5!=120 elements)
[[p[0],p[1],p[2],p[3],p[4],'---',
sign(p)*w1(e[p[0]],e[p[1]])*w2(e[p[2]],e[p[3]],e[p[4]])]
for p in S5 if (Set(range(1,3))==Set([p[0],p[1]]) and
Set(range(3,6))==Set([p[2],p[3],p[4]]))]
# Thus the factor $\frac{1}{k!m!}$ in the wedge product definition is reasonable. Some authors use different choices of this factor. We follow the SageMath Manifolds choice.
#
#
# ### Abbreviated notations for $k$-forms
#
#
#
# For arbitrary $k$-forms in $\Lambda^k(M^*)$
# sometimes we would not want to actually write out all the indices from (10.3), so
# instead we will write
# \begin{equation}
# α =\sum_I a_I dx^I .
# \label{}\tag{10.4}
# \end{equation}
# Here the $I$ stands for the sequence of $k$ increasing indices $i_1 i_2 \ldots i_k$: $1 ≤ i_1 < i_2 < \ldots < i_k ≤ n$. That is, we sum over
# $I ∈ J_{k,n} = \{(i_1 i_2 \ldots i_k ) : 1 ≤ i_1 < i_2 < \ldots < i_k ≤ n\}$ .
#
# For example, for $k = 3$ and $n = 4$ we have $I\in\{123,124,134,234\}.$
#
# If $I$ and $J$ are disjoint then we have $dx^I ∧ dx^J = ±dx^K$ where $K = I ∪ J$ , but is reordered to be in increasing order.
# Elements with repeated indices are dropped. Using this notation we can compute the wedge product as follows
#
# \begin{equation}
# \Big(\sum_I a_Idx^I\Big)\wedge\Big(\sum_J b_Jdx^J\Big)=
# \sum_K\Big(\sum_{\substack{I\cup J=K\\I\cap J=\emptyset}}\pm a_Ib_J\Big)dx^K.
# \label{}\tag{10.5}
# \end{equation}
#
#
# **Example 10.16**
#
# Let us demonstrate this method in the case of the wedge product of 2-form times 2-form in a four-dimensional module.
# In[47]:
var('f12,f13,f14, f23, f24, f34') # variables for components of w1
var('g12,g13,g14, g23, g24, g34') # variables for components of w2
# module V of dimension 4:
V = FiniteRankFreeModule(SR,rank=4, name='V', start_index=1)
e = V.basis('e'); # basis of V
w1=V.alternating_form(2) # 2-form w1
# components of w1
w1[1,2],w1[1,3],w1[1,4],w1[2,3],w1[2,4],w1[3,4]=f12,f13,f14, f23, f24, f34
w2=V.alternating_form(2) # 2-form w2
# components of w2
w2[1,2],w2[1,3],w2[1,4],w2[2,3],w2[2,4],w2[3,4]=g12,g13,g14, g23, g24, g34
w1.display() # show w1
# In[48]:
w2.display() # show w2
# Computing the wedge product we use all possible strictly increasing and disjoint sequences $I=(i_1,i_2),\quad J=(j_1,j_2),\quad$
# $dx^K=e^1\wedge e^2\wedge e^3\wedge e^4,\quad$ $K=(1,2,3,4)$ is reordered disjoint union $I\cup J$.
#
# In our example we take all possible 2-element increasing permutations of indices for the first form:
#
# $$I\in \{(1,2), (1,3), (1,4), (2,3), (2,4), (3,4)\}$$
#
# The corresponding increasing $J$ satisfying $I\cup J=\{1,2,3,4\}$ and $I\cap J=\emptyset$ are:
#
# $$J\in \{(3,4), (2,4), (2,3), (1,4), (1,3), (1,2)\}$$
# so, the wedge product is
# $$(f_{12}g_{34}-f_{13}g_{24}+f_{14}g_{23}+f_{23}g_{14}-f_{24}g_{13}+f_{34}g_{12})e^1\wedge e^2\wedge e^3\wedge e^4.$$
#
# The signs in the last result are the signs of the corresponding permutations:
# In[49]:
s=[[1,2,3,4],[1,3,2,4],[1,4,2,3],[2,3,1,4],[2,4,1,3],[3,4,1,2]]
[sign(Permutation(x)) for x in s] # list of signs of permut.
# SageMath Manifolds gives the sum in parentheses in reverse order:
# In[50]:
w=w1.wedge(w2) # wedge product w1/\w2
w.display() # show wedge product
#
#
# ### Basic properties of the wedge product
#
#
#
# **Multilinearity**
#
# For $\alpha,\alpha_1,\alpha_2\in \Lambda^k(M^*),\beta,\beta_1,\beta_2\in \Lambda^m(M^*)$ and $a\in R$
# \begin{equation}
# (\alpha_1+\alpha_2)\wedge\beta=\alpha_1\wedge\beta+\alpha_2\wedge\beta,\\
# \alpha\wedge(\beta_1+\beta_2)=\alpha\wedge\beta_1+\alpha\wedge\beta_2,\\
# (a\alpha)\wedge\beta=a(\alpha\wedge\beta)=\alpha\wedge(a\beta).
# \label{}\tag{10.6}
# \end{equation}
# **Associativity**
#
# For $\alpha_i\in \Lambda^{k_i}(M^*)$
#
# \begin{equation}
# (\alpha_1\wedge \alpha_2)\wedge \alpha_3=\alpha_1\wedge(\alpha_2\wedge \alpha_3).
# \tag{10.7}
# \end{equation}
#
# **Anticommutativity**
#
# If $t ∈ \Lambda^k(M^*)$ and $s ∈ \Lambda^m(M^*)$, then
# \begin{equation}
# t ∧ s = (−1)^{km} s ∧ t.
# \label{}\tag{10.8}
# \end{equation}
# In the [notebook 14](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/14Manifold_Differential_Forms.ipynb) we will prove analogous properties in the case of differential forms.
# ## What's next?
#
# Take a look at the notebook [Vector fields](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/11Manifold_Vect_Fields.ipynb).