In [1]:
import sys
from importlib import reload
import sympy
from itertools import product
from collections import defaultdict

In [2]:
sys.path.insert(0, '../')

In [3]:
import multivector as mv
import examples as ex
import embedding as emb
t*(x0,x1,x2,y0,y1,y2) = (t^2*x0, t*x1, t*x2, t-2*y0, t^-1*y1, t^-1*y2)

invariants:
x0*y0
x1*y1
x2*y2
x1*y2
x2*y1
x0*y1^2
x0*y1*y2
x0*y2^2
y0*x1^2
y0*x1*x2
y0*x2^2

In [4]:
q = sympy.symbols(tuple('q%d' %x for x in range(5)))
a = sympy.symbols(tuple('a%d' %x for x in range(3)))
b = sympy.symbols(tuple('b%d' %x for x in range(3)))
#z = sympy.symbols('z0 z1')

x = sympy.symbols('x0 x1 x2')
y = sympy.symbols('y0 y1 y2')
stdbrac = mv.Mv(x+y, {(x[0],y[0]):1, (x[1],y[1]):1, (x[2],y[2]):1}).brac

In [65]:
rmap = {
    q[0]: x[0]*y[0], 
    q[1]: x[1]*y[1],
    q[2]: x[2]*y[2],
    q[3]: x[1]*y[2],
    q[4]: x[2]*y[1],
    a[0]: x[0]*(y[1]**2),
    a[1]: x[0]*(y[1]*y[2]),
    a[2]: x[0]*(y[2]**2),
    b[0]: y[0]*(x[1]**2),
    b[1]: y[0]*(x[1]*x[2]),
    b[2]: y[0]*(x[2]**2)
}

embcoords, invariants = list(zip(*rmap.items()))

In [66]:
gbK = sympy.polys.groebner([ai-xi for (ai,xi) in rmap.items()])
K = [g for g in gbK if not (set(g.as_poly().gens) - set(embcoords))]

In [91]:
{k:(Pi1.brac(q[0], k)/k).simplify() for k in K}


Out[91]:
{-a0*b2 + q0*q4**2: 0,
 b0*b2 - b1**2: 2,
 a0*b2*q3 - a1*b1*q4: 0,
 -a2*b2 + q0*q2**2: 0,
 -b1*q4 + b2*q1: 1,
 -a1*b0 + q0*q1*q3: 0,
 -a0*b1 + q0*q1*q4: 0,
 -a1*q3 + a2*q1: -1,
 -a0*b0 + q0*q1**2: 0,
 a0*b1*q3 - a1*b0*q4: 0,
 -a1*b2 + q0*q2*q4: 0,
 b0*q2 - b1*q3: 1,
 -a1*b1 + q0*q3*q4: 0,
 -a2*b1 + q0*q2*q3: 0,
 a0*a2 - a1**2: -2,
 a1*q2 - a2*q4: -1,
 -b0*q4 + b1*q1: 1,
 -a2*b0 + q0*q3**2: 0,
 q1*q2 - q3*q4: 0,
 a1*b2*q3 - a2*b1*q4: 0,
 a0*q2 - a1*q4: -1,
 b1*q2 - b2*q3: 1,
 a1*b1*q3 - a2*b0*q4: 0,
 -a0*q3 + a1*q1: -1}

In [95]:
{k:(Pi1.brac((q[1] - q[2])/2, k)/k).simplify() for k in K}


