B3 Analysis

3145 days ago by jimlb

First we must define $Sp(4)$ as in Taylor so that we can use his cosets. It is with respect to $J = \begin{pmatrix} 0_2 & 1_2 \\ -1_2 & 0_2 \end{pmatrix}$. The following program inputs a prime $p$ and outputs $Sp_4(\mathbb{F}_p)$.

def Sp4(p): M=Mat(GF(p),4,4); J=M([[0,0,1,0],[0,0,0,1],[-1,0,0,0],[0,-1,0,0]]); Sp4=[]; for g in SL(4,GF(p)): if M(g)*J*M(g).transpose() == J: Sp4.append(M(g)) return Sp4
G=Sp4(2);

We make sure it has the correct number of elements.

len(G);
 $\newcommand{\Bold}[1]{\mathbf{#1}}720$

We define the space of 4 by 4 matrices.

M=Mat(GF(2),4,4);M
 $\newcommand{\Bold}[1]{\mathbf{#1}}\mathrm{Mat}_{4\times 4}(\Bold{F}_{2})$

The representatives in $\mathcal{B}_3$ (over $\mathbb{F}_2$) are given by the following:

B3=[];
for x in GF(2): B3.append(M([[1,0,x,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]])*M([[2,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,2]]))
B3;
 $\newcommand{\Bold}[1]{\mathbf{#1}}\left[\left(\begin{array}{rrrr} 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 \end{array}\right), \left(\begin{array}{rrrr} 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 \end{array}\right)\right]$

We will also have need of $\mathcal{B}_1$, so we define that as well.

B1=[];
for z in GF(2): for x in GF(2): for y in GF(2): B1.append(M([[1,0,x,y],[0,1,y,z],[0,0,1,0],[0,0,0,1]])*M([[2,0,0,0],[0,2,0,0],[0,0,1,0],[0,0,0,1]]));
B1;
 $\newcommand{\Bold}[1]{\mathbf{#1}}\left[\left(\begin{array}{rrrr} 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right), \left(\begin{array}{rrrr} 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right), \left(\begin{array}{rrrr} 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right), \left(\begin{array}{rrrr} 0 & 0 & 1 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right), \left(\begin{array}{rrrr} 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right), \left(\begin{array}{rrrr} 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right), \left(\begin{array}{rrrr} 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right), \left(\begin{array}{rrrr} 0 & 0 & 1 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right)\right]$

We now want to consider the image of the injection $\sigma_{g}: \mathcal{B}_1 \rightarrow \mathcal{B}$ induced by some $g \in K_0(1)$. Since our version of $Sp(4)$ is now a list, we cannot pick an element randomly.  So just put $G[j]$ for $j$ being any number between $0$ and $719$. The following program takes as input an element of $G$ in the form $G[j]$ and outputs the elements in $\mathcal{B}_3$ that lie in the image of $\sigma_{g}$.

def coset_partition(g): S3=[]; for h in G: for b1 in B1: for b3 in B3: if g*b1 == b3*h: if b3 not in S3: S3.append(b3) return S3
G[19];
 $\newcommand{\Bold}[1]{\mathbf{#1}}\left(\begin{array}{rrrr} 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 1 & 0 & 1 & 1 \\ 0 & 1 & 1 & 1 \end{array}\right)$
S3=coset_partition(G[19]);
S3
 $\newcommand{\Bold}[1]{\mathbf{#1}}\left[\left(\begin{array}{rrrr} 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 \end{array}\right)\right]$

We can also run this more delicately to get the distribution for how they partition.  We first run it over all $g$ with determinant of $C$ not being 0 to see we really hit $p-1$ elements in $\mathcal{B}_3$.

The program detCnotzero inputs the set $G$ and outputs all the elements of $G$ with $C$ having nonzero determinant.

def detCnotzero(G): S=[]; for g in G: if g[2,0]*g[3,1]-g[2,1]*g[3,0]!=0: S.append(M(g)) return S
S=detCnotzero(G);
len(S)
 $\newcommand{\Bold}[1]{\mathbf{#1}}384$

There are 384 elements of $G$ that have determinant of $C$ not zero.

The next command gives what elements in $\mathcal{B}_3$ are hit by $g$ as we run over $g*b_1 = b_3 *h$ for $g$ having determinant of $C$ nonzero, $b_1 \in\mathcal{B}_1$, $b_3 \in \mathcal{B}_3$ and $h \in G$. Note it prints them all out because I wanted to make sure the program was running correctly.  After this program is one that only spits something out if we have a counterexample to what we expect.

for g in S: T=[]; for h in G: for b1 in B1: for b3 in B3: if g*b1 == b3*h: if b3 not in T: T.append(b3); if len(T)!=1: print T; else: print "We are good because for g= "; print g; print "we have T="; print T[0];
 WARNING: Output truncated! full_output.txt We are good because for g= [0 0 1 0] [0 0 0 1] [1 0 0 0] [0 1 0 0] we have T= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 0 1 0] [0 1 0 1] [1 0 0 0] [0 1 0 0] we have T= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 1 0 0] [0 0 1 0] [0 1 0 1] [1 0 0 0] we have T= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 1 0 0] [1 0 1 0] [0 1 0 1] [1 0 0 0] we have T= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 0 1 0] [0 0 0 1] [1 0 1 0] [0 1 0 0] we have T= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 0 0 1] [1 0 0 0] [0 1 0 0] [1 0 1 0] we have T= [0 0 1 0] [0 1 0 0] [0 0 1 0] ... We are good because for g= [1 0 0 1] [1 0 0 0] [1 1 0 1] [0 1 1 0] we have T= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [1 0 0 0] [0 1 0 1] [0 1 1 1] [1 0 0 1] we have T= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 1 1 1] [1 0 0 1] [1 0 0 0] [1 1 0 0] we have T= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [1 1 1 0] [0 1 1 1] [0 1 0 1] [1 0 1 0] we have T= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 0 1 1] [0 0 0 1] [1 0 1 1] [1 1 0 0] we have T= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [1 1 0 0] [0 1 0 0] [0 1 1 0] [1 0 1 1] we have T= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] WARNING: Output truncated! full_output.txt We are good because for g= [0 0 1 0] [0 0 0 1] [1 0 0 0] [0 1 0 0] we have T= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 0 1 0] [0 1 0 1] [1 0 0 0] [0 1 0 0] we have T= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 1 0 0] [0 0 1 0] [0 1 0 1] [1 0 0 0] we have T= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 1 0 0] [1 0 1 0] [0 1 0 1] [1 0 0 0] we have T= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 0 1 0] [0 0 0 1] [1 0 1 0] [0 1 0 0] we have T= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 0 0 1] [1 0 0 0] [0 1 0 0] [1 0 1 0] we have T= [0 0 1 0] [0 1 0 0] [0 0 1 0] ... We are good because for g= [1 0 0 1] [1 0 0 0] [1 1 0 1] [0 1 1 0] we have T= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [1 0 0 0] [0 1 0 1] [0 1 1 1] [1 0 0 1] we have T= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 1 1 1] [1 0 0 1] [1 0 0 0] [1 1 0 0] we have T= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [1 1 1 0] [0 1 1 1] [0 1 0 1] [1 0 1 0] we have T= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 0 1 1] [0 0 0 1] [1 0 1 1] [1 1 0 0] we have T= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [1 1 0 0] [0 1 0 0] [0 1 1 0] [1 0 1 1] we have T= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0]
