Non-degeneracy of the pairing
Ref:
We use 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
and convenient notation
axiom
macro Σ(x,i,n)==reduce(+,[x for i in n])
Type: Void
axiom
macro Ξ(f,i,n)==[f for i in n]
Type: Void
axiom
macro sb == subscript
Type: Void
axiom
macro sp == superscript
Type: Void
Let 𝐋 be the domain of 2-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))
Pairing
A scalar product (pairing) is represented by
axiom
U:=Σ(Σ(sp('u,[i,j])*𝐝.i*𝐝.j, i,1..dim), j,1..dim)
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
In general we do not require that it be symmetric.
Co-pairing
Solve the "snake relation" as a system of linear equations.
axiom
Ω:𝐋:=Σ(Σ(sb('u,[i,j])*𝐞.i*𝐞.j, i,1..dim), j,1..dim)
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
axiom
Í:=(I*Ω)/(U*I);
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
axiom
Ì:=(Ω*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(Í,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(Ì,I)
Type: List(Equation(Expression(Integer)))
axiom
snake:=solve(concat(eq1,eq2),concat Ξ(Ξ(sb('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)))
This is equivalent to a matrix inverse (transposed!)
axiom
Um:=matrix Ξ(Ξ((𝐞.i*𝐞.j)/U, i,1..dim), j,1..dim)
Type: Matrix(LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer)))
axiom
mU:=transpose inverse map(retract,Um)
Type: Matrix(Expression(Integer))
axiom
Ωm:=Σ(Σ(mU(i,j)*(𝐞.i*𝐞.j), i,1..dim), j,1..dim)
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
axiom
-- compare
test(Ω=Ωm)
Type: Boolean
Check that the snake relation holds
axiom
test
( I Ω ) /
( U I ) = I
Type: Boolean
axiom
test
( Ω I ) /
( I U ) = I
Type: Boolean
Dimension
This quantity depends on !
axiom
d:=
Ω /
U
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
This "twisted" quantity does not.
axiom
d':=
Ω /
X /
U
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
Symmetric Pairing
Repeat the calculation, assuming that U is symmetric.
axiom
sym:=groebner ravel(U-X/U)
Type: List(Polynomial(Integer))
axiom
vars:=map(x+->kernels(x).1,sym)::List Symbol
Type: List(Symbol)
axiom
eqs:=solve(sym,vars).1
Type: List(Equation(Fraction(Polynomial(Integer))))
axiom
U:=eval(U,eqs)
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)))
axiom
mU:=transpose inverse map(retract,Um)
Type: Matrix(Expression(Integer))
axiom
Ω:=Σ(Σ(mU(i,j)*(𝐞.i*𝐞.j), i,1..dim), j,1..dim)
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
Check that the snake relation holds
axiom
test
( I Ω ) /
( U I ) = I
Type: Boolean
axiom
test
( Ω I ) /
( I U ) = I
Type: Boolean
These quantities no longer depends on !
axiom
d:=
Ω /
U
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))
axiom
d':=
Ω /
X /
U
Type: LinearOperator
?(2,
OrderedVariableList
?([]),
Expression(Integer))