Non-degeneracy of the pairing
Ref:
We need the Axiom LinearOperator? library.
axiom
)library MONAL PROP LIN
   Monoidal is now explicitly exposed in frame initial 
   Monoidal will be automatically loaded when needed from 
      /var/zope2/var/LatexWiki/MONAL.NRLIB/MONAL
   Prop is now explicitly exposed in frame initial 
   Prop will be automatically loaded when needed from 
      /var/zope2/var/LatexWiki/PROP.NRLIB/PROP
   LinearOperator is now explicitly exposed in frame initial 
   LinearOperator will be automatically loaded when needed from 
      /var/zope2/var/LatexWiki/LIN.NRLIB/LIN
Use the following macros for convenient notation
axiom
-- summation
macro Σ(x,i,n)==reduce(+,[x for i in n])
Type: Void
axiom
-- list
macro Ξ(f,i,n)==[f for i in n]
Type: Void
axiom
-- subscript
macro sb == subscript
Type: Void
𝐋 is the domain of 4-dimensional linear operators
axiom
dim:=2
axiom
macro ℒ == List
Type: Void
axiom
macro ℚ == Expression Integer
Type: Void
axiom
𝐋 := LinearOperator(dim, OVAR [], ℚ)
Type: Type
axiom
𝐞:ℒ 𝐋      := basisVectors()
Type: List(LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer)))
 
axiom
𝐝:ℒ 𝐋      := basisForms()
Type: List(LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer)))
 
axiom
I:𝐋:=[1]   -- identity for composition
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
 
axiom
X:𝐋:=[2,1] -- twist
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
 
A scalar product (pairing) is denoted by
axiom
U:=Σ(Σ(script('u,[[],[i,j]])*𝐝.i*𝐝.j, i,1..dim), j,1..dim)
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
 
axiom
Um:=matrix Ξ(Ξ((𝐞.i*𝐞.j)/U, i,1..dim), j,1..dim)
Type: Matrix(LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer)))
 
Co-pairing
Solve the "snake relation" as a system of linear equations.
axiom
Ω:𝐋:=Σ(Σ(script('u,[[i,j]])*𝐞.i*𝐞.j, i,1..dim), j,1..dim)
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
 
axiom
d1:=(I*Ω)/(U*I);
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
 
axiom
d2:=(Ω*I)/(I*U);
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
 
axiom
equate(f,g)==map((x,y)+->(x=y),ravel f, ravel g);
Type: Void
axiom
eq1:=equate(d1,I);
axiom
Compiling function equate with type (LinearOperator(2,
      OrderedVariableList([]),Expression(Integer)),LinearOperator(2,
      OrderedVariableList([]),Expression(Integer))) -> List(Equation(
      Expression(Integer)))
 
Type: List(Equation(Expression(Integer)))
axiom
eq2:=equate(d2,I);
Type: List(Equation(Expression(Integer)))
axiom
snake:=solve(concat(eq1,eq2),concat Ξ(Ξ(script('u,[[i,j]]), i,1..dim), j,1..dim));
Type: List(List(Equation(Expression(Integer))))
axiom
if #snake ~= 1 then error "no solution"
Type: Void
axiom
Ω:=eval(Ω,snake(1))
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
 
axiom
matrix Ξ(Ξ(Ω/(𝐝.i*𝐝.j), i,1..dim), j,1..dim)
Type: Matrix(LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer)))
 
axiom
-- compare
inverse map(retract,Um)
Type: Union(Matrix(Expression(Integer)),...)
Check "dimension": It depends on parameters!
axiom
d:𝐋:=
    (   Ω    )  /
    (   U    )
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
 
axiom
test
    (  I Ω   )  /
    (   U I  )  =  I
Type: Boolean
axiom
test
    (   Ω I  )  /
    (  I U   )  =  I
Type: Boolean