Out[95]:
{-a0*b2 + q0*q4**2: 2,
 b0*b2 - b1**2: 0,
 a0*b2*q3 - a1*b1*q4: 1,
 -a2*b2 + q0*q2**2: 0,
 -b1*q4 + b2*q1: 1,
 -a1*b0 + q0*q1*q3: -1,
 -a0*b1 + q0*q1*q4: 1,
 -a1*q3 + a2*q1: -1,
 -a0*b0 + q0*q1**2: 0,
 a0*b1*q3 - a1*b0*q4: 0,
 -a1*b2 + q0*q2*q4: 1,
 b0*q2 - b1*q3: -1,
 -a1*b1 + q0*q3*q4: 0,
 -a2*b1 + q0*q2*q3: -1,
 a0*a2 - a1**2: 0,
 a1*q2 - a2*q4: 0,
 -b0*q4 + b1*q1: 0,
 -a2*b0 + q0*q3**2: -2,
 q1*q2 - q3*q4: 0,
 a1*b2*q3 - a2*b1*q4: 0,
 a0*q2 - a1*q4: 1,
 b1*q2 - b2*q3: 0,
 a1*b1*q3 - a2*b0*q4: -1,
 -a0*q3 + a1*q1: 0}

In [97]:
Km = [
    q[1]*q[2] - q[3]*q[4],
    -1*a[2]*b[0] + q[0]*q[3]**2,
    -1*a[2]*b[1] + q[0]*q[2]*q[3],
    -1*a[1]*b[0] + q[0]*q[1]*q[3],
    -1*a[2]*b[2] + q[0]*q[2]**2,
    -1*a[1]*b[1] + q[0]*q[3]*q[4],
    -1*a[0]*b[0] + q[0]*q[1]**2,
    -1*a[0]*b[1] + q[0]*q[1]*q[4],
    -1*a[1]*b[2] + q[0]*q[2]*q[4],
    -1*a[0]*b[2] + q[0]*q[4]**2,
    -1*a[1]*q[3] + a[2]*q[1],
    -1*a[0]*q[3] + a[1]*q[1],
    a[1]*q[2] - a[2]*q[4],
    a[0]*q[2] - a[1]*q[4],
    b[0]*q[2] - b[1]*q[3],
    -b[0]*q[4] + b[1]*q[1],
    b[1]*q[2] - b[2]*q[3],
    -b[1]*q[4] + b[2]*q[1],
    a[1]*b[1]*q[3] - a[2]*b[0]*q[4],
    a[0]*b[1]*q[3] - a[1]*b[0]*q[4],
    a[1]*b[2]*q[3] - a[2]*b[1]*q[4],
    a[0]*b[2]*q[3] - a[1]*b[1]*q[4],
    a[0]*a[2] - a[1]**2,
    b[0]*b[2] - b[1]**2
]

In [99]:
Kcoords = sympy.symbols(
    ['C'] + 
    ['MQ%d' %x for x in range(9)] + 
    ['AQ%d' %x for x in range(4)] + 
    ['BQ%d' %x for x in range(4)] +
    ['MM%d' %x for x in range(4)] + 
    ['AA%d' %x for x in range(1)] + 
    ['BB%d' %x for x in range(1)]
)

In [114]:
KHom = dict(zip(Kcoords, Km))
kerCoords, kerPolys = list(zip(*KHom.items()))

In [ ]:


In [ ]:


In [ ]:


In [8]:
P = {}
for k1, k2 in product(rmap.keys(), rmap.keys()):
    if (k2, k1) not in P.keys():
        P[(k1, k2)] = stdbrac(rmap[k1],rmap[k2])

In [9]:
lift = emb.lift(rmap, embcoords, x+y)

In [10]:
Pi = mv.Mv(embcoords, P).mapCoeffs(lambda x:lift(x))

In [11]:
Pi.mapCoeffs(lambda x:x.simplify())


Out[11]:
-a0*dq0*da0 + 2*a0*dq1*da0 + a0*dq4*da1 - a1*dq0*da1 + a1*dq1*da1 + a1*dq2*da1 + 2*a1*dq3*da0 + 2*a1*dq4*da2 - a2*dq0*da2 + 2*a2*dq2*da2 + a2*dq3*da1 - b0*db0*dq0 - 2*b0*dq1*db0 - b0*dq3*db1 + 2*b1*db0*dq4 + b1*dq0*db1 - b1*dq1*db1 - b1*dq2*db1 - 2*b1*dq3*db2 + b2*dq0*db2 - 2*b2*dq2*db2 - b2*dq4*db1 + q1*(4*q0 - q1)*db0*da0 + q2*(-4*q0 + q2)*da2*db2 - q3**2*db0*da2 + q3*(-2*q0 + q2)*da2*db1 + q3*(2*q0 - q1)*db0*da1 - q3*dq1*dq3 + q3*dq2*dq3 - q4**2*db2*da0 + q4*(2*q0 - q1)*db1*da0 + q4*(2*q0 - q2)*db2*da1 + q4*dq1*dq4 - q4*dq2*dq4 + (-q1 + q2)*dq3*dq4 + (q0*q1 + q2*(q0 - q1))*db1*da1