for g in S: T=[]; for h in G: for b1 in B1: for b3 in B3: if g*b1 == b3*h: if b3 not in T: T.append(b3); if len(T)!=1: print T;

The next step is to deal with the case when $g$ satisfies that $C$ has determinant 0, but $F = \begin{pmatrix} a_{11} & a_{12} \\ c_{21} & c_{22} \end{pmatrix}$ has nonzero determinant.

def detCzerodetFnot(G): S=[]; for g in G: if g[2,0]*g[3,1]-g[2,1]*g[3,0]==0: if g[0,0]*g[3,1]-g[0,1]*g[3,0] !=0: S.append(M(g)) return S
S=detCzerodetFnot(G)
len(S);
 $\newcommand{\Bold}[1]{\mathbf{#1}}192$

There are 192 elements of $G$ that satisfy $det(C) = 0$ but $det(F) \neq 0$.  We now check that we get $s_3 = p$ in this case.

for g in S: T=[]; for h in G: for b1 in B1: for b3 in B3: if g*b1 == b3*h: if b3 not in T: T.append(b3); if len(T)!=2: print "We have trouble because T="; print T; else: print "We are good because for g= "; print g; print "we have T[0]="; print T[0]; print "we have T[1]="; print T[1];
 WARNING: Output truncated! full_output.txt We are good because for g= [0 1 0 0] [0 0 1 0] [0 0 0 1] [1 0 0 0] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 1 0 0] [1 0 1 0] [0 0 0 1] [1 0 0 0] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [1 0 0 0] [0 1 0 0] [0 0 1 0] [0 1 0 1] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 1 0 0] [0 0 1 0] [0 0 0 1] [1 0 1 0] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] ... We are good because for g= [0 1 1 0] [1 1 1 1] [0 0 1 1] [1 1 0 1] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 1 1 0] [0 0 1 0] [0 0 1 1] [1 1 0 1] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [1 1 1 0] [0 0 1 1] [0 0 0 1] [1 0 0 1] we have T[0]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [1 0 1 1] [1 1 0 0] [0 1 0 0] [0 1 1 0] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] WARNING: Output truncated! full_output.txt We are good because for g= [0 1 0 0] [0 0 1 0] [0 0 0 1] [1 0 0 0] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 1 0 0] [1 0 1 0] [0 0 0 1] [1 0 0 0] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [1 0 0 0] [0 1 0 0] [0 0 1 0] [0 1 0 1] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 1 0 0] [0 0 1 0] [0 0 0 1] [1 0 1 0] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] ... We are good because for g= [0 1 1 0] [1 1 1 1] [0 0 1 1] [1 1 0 1] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [0 1 1 0] [0 0 1 0] [0 0 1 1] [1 1 0 1] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [1 1 1 0] [0 0 1 1] [0 0 0 1] [1 0 0 1] we have T[0]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] We are good because for g= [1 0 1 1] [1 1 0 0] [0 1 0 0] [0 1 1 0] we have T[0]= [0 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 0] we have T[1]= [0 0 1 0] [0 1 0 0] [0 0 1 0] [0 0 0 0]
