Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/recog/misc/colva/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 22.0.2025 mit Größe 6 kB image not shown  

Quelle  ProbGen.g   Sprache: unbekannt

 
findnpe := function(name)
# Finds n,p and e from the name
 local v1,v2,n,q,p,e;

 v1 := SplitString(name,"_")[2];
 v2 := SplitString(v1,"(");
 n := Int(v2[1]);
 q := PrimePowersInt(Int(SplitString(v2[2],")")[1]));
 p := q[1]; e := q[2];
 return [n,p,e];
end;




SchurMultiplierOrder := function(name)
# returns the order of schur multiplier of the simple group of give name
 local n,p,f,d,npf,q,v;

# First the sporadics

 if name in ["M_11","M_23","M_24","Co_3","Co_2","He","Fi_23"
,"HN","Th","M","J_1","Ly","J_4"] then
   return 1;
 elif name in ["M_12","J_2","Co_1","B","Ru"] then return 2;
 elif name in ["McL","ON","J_3"] then return 3;
 elif name in ["Suz","Fi_22"] then return 6;
 elif name in ["M_22"] then return 12;
 fi;

# Alternating groups
 if name[1]='A' then
   n := Int(SplitString(name,"_")[2]);
   if n in [6,7] then return 6;
   else return 2;
   fi;
 fi;

# SL

 if name[1]='L' then
   npf := findnpe(name);
   n := npf[1]; p := npf[2]; f := npf[3];
   if n=2 then
     d := GcdInt(2,p^f-1);
     if p=2 and f=2 then return 2*d;
     elif p=3 and f=2 then return 3*d;
     else return d;
     fi;
   else
     d := GcdInt(n,p^f-1);
     if n=3 and p=2 and f=1 then return 2*d;
     elif n=3 and p=2 and f=2 then return 4^2*d;
     elif n=4 and p=2 and f=1 then return 2*d;
     else return d;
     fi;
   fi;
 fi;

# SU
 if name[1]='U' then
   npf := findnpe(name);
   n := npf[1]-1; p := npf[2]; f := npf[3]; q := p^f;
   d := GcdInt(n+1,q+1);
   if [n,p,f]=[3,2,1] then return 2*d;
   elif [n,p,f]=[3,3,1] then return 3^2*d;
   elif [n,p,f]=[5,2,1] then return 2^2*d;
   else return d;
   fi;
 fi;

# Sp
 if name[1]='S' then
   npf := findnpe(name);
   n := (npf[1])/2; p := npf[2]; f := npf[3]; q := p^f;
   d := GcdInt(2,q-1);
   if [n,p,f]=[3,2,1] then return 2*d;
   else
     return d;
   fi;
 fi;

# Omega
 v := SplitString(name,"_");
 if v[1]="O" then
   npf := findnpe(name);
   n := (npf[1]-1)/2; p := npf[2]; f := npf[3]; q := p^f;
   d := GcdInt(2,q-1);
   if [n,p,f] in [[2,2,1],[3,2,1]] then return 2*d;
   elif [n,p,f]=[3,3,1] then return 3*d;
   else return d;
   fi;
 fi;



# Omega^+
 if v[1]="O^+" then
   npf := findnpe(name);
   n := npf[1]/2; p := npf[2]; f := npf[3]; q := p^f;
   if IsEvenInt(n) then
     d := GcdInt(2,q-1)^2;
     if [n,p,f]=[4,2,1] then return 2^2*d;
     else return d;
     fi;
   else
     d := GcdInt(4,q^n-1);
     return d;
   fi;
 fi;

# Omega^-
 if v[1]="O^-" then
   npf := findnpe(name);
   n := npf[1]; p := npf[2]; f := npf[3]; q := p^f;
   d := GcdInt(4,q^n+1);
   return d;
 fi;

## Given up - this has become very boring - can't be bothered to do the exceptionals!!!

 return 6;
end;

OuterOrderBound := function(str)
## Given a simple group defined by str compute an upper bound for the order of Out(G) using the Stefan Kohl paper
# Could probably do better using the ATLAS
 local v1,f,n,npf,p;

  if str[1]='A' then
# Alternating groups
    n := Int(SplitString(str,"_")[2]);
    if n=6 then return 4;
    else return 2;
    fi;
  elif str in
  ["M_11","M_23","M_24","Co_3","Co_2","He","Fi_23"
,"HN","Th","M","J_1","Ly","J_4","M_12","J_2","Co_1","B","Ru",
"McL","ON","J_3","Suz","Fi_22","M_22"] then return 2;
  elif str[1]='L' or str[1]='U' then