In [12]:
mv.sBr(Pi,Pi).sort().mapCoeffs(lambda x:x.simplify()/2) == 0


Out[12]:
False

In [107]:
Jac = mv.sBr(Pi,Pi).sort().mapCoeffs(lambda x:x.simplify()/2)

In [ ]:


In [116]:
Jac.mapCoeffs(liftK)


Out[116]:
3*AQ0*da1*da2*db1 + 4*AQ0*da2*db0*da0 + 4*AQ1*da1*db0*da0 - 4*AQ2*db2*da1*da2 - 3*AQ3*da1*db1*da0 + 4*AQ3*db2*da2*da0 - 3*BQ0*da1*db0*db1 - 4*BQ0*db2*da2*db0 + 4*BQ1*db0*db1*da0 - 4*BQ2*db2*da2*db1 + 3*BQ3*db2*da1*db1 - 4*BQ3*db2*db0*da0 - C*da1*dq4*db0 + C*da2*dq4*db1 - C*db2*da1*dq3 + C*dq3*db1*da0 + (2*AQ1 - 2*AQ2)*da2*db1*da0 + (2*BQ1 - 2*BQ2)*db2*da1*db0

In [13]:
Pi_degs = Pi.deg()

In [133]:
reload(emb)
liftK = emb.lift(KHom, kerCoords, embcoords)

In [16]:
for c in sorted(embcoords, key=lambda x:str(x)):
    print(c,'\t',-1*mv.sBr(Pi, mv.Mv(embcoords, {():c})).sort().mapCoeffs(lambda x:x.simplify()))


a0 	 a0*dq0 - 2*a0*dq1 - 2*a1*dq3 - q1*(4*q0 - q1)*db0 + q4**2*db2 - q4*(2*q0 - q1)*db1
a1 	 -a0*dq4 + a1*dq0 - a1*dq1 - a1*dq2 - a2*dq3 - q3*(2*q0 - q1)*db0 - q4*(2*q0 - q2)*db2 + (-q0*q1 - q2*(q0 - q1))*db1
a2 	 -2*a1*dq4 + a2*dq0 - 2*a2*dq2 - q2*(4*q0 - q2)*db2 + q3**2*db0 - q3*(2*q0 - q2)*db1
b0 	 -b0*dq0 + 2*b0*dq1 + 2*b1*dq4 - q1*(-4*q0 + q1)*da0 - q3**2*da2 - q3*(-2*q0 + q1)*da1
b1 	 b0*dq3 - b1*dq0 + b1*dq1 + b1*dq2 + b2*dq4 - q3*(-2*q0 + q2)*da2 - q4*(-2*q0 + q1)*da0 + (q0*q1 + q2*(q0 - q1))*da1
b2 	 2*b1*dq3 - b2*dq0 + 2*b2*dq2 - q2*(-4*q0 + q2)*da2 - q4**2*da0 - q4*(-2*q0 + q2)*da1
q0 	 -a0*da0 - a1*da1 - a2*da2 + b0*db0 + b1*db1 + b2*db2
q1 	 2*a0*da0 + a1*da1 - 2*b0*db0 - b1*db1 - q3*dq3 + q4*dq4
q2 	 a1*da1 + 2*a2*da2 - b1*db1 - 2*b2*db2 + q3*dq3 - q4*dq4
q3 	 2*a1*da0 + a2*da1 - b0*db1 - 2*b1*db2 + q3*dq1 - q3*dq2 + (-q1 + q2)*dq4
q4 	 a0*da1 + 2*a1*da2 - 2*b1*db0 - b2*db1 - q4*dq1 + q4*dq2 + (q1 - q2)*dq3

