I have some concerns about certain results I saw in my initial tests of the Gaigen code (via python). Any problems should be simple enough to diagnose.


In [2]:
import spacetime

First, construct the usual basis vectors


In [3]:
t = spacetime.mv(); x = spacetime.mv(); y=spacetime.mv(); z=spacetime.mv();
t.set_gamma_0(1); x.set_gamma_1(1); y.set_gamma_2(1); z.set_gamma_3(1);

Next, look at the various products between them


In [4]:
names = ['t','x','y','z']
for i,v in enumerate([t,x,y,z]):
    for j,w in enumerate([t,x,y,z]):
        print("{0}%{1}={2}, {0}^{1}={3}, {0}*{1}={4}".format(names[i], names[j], v%w, v^w, v*w))


t%t= -  1, t^t=0, t*t= -  1
t%x=0, t^x= 1*gamma_0^gamma_1, t*x= 1*gamma_0^gamma_1
t%y=0, t^y= 1*gamma_0^gamma_2, t*y= 1*gamma_0^gamma_2
t%z=0, t^z= 1*gamma_0^gamma_3, t*z= 1*gamma_0^gamma_3
x%t=0, x^t= -  1*gamma_0^gamma_1, x*t= -  1*gamma_0^gamma_1
x%x= 1, x^x=0, x*x= 1
x%y=0, x^y= 1*gamma_1^gamma_2, x*y= 1*gamma_1^gamma_2
x%z=0, x^z= 1*gamma_1^gamma_3, x*z= 1*gamma_1^gamma_3
y%t=0, y^t= -  1*gamma_0^gamma_2, y*t= -  1*gamma_0^gamma_2
y%x=0, y^x= -  1*gamma_1^gamma_2, y*x= -  1*gamma_1^gamma_2
y%y= 1, y^y=0, y*y= 1
y%z=0, y^z= 1*gamma_2^gamma_3, y*z= 1*gamma_2^gamma_3
z%t=0, z^t= -  1*gamma_0^gamma_3, z*t= -  1*gamma_0^gamma_3
z%x=0, z^x= -  1*gamma_1^gamma_3, z*x= -  1*gamma_1^gamma_3
z%y=0, z^y= -  1*gamma_2^gamma_3, z*y= -  1*gamma_2^gamma_3
z%z= 1, z^z=0, z*z= 1

That all looks good. But the problems I noticed seemed to have to do with exp. So let's try out some important operations.


In [5]:
B = spacetime.mv();
B.set_gamma_1_gamma_2(pi/4.)
R = spacetime.exp(-B)
print(R)


0.707106781186548 - 0.707106781186547*gamma_1^gamma_2

In [6]:
for v in [t,x,y,z]:
    print(R*v*spacetime.reverse(R))


 1*gamma_0
2.22044604925031e-16*gamma_1 +  1*gamma_2
 -  1*gamma_1 + 2.22044604925031e-16*gamma_2
 1*gamma_3

Here, $R$ represents a rotation by $\pi/2$ about the $z$ axis. And we set that it behaves appropriately when rotating any of the basis vectors. Let's see if we just combine any two of the basis vectors.


In [7]:
for i,v in enumerate([t,x,y,z]):
    for j,w in enumerate([t,x,y,z]):
        u = (v+w)/sqrt(2)
        print("v=({0}+{1})/sqrt(2)={2}\tR*u*Rbar={3}".format(names[i], names[j], u, R*u*spacetime.reverse(R)))


v=(t+t)/sqrt(2)=1.41421356237309*gamma_0	R*u*Rbar=1.41421356237309*gamma_0
v=(t+x)/sqrt(2)=0.707106781186547*gamma_0 + 0.707106781186547*gamma_1	R*u*Rbar=0.707106781186547*gamma_0 + 1.11022302462516e-16*gamma_1 + 0.707106781186547*gamma_2
v=(t+y)/sqrt(2)=0.707106781186547*gamma_0 + 0.707106781186547*gamma_2	R*u*Rbar=0.707106781186547*gamma_0 - 0.707106781186547*gamma_1 + 1.11022302462516e-16*gamma_2
v=(t+z)/sqrt(2)=0.707106781186547*gamma_0 + 0.707106781186547*gamma_3	R*u*Rbar=0.707106781186547*gamma_0 + 0.707106781186547*gamma_3
v=(x+t)/sqrt(2)=0.707106781186547*gamma_0 + 0.707106781186547*gamma_1	R*u*Rbar=0.707106781186547*gamma_0 + 1.11022302462516e-16*gamma_1 + 0.707106781186547*gamma_2
v=(x+x)/sqrt(2)=1.41421356237309*gamma_1	R*u*Rbar=2.22044604925031e-16*gamma_1 + 1.41421356237309*gamma_2
v=(x+y)/sqrt(2)=0.707106781186547*gamma_1 + 0.707106781186547*gamma_2	R*u*Rbar= - 0.707106781186547*gamma_1 + 0.707106781186548*gamma_2
v=(x+z)/sqrt(2)=0.707106781186547*gamma_1 + 0.707106781186547*gamma_3	R*u*Rbar=1.11022302462516e-16*gamma_1 + 0.707106781186547*gamma_2 + 0.707106781186547*gamma_3
v=(y+t)/sqrt(2)=0.707106781186547*gamma_0 + 0.707106781186547*gamma_2	R*u*Rbar=0.707106781186547*gamma_0 - 0.707106781186547*gamma_1 + 1.11022302462516e-16*gamma_2
v=(y+x)/sqrt(2)=0.707106781186547*gamma_1 + 0.707106781186547*gamma_2	R*u*Rbar= - 0.707106781186547*gamma_1 + 0.707106781186548*gamma_2
v=(y+y)/sqrt(2)=1.41421356237309*gamma_2	R*u*Rbar= - 1.41421356237309*gamma_1 + 2.22044604925031e-16*gamma_2
v=(y+z)/sqrt(2)=0.707106781186547*gamma_2 + 0.707106781186547*gamma_3	R*u*Rbar= - 0.707106781186547*gamma_1 + 1.11022302462516e-16*gamma_2 + 0.707106781186547*gamma_3
v=(z+t)/sqrt(2)=0.707106781186547*gamma_0 + 0.707106781186547*gamma_3	R*u*Rbar=0.707106781186547*gamma_0 + 0.707106781186547*gamma_3
v=(z+x)/sqrt(2)=0.707106781186547*gamma_1 + 0.707106781186547*gamma_3	R*u*Rbar=1.11022302462516e-16*gamma_1 + 0.707106781186547*gamma_2 + 0.707106781186547*gamma_3
v=(z+y)/sqrt(2)=0.707106781186547*gamma_2 + 0.707106781186547*gamma_3	R*u*Rbar= - 0.707106781186547*gamma_1 + 1.11022302462516e-16*gamma_2 + 0.707106781186547*gamma_3
v=(z+z)/sqrt(2)=1.41421356237309*gamma_3	R*u*Rbar=1.41421356237309*gamma_3