# PSL
    npf := findnpe(str);
    n := npf[1]; f := npf[3];
    if n=2 then return 2*f;
    elif n=3 then return 6*f;
    elif n=4 then return 8*f;
    else return 2*(n+1)*f;
    fi;
  elif str[1]='C' or (str[1]='O' and str[2]="_") then
    npf := findnpe(str);
    return 2*npf[3];
  elif str[1]='O' and str[3]='+' then
    npf := findnpe(str);
    n := npf[1]; f := npf[3];
    if n=8 then
      return 24*f;
    else
      return 8*f;
    fi;
  elif str[1]='2' and str[2]='B' then
    v1 := SplitString(str,"(")[2];
    f := PrimePowersInt(Int(SplitString(v1,")")[1]))[2];
    return f;
  else
    v1 := SplitString(str,"(")[2];
    f := PrimePowersInt(Int(SplitString(v1,")")[1]))[2];
    return 6*f;
  fi;
end;

SimpleGroupOrder := function(name)
  local npe,n;

  if name in
   ["M_11","M_23","M_24","Co_3","Co_2","He","Fi_23"
,"HN","Th","M","J_1","Ly","J_4","M_12","J_2","Co_1","B","Ru",
"McL","ON","J_3","Suz","Fi_22","M_22"] then
    name:=Concatenation(SplitString(name,"_"));
    return Size(CharacterTable(name));
  fi;

  if name[1]='A' then
    n := Int(SplitString(name,"_")[2]);
    return Factorial(n)/2;
  elif name[1]='L' then
    npe := findnpe(name);
    return Size(SL(npe[1],npe[2]^npe[3]))/GcdInt(npe[1],npe[2]^npe[3]-1);
  elif name[1]='S' then
    npe := findnpe(name);
    return Size(Sp(npe[1],npe[2]^npe[3]))/GcdInt(2,npe[2]^npe[3]-1);
  elif name[1]='U' then
    npe := findnpe(name);
    return Size(SU(npe[1],npe[2]^npe[3]))/GcdInt(npe[1],npe[2]^npe[3]+1);
  elif name[1]='O' then
    if name[2]='_' then
      npe := findnpe(name);
      return Size(SO(npe[1],npe[2]^npe[3]))/GcdInt(2,npe[2]^npe[3]-1);
    elif name[3]='+' then
      npe := findnpe(name);
      return Size(SO(1,npe[1],npe[2]^npe[3]))/(2*GcdInt(2,(npe[2]^npe[3])^(npe[1]/1)-1));
    elif name[3]='-' then
      npe := findnpe(name);
      return Size(SO(-1,npe[1],npe[2]^npe[3]))/(2*GcdInt(2,(npe[2]^npe[3])^(npe[1]/1)+1));
    fi;
  fi;

  Error("Don't know any exceptional groups");

end;

ProbGenNonAb :=function(str,m,k)
## Returns an underestimate of the probability of k random generators generating the simple group given by str.  Assumes that the probability of randomly generating a simple group with 3 generators is > 833/900 = P_3(A_6)
# Require k to be greater than 3
  local Ord_G, Out_G, C ,psi_k,y;

  Ord_G:=SimpleGroupOrder(str);
  Out_G:=OuterOrderBound(str);
  C:=833/900;
  psi_k:=1-(1-C)^Int(k/3);
  if m > 1 then
    y:=Product(List([1..(m-1)],i->1-i*Out_G/(Ord_G^(k-1)*psi_k)));
  else y:=1;
  fi;
  return psi_k*y;
end;


ProbGenAb := function(q,r,k)
## Returns the probability of k random generators generating Z_q^r
  if k<r then return 0; fi;
  return Product(List([1..r],l->1-q^(l-1)/q^k));
end;


RequiredNumberOfGens := function(T,e)
# T is a list of tuples containing names and the number of copies #of simple groups
#i.e. T=[*["A_5",3],2^7*] is 3 copies of Alt(5) and 7 copies of Z_2
#  Returns k such that k generators will generate G with #probability gt 1-e
  local k,p,q,f,l;
  k:=4;
  repeat
    p:=1;
    for l in T do
      if not IsList(l) then
        q := PrimePowersInt(l);
        f := q[2];  q := q[1];
        p:=p*ProbGenAb(q,f,k);
      else
        p:=p*ProbGenNonAb(l[1],l[2],k);
      fi;
    od;
    if p>1-e then return k; fi;
    k := k+1;
  until k=1000;
  Error("k is very large > 1000");
end;


[ Dauer der Verarbeitung: 0.3 Sekunden  (vorverarbeitet)  ]