In [134]:
for qk in K:
    print(qk,'\t',-1*mv.sBr(Pi, mv.Mv(embcoords, {():qk})).sort().mapCoeffs(liftK), end='\n\n')


-a0*b0 + q0*q1**2 	 -2*MQ2*dq3 + 2*MQ6*dq4 + (-AQ0*q1 - AQ1*q3)*da2 + (2*AQ1*q0 - AQ1*q1)*da1 + (-2*BQ1*q0 + BQ1*q1)*db1 + (BQ1*q4 + BQ3*q1)*db2

-a1*b0 + q0*q1*q3 	 AQ0*q0*da1 - AQ0*q3*da2 - MQ0*dq3 + MQ2*dq1 - MQ2*dq2 + (-2*AQ1*q0 + AQ1*q1)*da0 + (BQ0*q0 + BQ1*q3 - C*b0)*db1 + (-BQ0*q4 - 2*BQ1*q0 + BQ3*q3)*db2 + (C*q0 + 2*MQ4 - MQ5)*dq4

-a0*b1 + q0*q1*q4 	 -BQ3*q0*db1 + BQ3*q4*db2 - MQ6*dq1 + MQ6*dq2 + MQ8*dq4 + (2*BQ1*q0 - BQ1*q1)*db0 + (-AQ0*q4 + 2*AQ1*q0 + AQ3*q3)*da2 + (-AQ1*q4 - AQ3*q0 + C*a0)*da1 + (-C*q0 - 2*MQ4 + MQ5)*dq3

-a2*b2 + q0*q2**2 	 2*MQ1*dq3 - 2*MQ7*dq4 + (2*AQ2*q0 - AQ2*q2)*da1 + (-AQ2*q4 - AQ3*q2)*da0 + (BQ0*q2 + BQ2*q3)*db0 + (-2*BQ2*q0 + BQ2*q2)*db1

-a2*b1 + q0*q2*q3 	 -BQ0*q0*db1 + BQ0*q3*db0 + MQ0*dq3 + MQ1*dq1 - MQ1*dq2 + (2*BQ2*q0 - BQ2*q2)*db2 + (-AQ0*q0 - AQ2*q3 + C*a2)*da1 + (AQ0*q4 + 2*AQ2*q0 - AQ3*q3)*da0 + (-C*q0 + MQ3 - 2*MQ4)*dq4

-a1*b2 + q0*q2*q4 	 AQ3*q0*da1 - AQ3*q4*da0 - MQ7*dq1 + MQ7*dq2 - MQ8*dq4 + (-2*AQ2*q0 + AQ2*q2)*da2 + (BQ0*q4 - 2*BQ2*q0 - BQ3*q3)*db0 + (BQ2*q4 + BQ3*q0 - C*b2)*db1 + (C*q0 - MQ3 + 2*MQ4)*dq3

-a2*b0 + q0*q3**2 	 AQ0*q3*da1 - BQ0*q3*db1 + 2*MQ0*dq1 - 2*MQ0*dq2 + (2*MQ1 - 2*MQ2)*dq4 + (-4*AQ0*q0 + AQ0*q1 + AQ1*q3)*da0 + (4*BQ0*q0 - BQ0*q2 - BQ2*q3)*db2

-a1*b1 + q0*q3*q4 	 AQ1*q4*da0 + AQ2*q3*da2 - BQ1*q3*db0 - BQ2*q4*db2 + (-MQ1 + MQ2)*dq3 + (-MQ6 + MQ7)*dq4 + (-AQ1*q0 - AQ2*q0 + C*a1)*da1 + (BQ1*q0 + BQ2*q0 - C*b1)*db1