for g in S: T=[]; for h in G: for b1 in B1: for b3 in B3: if g*b1 == b3*h: if b3 not in T: T.append(b3); if len(T)!=2: print T;
def detCzerodetFzero(G): S=[]; for g in G: if g[2,0]*g[3,1]-g[2,1]*g[3,0]==0: if g[0,0]*g[3,1]-g[0,1]*g[3,0] ==0: S.append(M(g)) return S
S=detCzerodetFzero(G)
len(S);
 $\newcommand{\Bold}[1]{\mathbf{#1}}144$

The following code checks that $s_3 = 0$ in the case that $det(C) = det(F) = 0$.

for g in S: T=[]; for h in G: for b1 in B1: for b3 in B3: if g*b1 == b3*h: if b3 not in T: T.append(b3); if len(T)!=0: print T;

Only stuff above this line is relevant for the check.

g = Matrix(SR,[[a11,a12,b11,b12],[a21,a22,b21,b22],[c11,c12,d11,d12],[c21,c22,d21,d22]]);g;
 $\newcommand{\Bold}[1]{\mathbf{#1}}\left(\begin{array}{rrrr} a_{11} & a_{12} & b_{11} & b_{12} \\ a_{21} & a_{22} & b_{21} & b_{22} \\ c_{11} & c_{12} & d_{11} & d_{12} \\ c_{21} & c_{22} & d_{21} & d_{22} \end{array}\right)$
def Y1(x,g): return x*(g[2,0]*g[3,1]-g[2,1]*g[3,0]) + (g[0,1]*g[3,0]-g[0,0]*g[3,1])
def Y2(x,g): return x*(g[3,0]*g[2,3]- g[2,0]*g[3,3]) + (g[0,0]*g[3,3] - g[0,3] *g[3,0])
Y2(1,g)
 $\newcommand{\Bold}[1]{\mathbf{#1}}a_{11} d_{22} - b_{12} c_{21} - c_{11} d_{22} + c_{21} d_{12}$
S1=[]
S2=[]
for g in G: for x in GF(2): if Y1(x,g) == 0: if Y2(x,g) == 0: S1.append(x) S2.append(g)
len(S1);
 $\newcommand{\Bold}[1]{\mathbf{#1}}288$
len(S2);
 $\newcommand{\Bold}[1]{\mathbf{#1}}288$
x=S1[1]
g=S2[1];g
 $\newcommand{\Bold}[1]{\mathbf{#1}}\left(\begin{array}{rrrr} 0 & 0 & 0 & 1 \\ 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{array}\right)$
b3=M([[1,0,x,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]])*M([[2,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,2]]);b3
 $\newcommand{\Bold}[1]{\mathbf{#1}}\left(\begin{array}{rrrr} 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 \end{array}\right)$
def coset_partition(g,b): S3=[]; for h in G: for b1 in B1: if g*b1 == b*h: if b1 not in S3: S3.append(b1) return S3
for j in [0..288]: b3=M([[1,0,S1[j],0],[0,1,0,0],[0,0,1,0],[0,0,0,1]])*M([[2,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,2]]) coset_partition(S2[j],b3)
for g in G: A=g[3,1]*g[2,2] - g[3,2]*g[2,1]; B=g[0,1]*g[3,2] - g[0,2]*g[3,1]; if g[2,0]==0: if g[0,0]==0: if g[3,0]==0: if g[3,1] != 0: if A == 0: if B == 0: S.append(g)