These all look fine to me.


In [8]:
for v in [t,x,y,z]:
    print(spacetime.norm(v))
    print(spacetime.norm2(v))


 1
 -  1
 1
 1
 1
 1
 1
 1

In [9]:
beta = 0.5
alpha = arctanh(beta)
gamma = 1./sqrt(1-beta**2)
B = spacetime.mv();
B.set_gamma_0_gamma_3(alpha/2.)
R = spacetime.exp(-B)
print(B)
print(R)


0.274653072167027*gamma_0^gamma_3
1.03795484930204 - 0.27811916365045*gamma_0^gamma_3

In [10]:
alpha


Out[10]:
0.54930614433405489

In [11]:
cosh(-alpha/2.),sinh(-alpha/2.)


Out[11]:
(1.0379548493020425, -0.27811916365044997)

In [12]:
I = spacetime.mv()
I.set_gamma_0_gamma_1_gamma_2_gamma_3(1.0)
print(exp(1.j))
print(spacetime.exp(I))
print(exp(1.j*pi/4.))
print(spacetime.exp(I*pi/4.))


(0.540302305868+0.841470984808j)
0.54030230586814 + 0.841470984807897*gamma_0^gamma_1^gamma_2^gamma_3
(0.707106781187+0.707106781187j)
0.707106781186548 + 0.707106781186547*gamma_0^gamma_1^gamma_2^gamma_3

In [13]:
tmp = spacetime.mv()
tmp.set_scalar(1.0/sqrt(2)).set_gamma_0_gamma_1_gamma_2_gamma_3(1.0/sqrt(2))
print(tmp)
print(exp(1./sqrt(2)+1.j/sqrt(2)))
print(spacetime.exp(tmp))


0.707106781186547 + 0.707106781186547*gamma_0^gamma_1^gamma_2^gamma_3
(1.54186345705+1.31753840878j)
1.70710678118655 + 0.707106781186547*gamma_0^gamma_1^gamma_2^gamma_3

That's way wrong... I don't know what to make of that. I even tried the "Euclidean-metric" version of the exponential.


In [15]:
I*I*I


Out[15]:
 -  1*gamma_0^gamma_1^gamma_2^gamma_3

In [16]:
tmp*tmp


Out[16]:
 1*gamma_0^gamma_1^gamma_2^gamma_3

In [17]:
tmp2= 1./sqrt(2)+1.j/sqrt(2)

In [18]:
tmp2*tmp2


Out[18]:
0.99999999999999978j

In [19]:
from math import factorial
def powtmp(tmp,i):
    c=spacetime.mv()
    c.set_scalar(1.0)
    for i in range(i):
        c = c*tmp
    return c

In [20]:
[powtmp(tmp,i)/factorial(i) for i in range(12)]
exptmp = spacetime.mv()
for i in range(18):
    exptmp = exptmp + powtmp(tmp,i)/factorial(i)
exptmp


Out[20]:
1.54186345704563 + 1.31753840877988*gamma_0^gamma_1^gamma_2^gamma_3

In [21]:
exp(1./sqrt(2)+1.j/sqrt(2))


Out[21]:
(1.5418634570456315+1.3175384087798807j)

In [22]:
tmp*spacetime.reverse(tmp)


Out[22]:
 1*gamma_0^gamma_1^gamma_2^gamma_3

In [23]:
I*spacetime.reverse(I)


Out[23]:
 -  1

In [24]:
spacetime.norm2(x^y)


Out[24]:
 1

In [27]:
spacetime.gradeInvolution(I)


Out[27]:
 1*gamma_0^gamma_1^gamma_2^gamma_3

Okay, so exponentials involving the pseudoscalar aren't going to work. The reason is that the logic Gaigen uses depends on the norm and/or norm2. Now, norm2 is defined as $\left\langle X\, \tilde{X} \right\rangle_0$. But $I$ is invariant under reversal, whereas any given bivector, for example, is not. So we can expect different results from the logic. Of course, the exponential is defined without reference to a reverse, so the results for $I$ and a spatial bivector should actually be identical, except that the bivector should be replaced by the $I$. But this will not be the case with the code produced by Gaigen.