-a0*b2 + q0*q4**2 	 AQ3*q4*da1 - BQ3*q4*db1 - 2*MQ8*dq1 + 2*MQ8*dq2 + (2*MQ6 - 2*MQ7)*dq3 + (AQ2*q4 - 4*AQ3*q0 + AQ3*q2)*da2 + (-BQ1*q4 + 4*BQ3*q0 - BQ3*q1)*db0

q1*q2 - q3*q4 	 2*AQ0*da2 + 2*AQ3*da0 - 2*BQ0*db0 - 2*BQ3*db2 + (AQ1 + AQ2)*da1 + (-BQ1 - BQ2)*db1

-a0*q3 + a1*q1 	 -AA0*da1 - AQ0*dq3 + AQ1*dq0 - AQ1*dq1 - AQ1*dq2 - AQ3*dq4 + 2*MQ2*db0 + (C*q4 - 2*MQ6)*db2 + (-C*q0 + C*q1 + MQ4 - MQ5)*db1

-a1*q3 + a2*q1 	 2*AA0*da0 + AQ0*dq0 - 2*AQ0*dq2 + 2*MQ0*db0 + (-AQ1 - AQ2)*dq4 + (MQ1 - MQ2)*db1 + (-4*C*q0 + C*q2 - 2*MQ4)*db2

-b0*q4 + b1*q1 	 BB0*db1 + BQ0*dq3 - BQ1*dq0 + BQ1*dq1 + BQ1*dq2 + BQ3*dq4 - 2*MQ6*da0 + (-C*q3 + 2*MQ2)*da2 + (C*q0 - C*q1 - MQ4 + MQ5)*da1

-b1*q4 + b2*q1 	 -2*BB0*db0 - BQ3*dq0 + 2*BQ3*dq2 - 2*MQ8*da0 + (BQ1 + BQ2)*dq3 + (MQ6 - MQ7)*da1 + (4*C*q0 - C*q2 + 2*MQ4)*da2

a0*q2 - a1*q4 	 2*AA0*da2 + AQ3*dq0 - 2*AQ3*dq1 + 2*MQ8*db2 + (-AQ1 - AQ2)*dq3 + (MQ6 - MQ7)*db1 + (-4*C*q0 + C*q1 - 2*MQ4)*db0

a1*q2 - a2*q4 	 -AA0*da1 - AQ0*dq3 + AQ2*dq0 - AQ2*dq1 - AQ2*dq2 - AQ3*dq4 + 2*MQ7*db2 + (C*q3 - 2*MQ1)*db0 + (-C*q0 + C*q2 - MQ3 + MQ4)*db1

b0*q2 - b1*q3 	 -2*BB0*db2 - BQ0*dq0 + 2*BQ0*dq1 - 2*MQ0*da2 + (BQ1 + BQ2)*dq4 + (MQ1 - MQ2)*da1 + (4*C*q0 - C*q1 + 2*MQ4)*da0

b1*q2 - b2*q3 	 BB0*db1 + BQ0*dq3 - BQ2*dq0 + BQ2*dq1 + BQ2*dq2 + BQ3*dq4 - 2*MQ1*da2 + (-C*q4 + 2*MQ7)*da0 + (C*q0 - C*q2 + MQ3 - MQ4)*da1

a0*b1*q3 - a1*b0*q4 	 (2*AA0*b0 - AQ3*q3**2 + 2*MQ0*a0)*da2 + (-AQ1*b0 + BQ0*a1 - MM0)*dq3 + (2*BB0*a0 - BQ0*q4**2 + 2*MQ8*b0)*db2 + (-BQ1*a0 + BQ2*a0 + 2*MM3)*dq4 + (AQ1*q1*q4 + 2*MQ4*a0 - 4*MQ6*a1)*da0 + (BQ1*q1*q3 - 4*MQ2*b1 + 2*MQ4*b0)*db0 + (2*AA0*b1 + AQ1*q3*q4 - C*a0*q3 + MQ1*a0 + MQ2*a0 - 2*MQ4*a1)*da1 + (BB0*a1 + BQ0*q0*q4 + BQ1*q3*q4 - C*b0*q4 - MQ4*b1 + MQ6*b0)*db1

