Finding automorphisms of a vector space using GAP

69 Views Asked by At

Goal:
Given a $K$-dimensional vector space $V \subseteq \mathbb{F}_2^N$ firstly find the group $A$ of all automorphisms $\alpha_i: V\to V $ and secondly find the subgroup $\widetilde{A} \subseteq A$ of all automorphisms that are permutations.

Note: For $v=[v_0,v_1, v_2, \dots , v_N]\in V$ a permutation would be $\alpha(v)=[v_0,v_2, v_N, \dots , v_1]$. I use cycle notation which in this case is $(1,N,2)$ assuming all other $v_i$ stay in place.


What I tried (with example):
I am using GAP system to compute the solutions. Given a vector space $V$ from generators $g_1=[1,1,0,0]$ and $g_2=[0,0,1,1]$ I first try to find $\widetilde{A}$ by hand. There are three possible permutations $(0,1), (2,3)$ and $(0,2)(1,3)$ as well as any combination of them, so I expect $8$ elements in $\widetilde{A}$.
I construct $V$ like this:

g:=[[Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2)], [0*Z(2), 0*Z(2), Z(2)^0, Z(2)^0]];
V:=VectorSpace(GF(2),g);

Then I compute $A$ by computing all homomorphisms from $V$ to itself.

A:=Hom(GF(2),V,V);

Sadly GAP doesn't tell me the elements of $A$ but rather a string output that doesn't help much. The number of elements is $|A|=16$.

A;
>>End( GF(2), <vector space of dimension 2 over GF(2)> )
Size(A);
>>16

I want to access the elements $\alpha_i \in A$ to further apply the constraint that $\alpha$ has to be a permutation. Furthermore $|A|$ may get large in other scenarios that I'm interested in. For those reasons I ask GAP for generators of $A$. The result is the identity mapping, a matrix homomorphism with $M_1=[[1,0],[0,0]]$ and a matrix homomorphism with $M_2=[[0,1],[1,0]]$

Print(GeneratorsOfAlgebra(A));
>>[ IdentityMapping( VectorSpace( GF(2), [ [ Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2) ], 
      [ 0*Z(2), 0*Z(2), Z(2)^0, Z(2)^0 ] ] ) ), 
  LeftModuleHomomorphismByMatrix( SemiEchelonBasis( VectorSpace( GF(2), 
    [ [ Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, Z(2)^0 ] 
     ] ), [ [ Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2) ], 
      [ 0*Z(2), 0*Z(2), Z(2)^0, Z(2)^0 ] ] ), 
    [ [ Z(2)^0, 0*Z(2) ], [ 0*Z(2), 0*Z(2) ] 
     ], SemiEchelonBasis( VectorSpace( GF(2), 
    [ [ Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, Z(2)^0 ] 
     ] ), [ [ Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2) ], 
      [ 0*Z(2), 0*Z(2), Z(2)^0, Z(2)^0 ] ] ) ), 
  LeftModuleHomomorphismByMatrix( SemiEchelonBasis( VectorSpace( GF(2), 
    [ [ Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, Z(2)^0 ] 
     ] ), [ [ Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2) ], 
      [ 0*Z(2), 0*Z(2), Z(2)^0, Z(2)^0 ] ] ), 
    [ [ 0*Z(2), Z(2)^0 ], [ Z(2)^0, 0*Z(2) ] 
     ], SemiEchelonBasis( VectorSpace( GF(2), 
    [ [ Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, Z(2)^0 ] 
     ] ), [ [ Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2) ], 
      [ 0*Z(2), 0*Z(2), Z(2)^0, Z(2)^0 ] ] ) ) ]

Now I try to construct all $16$ $\alpha_i$ from those generators and this is where I start getting confused. With three generators I can only get $2^3=8$ combinations and not $16$. Also I am not interested in homomorphisms with matrices that don't have full rank since a permutation has to be bijective. The matrix homomorphisms that fulfill the conditions use $M_0=[[1,0],[0,1]]$, $M_2=[[0,1],[1,0]]$, $M_3=[[0,1],[1,1]]$ and $M_4=[[1,1],[1,0]]$.
One can quickly verify that $M_i\cdot [g_1,g_2]$ spans the same vector space $V$ again, so they represent in fact automorphisms. However, these automorphisms are simply linear combinations of the generators and are in general not the premutations that I am looking for. A right sided matrix multiplication would be able to represent the permutations. I tried to look at the dual problem by using generators $h_i$ such that $[g_0,\dots,g_K]\cdot[h_0,\dots,h_{N-K}]^T=0$ but the vector spaces I am interested in are self dual so that doesn't work.


Questions:

  • I can not represent some automorphisms in the form of a left sided matrix multiplication (e.g. the permutation $(0,1)$ in the example above). Instead I would need to apply a right sided matrix multiplication. How can I find these automorphisms with GAP?
  • How can I directly access all elements of the automorphism group $A$ in GAP as shown in the example above?
  • Why do I fail at reconstructing $A$ from it's generators as explained above?
1

There are 1 best solutions below

4
On BEST ANSWER

Some remarks:

  • you can also use End(GF(2), V) instead of Hom(GF(2), V, v) (shouldn't make a difference here, though)
  • if you only want the invertible endomorphisms: those form the unit group of the endomorphism algebra, so:
    gap> g:=[[Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2)], [0*Z(2), 0*Z(2), Z(2)^0, Z(2)^0]];
    [ [ Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, Z(2)^0 ] ]
    gap> V:=VectorSpace(GF(2),g);
    <vector space over GF(2), with 2 generators>
    gap> A:=End(GF(2), V);
    End( GF(2), <vector space of dimension 2 over GF(2)> )
    gap> U:=Units(A);
    <group with 2 generators>
    gap> Size(U);
    6
    
  • this is unsurprising because $V \cong \mathbb{F}_2^2$ and hence $\mathrm{Aut}(V) \cong \mathrm{Aut}(\mathbb{F}_2^2) = \mathrm{GL}_2(\mathbb{F}_2) \cong \mathrm{Sym}(3)$. From this you could indeed just compute the answer by hand quite easily
  • to get all elements of a finite group or algebra or whatever, use AsSet, i.e. here: AsSet(U)
  • your claim that you can only get 2^3 elements from 3 generators is incorrect. E.g. even a single group generator $g$ can give an infinite number of elements ($g, g^2, g^3, \dots, g^0, g^{-1}, g^{-2}, \dots$. And for two elements $g,h$ in general $gh\neq hg$, and so on.

UPDATE 2023-11-11: so it turns out you are not interested in automorphisms of the vector space $V,$ but rather in automorphisms of $\mathbb{F}_2^4$ which are induced by permutations of the coordinates and which also stabilize $V$. You can get those by defining an action of the symmetric group $S_4$ on $\mathbb{F}_2^4$ and a suitable action map, and then asking for the stabilizer:

gap> myAction := {V,g} -> VectorSpace(GF(2),List(Basis(V), v -> Permuted(v, g)));;
gap> S:=Stabilizer(G, V, myAction);
Group([ (1,2), (1,3)(2,4) ])
gap> Size(S);
8
gap> AsSet(S);
[ (), (3,4), (1,2), (1,2)(3,4), (1,3)(2,4), (1,3,2,4), (1,4,2,3), (1,4)(2,3) ]