a0*b2*q3 - a1*b1*q4 	 -MM3*dq1 + MM3*dq2 + (AQ1*q4**2 - 2*MQ8*a1)*da0 + (AQ3*b2 - BQ3*a0)*dq4 + (-BQ2*q4**2 + 2*MQ8*b1)*db2 + (4*AA0*b1 - AQ3*q2*q3 + 4*MQ1*a0 - 2*MQ4*a1)*da2 + (-4*BB0*a1 + BQ3*q1*q3 - 4*MQ2*b2 + 2*MQ4*b1)*db0 + (-BQ1*a1 + BQ2*a1 + 2*MM1 - MM2)*dq3 + (AA0*b2 - AQ3*q3*q4 + C*a1*q4 + 2*MQ4*a0 - MQ6*a1 - MQ7*a1)*da1 + (-BB0*a0 + BQ3*q3*q4 - C*b1*q4 - 2*MQ4*b2 + MQ6*b1 + MQ7*b1)*db1

a1*b1*q3 - a2*b0*q4 	 MM0*dq1 - MM0*dq2 + (-AQ0*b0 + BQ0*a2)*dq3 + (-AQ2*q3**2 + 2*MQ0*a1)*da2 + (BQ1*q3**2 - 2*MQ0*b1)*db0 + (4*BQ0*q0*q4 - BQ0*q2*q4 + 2*MQ4*b1)*db2 + (-4*AA0*b1 + AQ0*q1*q4 + 2*MQ4*a1 - 4*MQ6*a2)*da0 + (-BQ1*a1 + BQ2*a1 - MM1 + 2*MM2)*dq4 + (-AA0*b0 + AQ0*q3*q4 - C*a1*q3 + MQ1*a1 + MQ2*a1 - 2*MQ4*a2)*da1 + (BB0*a2 - BQ0*q3*q4 + C*b1*q3 - MQ1*b1 - MQ2*b1 + 2*MQ4*b0)*db1

a1*b2*q3 - a2*b1*q4 	 (-2*AA0*b2 + AQ0*q4**2 - 2*MQ8*a2)*da0 + (-AQ0*b1 + BQ2*a2 + MM0)*dq3 + (AQ2*b2 - BQ3*a1 - MM3)*dq4 + (-2*BB0*a2 + BQ3*q3**2 - 2*MQ0*b2)*db0 + (-AQ2*q2*q3 + 4*MQ1*a1 - 2*MQ4*a2)*da2 + (-BQ2*q2*q4 - 2*MQ4*b2 + 4*MQ7*b1)*db2 + (-2*AA0*b1 - AQ2*q3*q4 + C*a2*q4 + 2*MQ4*a1 - MQ6*a2 - MQ7*a2)*da1 + (-2*BB0*a1 - BQ2*q3*q4 + C*b2*q3 - MQ1*b2 - MQ2*b2 + 2*MQ4*b1)*db1

a0*a2 - a1**2 	 2*AA0*dq0 - 2*AA0*dq1 - 2*AA0*dq2 + (-4*AQ0*q0 + AQ0*q1 - AQ1*q3)*db0 + (-AQ2*q4 - 4*AQ3*q0 + AQ3*q2)*db2 + (AQ0*q4 + 2*AQ1*q0 + 2*AQ2*q0 + AQ3*q3 - 2*C*a1)*db1

b0*b2 - b1**2 	 -2*BB0*dq0 + 2*BB0*dq1 + 2*BB0*dq2 + (4*BQ0*q0 - BQ0*q2 + BQ2*q3)*da2 + (BQ1*q4 + 4*BQ3*q0 - BQ3*q1)*da0 + (-BQ0*q4 - 2*BQ1*q0 - 2*BQ2*q0 - BQ3*q3 + 2*C*b1)*da1


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]: