Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  test.gi   Sprache: unbekannt

 
#############################################################################
##
#W  test.gi               GAP 4 package `cvec'                Max Neunhoeffer
##
##  Copyright (C) 2007  Max Neunhoeffer, Lehrstuhl D f. Math., RWTH Aachen
##  This file is free software, see license information at the end.
##
##  This file contains some tests for the cvecs.
##

CVEC.TEST := rec();   # for regression tests
CVEC.BENCH := rec();  # for benchmarks

CVEC.TEST.ALLCHEAP := function(name,func)
  local p,d;
  for p in Primes do
    if p < CVEC.TEST.LIMIT_ALLFFE then
      Print("Testing ",name," p=",p,", d=1 ...\n");
      func(p,1);
    fi;
  od;
  for p in Primes{[1..20]} do
    if p^2 < CVEC.TEST.LIMIT_ALLFFE then
      Print("Testing ",name," p=",p,", d=2 ...\n");
      func(p,2);
    fi;
  od;
  for p in Primes{[1..9]} do
    if p^3 < CVEC.TEST.LIMIT_ALLFFE then
      Print("Testing ",name," p=",p,", d=3 ...\n");
      func(p,3);
    fi;
  od;
  for p in Primes{[1..4]} do
    if p^4 < CVEC.TEST.LIMIT_ALLFFE then
      Print("Testing ",name," p=",p,", d=4 ...\n");
      func(p,4);
    fi;
  od;
  for p in Primes{[1..3]} do
    if p^5 < CVEC.TEST.LIMIT_ALLFFE then
      Print("Testing ",name," p=",p,", d=5 ...\n");
      func(p,5);
    fi;
  od;
  for p in Primes{[1..2]} do
    if p^6 < CVEC.TEST.LIMIT_ALLFFE then
      Print("Testing ",name," p=",p,", d=6 ...\n");
      func(p,6);
    fi;
  od;
  for p in Primes{[1..2]} do
    if p^7 < CVEC.TEST.LIMIT_ALLFFE then
      Print("Testing ",name," p=",p,", d=7 ...\n");
      func(p,7);
    fi;
  od;
  for d in [8..13] do
    if p^8 < CVEC.TEST.LIMIT_ALLFFE then
      Print("Testing ",name," p=2, d=",d," ...\n");
      func(2,d);
    fi;
  od;
end;

CVEC.TEST.COMPRESSED_ALL := function(name,func)
  local p,d;
  for p in Primes do
      if p < 256 then
          d := 1;
          while p^d <= 256 do
              Print("Testing ",name," COMPRESSED p=",p,", d=",d," ...\n");
              func(p,d);
              d := d + 1;
          od;
      fi;
  od;
end;

CVEC.TEST.LIMIT_ALLFFE := 32768;

CVEC.TEST.ALLFFE := function(name,func)
  local d,p;
  p := 2;
  while p < CVEC.TEST.LIMIT_ALLFFE do   
      # this leaves out 32768 < p < 65536, but this needs
      # too much memory for the GF's in GAP
      d := 1;
      repeat
          Print("Testing ",name," p=",p,", d=",d," ...\n");
          func(p,d);
          d := d + 1;
      until p^d > MAXSIZE_GF_INTERNAL;
      p := NextPrimeInt(p);
  od;
end;
         
CVEC.TEST.ALLCONWAY := function(name,func)
  local d,l,p;
  p := ConwayPolynomial(2,2);
  for p in Filtered([2..Length(CONWAYPOLDATA)],i->IsBound(CONWAYPOLDATA[i])) do
    if p < CVEC.TEST.LIMIT_ALLFFE then
      l := Length(CONWAYPOLDATA[p]);
      for d in Filtered([1..l],i->IsBound(CONWAYPOLDATA[p][i])) do
          Print("Testing ",name," p=",p," d=",d," ...\n");
          func(p,d);
      od;
    fi;
  od;
end;

CVEC.TEST.INTFFE_CONVERSION := function(p,d)
  local c,l,q;
  q := p^d;
  if not(IsPrimePowerInt(q)) or q > MAXSIZE_GF_INTERNAL then
      Error("Test is only for those p^d that are implemented in GAP!");
  fi;
  c := CVEC_NewCVecClass(p,d,q);
  c := c![CVEC_IDX_fieldinfo];
  l := 1*[0..q-1];
  CVEC_INTLI_TO_FFELI(c,l);
  if l <> c![CVEC_IDX_tab2] then
      Print("Alarm: INTLI_TO_FFELI, p=",p," d=",d,"\n");
  fi;
  l := ShallowCopy(c![CVEC_IDX_tab2]);
  CVEC_FFELI_TO_INTLI(c,l);
  if l <> [0..q-1] then
      Print("Alarm: FFELI_TO_INTLI, p=",p," d=",d,"\n");
  fi;
end;

CVEC.TEST.ADD2 := function(p,d)
  local c,q,l,v,w,ll,vv,ww,i;
  q := p^d;
  if not(IsPrimePowerInt(q)) or q > MAXSIZE_GF_INTERNAL then
      Error("Test is only for those p^d that are implemented in GAP!");
  fi;
      
  c := CVEC_NewCVecClass(p,d,q);   # Length is q
  v := CVEC_New(c);
  w := CVEC_New(c);
  l := 1*[0..q-1];
  CVEC_INTREP_TO_CVEC(l,v);
  vv := ShallowCopy(l);
  CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],vv);   # Change numbers into FFEs
  l := 0*[1..q];
  ll := 0*[1..q];
  for i in [0..q-1] do
      CVEC_INTREP_TO_CVEC(l,w);
      ww := ShallowCopy(l);
      CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],ww);
      CVEC_ADD2(w,v,1,q);
      CVEC_CVEC_TO_INTREP(w,ll);
      CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],ll);
      if ll <> vv+ww then
          Print("Alarm: i=",i,"\n");
          Print("ll=",ll,"\nvv+ww=",vv+ww,"\n");
      fi;
      l := l + 1;
  od;
end;

CVEC.TEST.ADD2_COMPRESSED := function(p,d)
  local c,q,l,v,w,ll,vv,ww,i;
  q := p^d;
  if not(IsPrimePowerInt(q)) or q > 256 then
      Error("Only for those p^d for which compressed vectors are in GAP!");
  fi;
      
  c := CVEC_NewCVecClass(p,d,q);   # Length is q
  v := CVEC_New(c);
  w := CVEC_New(c);
  l := 1*[0..q-1];
  CVEC_INTREP_TO_CVEC(l,v);
  vv := ShallowCopy(l);
  CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],vv);   # Change numbers into FFEs
  ConvertToVectorRep(vv);
  l := 0*[1..q];
  for i in [0..q-1] do
      CVEC_INTREP_TO_CVEC(l,w);
      ww := ShallowCopy(l);
      CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],ww);
      ConvertToVectorRep(ww);
      CVEC_ADD2(w,v,1,q);
      ll := 0*[1..q];
      CVEC_CVEC_TO_INTREP(w,ll);
      CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],ll);
      ConvertToVectorRep(ll);
      if ll <> vv+ww then
          Print("Alarm: i=",i,"\n");
          Print("ll=",ll,"\nvv+ww=",vv+ww,"\n");
      fi;
      l := l + 1;
  od;
end;

CVEC.TEST.ADD3 := function(p,d)
  local c,q,l,v,w,ll,vv,ww,i,u;
  q := p^d;
  if not(IsPrimePowerInt(q)) or q > MAXSIZE_GF_INTERNAL then
      Error("Test is only for those p^d that are implemented in GAP!");
  fi;
      
  c := CVEC_NewCVecClass(p,d,q);   # Length is q
  u := CVEC_New(c);
  v := CVEC_New(c);
  w := CVEC_New(c);
  l := 1*[0..q-1];
  CVEC_INTREP_TO_CVEC(l,v);
  vv := ShallowCopy(l);
  CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],vv);   # Change numbers into FFEs
  l := 0*[1..q];
  ll := 0*[1..q];
  for i in [0..q-1] do
      CVEC_INTREP_TO_CVEC(l,w);
      ww := ShallowCopy(l);
      CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],ww);
      CVEC_ADD3(u,w,v);
      CVEC_CVEC_TO_INTREP(u,ll);
      CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],ll);
      if ll <> vv+ww then
          Print("Alarm: i=",i,"\n");
          Print("ll=",ll,"\nvv+ww=",vv+ww,"\n");
      fi;
      l := l + 1;
  od;
end;

CVEC.TEST.ADD3_COMPRESSED := function(p,d)
  local c,q,l,v,w,ll,vv,ww,i,u;
  q := p^d;
  if not(IsPrimePowerInt(q)) or q > 256 then
      Error("Only for those p^d for which compressed vectors are in GAP!");
  fi;
      
  c := CVEC_NewCVecClass(p,d,q);   # Length is q
  u := CVEC_New(c);
  v := CVEC_New(c);
  w := CVEC_New(c);
  l := 1*[0..q-1];
  CVEC_INTREP_TO_CVEC(l,v);
  vv := ShallowCopy(l);
  CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],vv);   # Change numbers into FFEs
  ConvertToVectorRep(vv);
  l := 0*[1..q];
  for i in [0..q-1] do
      CVEC_INTREP_TO_CVEC(l,w);
      ww := ShallowCopy(l);
      CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],ww);
      ConvertToVectorRep(ww);
      CVEC_ADD3(u,w,v);
      ll := 0*[1..q];
      CVEC_CVEC_TO_INTREP(u,ll);
      CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],ll);
      ConvertToVectorRep(ll);
      if ll <> vv+ww then
          Print("Alarm: i=",i,"\n");
          Print("ll=",ll,"\nvv+ww=",vv+ww,"\n");
      fi;
      l := l + 1;
  od;
end;

CVEC.TEST.MUL1 := function(p,d)
  local c,i,l,ll,q,sc,v,vv,w;
  q := p^d;
  if not(IsPrimePowerInt(q)) or q > MAXSIZE_GF_INTERNAL then
      Error("Test is only for those p^d that are implemented in GAP!");
  fi;
      
  c := CVEC_NewCVecClass(p,d,q);   # Length is q
  v := CVEC_New(c);
  w := CVEC_New(c);
  l := 1*[0..q-1];
  CVEC_INTREP_TO_CVEC(l,v);
  vv := ShallowCopy(l);
  CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],vv);   # Change numbers into FFEs
  ll := 0*[1..q];
  for i in [0..q-1] do
      sc := c![CVEC_IDX_fieldinfo]![CVEC_IDX_tab2][i+1];
      CVEC_COPY(v,w);
      CVEC_MUL1(w,i,1,q);
      CVEC_CVEC_TO_INTREP(w,ll);
      CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],ll);
      if ll <> sc * vv then
          Print("Alarm: i=",i,"\n");
          Print("ll=",ll,"\ni * vv=",vv,"\n");
      fi;
      l := l + 1;
  od;
end;

CVEC.TEST.MUL1_COMPRESSED := function(p,d)
  local c,i,l,ll,q,sc,v,vv,w;
  q := p^d;
  if not(IsPrimePowerInt(q)) or q > MAXSIZE_GF_INTERNAL then
      Error("Test is only for those p^d that are implemented in GAP!");
  fi;
      
  c := CVEC_NewCVecClass(p,d,q);   # Length is q
  v := CVEC_New(c);
  w := CVEC_New(c);
  l := 1*[0..q-1];
  CVEC_INTREP_TO_CVEC(l,v);
  vv := ShallowCopy(l);
  CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],vv);   # Change numbers into FFEs
  ConvertToVectorRep(vv);
  for i in [0..q-1] do
      sc := c![CVEC_IDX_fieldinfo]![CVEC_IDX_tab2][i+1];
      CVEC_COPY(v,w);
      CVEC_MUL1(w,i,1,q);
      ll := 0*[1..q];
      CVEC_CVEC_TO_INTREP(w,ll);
      CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],ll);
      ConvertToVectorRep(ll);
      if ll <> sc * vv then
          Print("Alarm: i=",i,"\n");
          Print("ll=",ll,"\ni * vv=",vv,"\n");
      fi;
      l := l + 1;
  od;
end;

CVEC.TEST.MUL2 := function(p,d)
  local c,i,l,ll,q,sc,v,vv,w;
  q := p^d;
  if not(IsPrimePowerInt(q)) or q > MAXSIZE_GF_INTERNAL then
      Error("Test is only for those p^d that are implemented in GAP!");
  fi;
      
  c := CVEC_NewCVecClass(p,d,q);   # Length is q
  v := CVEC_New(c);
  w := CVEC_New(c);
  l := 1*[0..q-1];
  CVEC_INTREP_TO_CVEC(l,v);
  vv := ShallowCopy(l);
  CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],vv);   # Change numbers into FFEs
  ll := 0*[1..q];
  for i in [0..q-1] do
      sc := c![CVEC_IDX_fieldinfo]![CVEC_IDX_tab2][i+1];
      CVEC_MUL2(w,v,i);
      CVEC_CVEC_TO_INTREP(w,ll);
      CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],ll);
      if ll <> sc * vv then
          Print("Alarm: i=",i,"\n");
          Print("ll=",ll,"\ni * vv=",vv,"\n");
      fi;
      l := l + 1;
  od;
end;

CVEC.TEST.MUL2_COMPRESSED := function(p,d)
  local c,i,l,ll,q,sc,v,vv,w;
  q := p^d;
  if not(IsPrimePowerInt(q)) or q > MAXSIZE_GF_INTERNAL then
      Error("Test is only for those p^d that are implemented in GAP!");
  fi;
      
  c := CVEC_NewCVecClass(p,d,q);   # Length is q
  v := CVEC_New(c);
  w := CVEC_New(c);
  l := 1*[0..q-1];
  CVEC_INTREP_TO_CVEC(l,v);
  vv := ShallowCopy(l);
  CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],vv);   # Change numbers into FFEs
  ConvertToVectorRep(vv);
  for i in [0..q-1] do
      sc := c![CVEC_IDX_fieldinfo]![CVEC_IDX_tab2][i+1];
      CVEC_MUL2(w,v,i);
      ll := 0*[1..q];
      CVEC_CVEC_TO_INTREP(w,ll);
      CVEC_INTLI_TO_FFELI(c![CVEC_IDX_fieldinfo],ll);
      ConvertToVectorRep(ll);
      if ll <> sc * vv then
          Print("Alarm: i=",i,"\n");
          Print("ll=",ll,"\ni * vv=",vv,"\n");
      fi;
      l := l + 1;
  od;
end;

CVEC.TEST.ADDMUL := function(p,d)
  local c,i,l,ll,lll,llll,q,u,v,w,z;
  q := p^d;
  if not(IsPrimePowerInt(q)) or q > MAXSIZE_GF_INTERNAL then
      Error("Test is only for those p^d that are implemented in GAP!");
  fi;
      
  c := CVEC_NewCVecClass(p,d,q);   # Length is q
  v := CVEC_New(c);
  w := CVEC_New(c);
  u := CVEC_New(c);
  z := CVEC_New(c);
  l := 1*[0..q-1];
  CVEC_INTREP_TO_CVEC(l,v);
  ll := [];
  for i in [0..q-1] do
      Add(ll,Random([0..q-1]));
  od;
  CVEC_INTREP_TO_CVEC(ll,w);
  lll := 0*[0..q-1];
  llll := ShallowCopy(lll);
  for i in [0..q-1] do
      CVEC_COPY(v,u);
      CVEC_ADDMUL(u,w,i,1,q);
      CVEC_MUL2(z,w,i);
      CVEC_ADD2(z,v,1,q);
      CVEC_CVEC_TO_INTREP(u,lll);
      CVEC_CVEC_TO_INTREP(z,llll);
      if lll <> llll then
          Print("Alarm: ADDMUL i=",i," ",lll,llll,"\n");
      fi;
  od;
end;

CVEC.TEST.ELM_CVEC := function(p,d)
  local c,el,i,l,q,v;
  q := p^d;
  if not(IsSmallIntRep(q)) then
      Error("Test is only for those p^d that are GAP small integers!");
  fi;

  c := CVEC_NewCVecClass(p,d,q);   # Length is q
  v := CVEC_New(c);
  l := 1*[0..q-1];
  CVEC_INTREP_TO_CVEC(l,v);
  for i in [1..q] do
      el := CVEC_ELM_CVEC(v,i);
      if q <= MAXSIZE_GF_INTERNAL then
          if el <> c![CVEC_IDX_fieldinfo]![CVEC_IDX_tab2][i] then
              Print("Alarm: ELM_CVEC i=",i," ",el," ",
                    c![CVEC_IDX_fieldinfo]![CVEC_IDX_tab2][i],"\n");
          fi;
      else
          if el <> i-1 then
              Print("Alarm: ELM_CVEC i=",i," ",el," ",i-1,"\n");
          fi;
      fi;
  od;
end;
 
CVEC.TEST.ASS_CVEC := function(p,d)
  local c,i,l,q,v;
  q := p^d;
  if not(IsSmallIntRep(q)) then
      Error("Test is only for those p^d that are GAP small integers!");
  fi;

  c := CVEC_NewCVecClass(p,d,q);   # Length is q
  v := CVEC_New(c);
  l := 0*[0..q-1];
  for i in [1..q] do
      CVEC_ASS_CVEC(v,i,i-1);
  od;
  CVEC_CVEC_TO_INTREP(v,l);
  if l <> [0..q-1] then
      Print("Alarm ASS_CVEC p=",p," d=",d,"\n");
  fi;
  if q <= MAXSIZE_GF_INTERNAL then
      CVEC_MAKEZERO(v);
      # Try to assign finite field elements:
      for i in [1..q] do
          CVEC_ASS_CVEC(v,i,c![CVEC_IDX_fieldinfo]![CVEC_IDX_tab2][i]);
      od;
      CVEC_CVEC_TO_INTREP(v,l);
      if l <> [0..q-1] then
          Print("Alarm ASS_CVEC FFE p=",p," d=",d,"\n");
      fi;
  fi;
end;
 
CVEC.TEST.POSITION_NONZERO_CVEC := function(p,d)
  local c,i,q,v,l;
  q := p^d;
  if not(IsSmallIntRep(q)) then
      Error("Test is only for those p^d that are GAP small integers!");
  fi;

  q := Minimum(q,256);   # just to reduce the length of the vectors
  c := CVEC_NewCVecClass(p,d,q);
  v := CVEC_New(c);
  if CVEC_POSITION_NONZERO_CVEC(v) <> q+1 then
      Print("Alarm POSITION_NONZERO_CVEC p=",p," d=",d," i=0\n");
  fi;
  l := 1 * [0..q-1];
  l[1] := 1;
  for i in [1..q] do
      CVEC_ASS_CVEC(v,i,l[i]);
      if CVEC_POSITION_NONZERO_CVEC(v) <> i then
          Print("Alarm POSITION_NONZERO_CVEC p=",p," d=",d," i=",i,"\n");
      fi;
      CVEC_ASS_CVEC(v,i,0);
  od;
end;

CVEC.TEST.POSITION_LAST_NONZERO_CVEC := function(p,d)
  local c,i,q,v,l;
  q := p^d;
  if not(IsSmallIntRep(q)) then
      Error("Test is only for those p^d that are GAP small integers!");
  fi;

  q := Minimum(q,256);   # just to reduce the length of the vectors
  c := CVEC_NewCVecClass(p,d,q);
  v := CVEC_New(c);
  if CVEC_POSITION_LAST_NONZERO_CVEC(v) <> 0 then
      Print("Alarm POSITION_LAST_NONZERO_CVEC p=",p," d=",d," i=0\n");
  fi;
  l := 1 * [0..q-1];
  l[1] := 1;
  for i in [1..q] do
      CVEC_ASS_CVEC(v,i,l[i]);
      if CVEC_POSITION_LAST_NONZERO_CVEC(v) <> i then
          Print("Alarm POSITION_LAST_NONZERO_CVEC p=",p," d=",d," i=",
                i,"\n");
      fi;
      CVEC_ASS_CVEC(v,i,0);
  od;
end;

CVEC.TEST.MATMUL := function(p,d)
  local a,aold,b,bold,c1,c2,c3,c4,c5,c6,ca,cb,f,fc,i,l,lev,q,r,s,t;
  if p^d > MAXSIZE_GF_INTERNAL then
      Error("Test is only for finite fields implemented in GAP");
      return;
  fi;
  f := GF(p,d);
  q := p^d;
  r := Random([100..150]);
  s := Random([100..150]);
  t := Random([100..150]);
  #Print("\n     (doing ",r,"x",s," * ",s,"x",t,"...)\n");
  ca := CVEC_NewCVecClass(p,d,s);
  cb := CVEC_NewCVecClass(p,d,t);
  a := CMat([],ca);
  aold := [];
  for i in [1..r] do
      l := List([1..s],i->Random(f));
      Add(a,CVec(l,ca));
      Add(aold,l);
      if q <= 256 then ConvertToVectorRep(l,q); fi;
  od;
  ConvertToMatrixRep(aold);
  b := CMat([],cb);
  bold := [];
  for i in [1..s] do
      l := List([1..t],i->Random(f));
      Add(b,CVec(l,cb));
      Add(bold,l);
      if q <= 256 then ConvertToVectorRep(l,q); fi;
  od;
  ConvertToMatrixRep(bold);

  c1 := a * b;
  c2 := aold * bold;
  GreaseMat(b);
  c3 := a * b;
  UnGreaseMat(b);
  fc := ca![CVEC_IDX_fieldinfo];
  lev := b!.greasehint;
  b!.greasehint := 0;   # do not grease
  c4 := a * b;
  b!.greasehint := lev;
  c5 := 0*[1..Length(a)+1];
  for i in [1..Length(a)] do
      c5[i+1] := a[i] * b;
  od;
  c5 := CVEC_CMatMaker(c5,cb);
  GreaseMat(b);
  c6 := 0*[1..Length(a)+1];
  for i in [1..Length(a)] do
      c6[i+1] := a[i] * b;
  od;
  c6 := CVEC_CMatMaker(c6,cb);

  if List(c1,Unpack) <> List(c2,x->List(x,y->y)) then
      Print("Alarm p=",p," d=",d," std matmul\n");
      Error("You can inspect c1, c2, c3, c4, c5, c6");
  fi;
  if c1 <> c3 then
      Print("Alarm p=",p," d=",d," greased matmul\n");
      Error("You can inspect c1, c2, c3, c4, c5, c6");
  fi;
  if c1 <> c4 then
      Print("Alarm p=",p," d=",d," ungreased matmul\n");
      Error("You can inspect c1, c2, c3, c4, c5, c6");
  fi;
  if c1 <> c5 then
      Print("Alarm p=",p," d=",d," ungreased vec*mat\n");
      Error("You can inspect c1, c2, c3, c4, c5, c6");
  fi;
  if c1 <> c6 then
      Print("Alarm p=",p," d=",d," greased vec*mat\n");
      Error("You can inspect c1, c2, c3, c4, c5, c6");
  fi;
end;

CVEC.TEST.LIMIT_SLICE := 256;

CVEC.TEST.SLICE := function(p,d)
  local c,srcpos,len,dstpos,l,one,q,s,v,w;
  q := p^d;
  l := CVEC.TEST.LIMIT_SLICE;
  c := CVEC_NewCVecClass(p,d,l);
  v := CVec(0*[1..l]+1,c);
  one := v[1];
  for srcpos in [1..l] do
      Print("srcpos=",srcpos," (",l,")\n");
      for len in [1..l-srcpos+1] do
          for dstpos in [1..l-len+1] do
              w := CVEC_New(c);
              CVEC_SLICE(v,w,srcpos,len,dstpos);
              if PositionNonZero(w) <> dstpos or
                 PositionLastNonZero(w) <> dstpos+len-1 then
                  Print("Alarm p=",p," d=",d," srcpos=",srcpos," len=",len,
                        " dstpos=",dstpos,"\n");
                  Error("You can inspect v and w");
              fi;
              for s in [dstpos..dstpos+len-1] do
                  if w[s] <> one then
                      Print("Alarm p=",p," d=",d," srcpos=",srcpos," len=",len,
                            " dstpos=",dstpos,"\n");
                      Error("You can inspect v and w");
                  fi;
              od;
          od;
      od;
  od;
end;

CVEC.TEST.SLICELIST := function(p,d)
  local c,dstposs,f,i,j,l,len,li,one,po,q,srcposs,v,w;
  q := p^d;
  l := CVEC.TEST.LIMIT_SLICE;
  f := GF(p,d);
  c := CVEC_NewCVecClass(p,d,l);
  v := CVec(0*[1..l]+1,c);
  one := v[1];
  for i in [1..l] do
      v[i] := Random(f);
  od;
  Print("Testing lists for srcposs and dstposs...\n");
  for i in [1..1000] do   # a randomized test
      len := Random(1,l);
      srcposs := List([1..len],i->Random(1,l));
      li := [1..l];
      dstposs := [];
      for j in [1..len] do
          po := Random(1,Length(li));
          Add(dstposs,Remove(li,po));
      od;
      w := CVEC_New(c);
      CVEC_SLICE_LIST(v,w,srcposs,dstposs);
      for j in [1..Length(li)] do
          if not(IsZero(w[li[j]])) then
              Print("Alarm p=",p," d=",d," j=",li[j]," should be zero\n");
                  Error("You can inspect v, w, srcposs, dstposs");
          fi;
      od;
      for j in [1..len] do
          if w[dstposs[j]] <> v[srcposs[j]] then
              Print("Alarm p=",p," d=",d," j=",dstposs[j]," is wrong\n");
                  Error("You can inspect v, w, srcposs, dstposs");
          fi;
      od;
  od;
  Print("Testing list for srcposs and range for dstposs...\n");
  for i in [1..1000] do   # a randomized test
      len := Random(1,l);
      srcposs := List([1..len],i->Random(1,l));
      if Random(0,1) = 0 then
          po := Random(1,l-len+1);
          dstposs := [po..po+len-1];
      else
          po := Random(len,l);
          dstposs := [po,po-1..po-len+1];
      fi;
      li := Difference([1..l],Set(dstposs));
      w := CVEC_New(c);
      CVEC_SLICE_LIST(v,w,srcposs,dstposs);
      for j in [1..Length(li)] do
          if not(IsZero(w[li[j]])) then
              Print("Alarm p=",p," d=",d," j=",li[j]," should be zero\n");
                  Error("You can inspect v, w, srcposs, dstposs");
          fi;
      od;
      for j in [1..len] do
          if w[dstposs[j]] <> v[srcposs[j]] then
              Print("Alarm p=",p," d=",d," j=",dstposs[j]," is wrong\n");
                  Error("You can inspect v, w, srcposs, dstposs");
          fi;
      od;
  od;
  Print("Testing list for dstposs and range for srcposs...\n");
  for i in [1..1000] do   # a randomized test
      len := Random(1,l);
      if Random(0,1) = 0 then
          po := Random(1,l-len+1);
          srcposs := [po..po+len-1];
      else
          po := Random(len,l);
          srcposs := [po,po-1..po-len+1];
      fi;
      li := [1..l];
      dstposs := [];
      for j in [1..len] do
          po := Random(1,Length(li));
          Add(dstposs,Remove(li,po));
      od;
      w := CVEC_New(c);
      CVEC_SLICE_LIST(v,w,srcposs,dstposs);
      for j in [1..Length(li)] do
          if not(IsZero(w[li[j]])) then
              Print("Alarm p=",p," d=",d," j=",li[j]," should be zero\n");
                  Error("You can inspect v, w, srcposs, dstposs");
          fi;
      od;
      for j in [1..len] do
          if w[dstposs[j]] <> v[srcposs[j]] then
              Print("Alarm p=",p," d=",d," j=",dstposs[j]," is wrong\n");
                  Error("You can inspect v, w, srcposs, dstposs");
          fi;
      od;
  od;
  Print("Testing ranges for srcposs and dstposs...\n");
  for i in [1..1000] do   # a randomized test
      len := Random(1,l);
      if Random(0,1) = 0 then
          po := Random(1,l-len+1);
          srcposs := [po..po+len-1];
      else
          po := Random(len,l);
          srcposs := [po,po-1..po-len+1];
      fi;
      if Random(0,1) = 0 then
          po := Random(1,l-len+1);
          dstposs := [po..po+len-1];
      else
          po := Random(len,l);
          dstposs := [po,po-1..po-len+1];
      fi;
      li := Difference([1..l],Set(dstposs));
      w := CVEC_New(c);
      CVEC_SLICE_LIST(v,w,srcposs,dstposs);
      for j in [1..Length(li)] do
          if not(IsZero(w[li[j]])) then
              Print("Alarm p=",p," d=",d," j=",li[j]," should be zero\n");
                  Error("You can inspect v, w, srcposs, dstposs");
          fi;
      od;
      for j in [1..len] do
          if w[dstposs[j]] <> v[srcposs[j]] then
              Print("Alarm p=",p," d=",d," j=",dstposs[j]," is wrong\n");
                  Error("You can inspect v, w, srcposs, dstposs");
          fi;
      od;
  od;
end;

CVEC.TEST.COPYSUBMATRIX := function(p,d)
  local c,dstposs,f,i,ii,j,l,len,li,m,one,po,q,srcposs,v,w;
  q := p^d;
  l := CVEC.TEST.LIMIT_SLICE;
  f := GF(p,d);
  c := CVEC_NewCVecClass(p,d,l);
  m := CMat([],CVEC_New(c));
  for ii in [1..3] do
      v := CVec(0*[1..l]+1,c);
      one := v[1];
      for i in [1..l] do
          v[i] := Random(f);
      od;
      Add(m,v);
  od;
  Print("Testing lists for srcposs and dstposs...\n");
  for i in [1..1000] do   # a randomized test
      w := ZeroMutable(m);
      len := Random(1,l);
      srcposs := List([1..len],i->Random(1,l));
      li := [1..l];
      dstposs := [];
      for j in [1..len] do
          po := Random(1,Length(li));
          Add(dstposs,Remove(li,po));
      od;
      CopySubMatrix(m,w,[3,2,1],[3,2,1],srcposs,dstposs);
      for ii in [1..3] do
        for j in [1..Length(li)] do
          if not(IsZero(w[ii][li[j]])) then
              Print("Alarm p=",p," d=",d," j=",li[j]," should be zero\n");
                  Error("You can inspect m, w, srcposs, dstposs");
          fi;
        od;
      od;
      for ii in [1..3] do
        for j in [1..len] do
          if w[ii][dstposs[j]] <> m[ii][srcposs[j]] then
              Print("Alarm p=",p," d=",d," j=",dstposs[j]," is wrong\n");
                  Error("You can inspect m, w, srcposs, dstposs");
          fi;
        od;
      od;
  od;
  Print("Testing list for srcposs and range for dstposs...\n");
  for i in [1..1000] do   # a randomized test
      len := Random(1,l);
      srcposs := List([1..len],i->Random(1,l));
      if Random(0,1) = 0 then
          po := Random(1,l-len+1);
          dstposs := [po..po+len-1];
      else
          po := Random(len,l);
          dstposs := [po,po-1..po-len+1];
      fi;
      li := Difference([1..l],Set(dstposs));
      w := ZeroMutable(m);
      CopySubMatrix(m,w,[3,2,1],[3,2,1],srcposs,dstposs);
      for ii in [1..3] do
        for j in [1..Length(li)] do
          if not(IsZero(w[ii][li[j]])) then
              Print("Alarm p=",p," d=",d," j=",li[j]," should be zero\n");
                  Error("You can inspect m, w, srcposs, dstposs");
          fi;
        od;
      od;
      for ii in [1..3] do
        for j in [1..len] do
          if w[ii][dstposs[j]] <> m[ii][srcposs[j]] then
              Print("Alarm p=",p," d=",d," j=",dstposs[j]," is wrong\n");
                  Error("You can inspect m, w, srcposs, dstposs");
          fi;
        od;
      od;
  od;
  Print("Testing list for dstposs and range for srcposs...\n");
  for i in [1..1000] do   # a randomized test
      len := Random(1,l);
      if Random(0,1) = 0 then
          po := Random(1,l-len+1);
          srcposs := [po..po+len-1];
      else
          po := Random(len,l);
          srcposs := [po,po-1..po-len+1];
      fi;
      li := [1..l];
      dstposs := [];
      for j in [1..len] do
          po := Random(1,Length(li));
          Add(dstposs,Remove(li,po));
      od;
      w := ZeroMutable(m);
      CopySubMatrix(m,w,[1,2,3],[1,2,3],srcposs,dstposs);
      for ii in [1..3] do
        for j in [1..Length(li)] do
          if not(IsZero(w[ii][li[j]])) then
              Print("Alarm p=",p," d=",d," j=",li[j]," should be zero\n");
                  Error("You can inspect m, w, srcposs, dstposs");
          fi;
        od;
      od;
      for ii in [1..3] do
        for j in [1..len] do
          if w[ii][dstposs[j]] <> m[ii][srcposs[j]] then
              Print("Alarm p=",p," d=",d," j=",dstposs[j]," is wrong\n");
                  Error("You can inspect m, w, srcposs, dstposs");
          fi;
        od;
      od;
  od;
  Print("Testing ranges for srcposs and dstposs...\n");
  for i in [1..1000] do   # a randomized test
      len := Random(1,l);
      if Random(0,1) = 0 then
          po := Random(1,l-len+1);
          srcposs := [po..po+len-1];
      else
          po := Random(len,l);
          srcposs := [po,po-1..po-len+1];
      fi;
      if Random(0,1) = 0 then
          po := Random(1,l-len+1);
          dstposs := [po..po+len-1];
      else
          po := Random(len,l);
          dstposs := [po,po-1..po-len+1];
      fi;
      li := Difference([1..l],Set(dstposs));
      w := ZeroMutable(m);
      CopySubMatrix(m,w,[1..3],[1..3],srcposs,dstposs);
      for ii in [1..3] do
        for j in [1..Length(li)] do
          if not(IsZero(w[ii][li[j]])) then
              Print("Alarm p=",p," d=",d," j=",li[j]," should be zero\n");
                  Error("You can inspect m, w, srcposs, dstposs");
          fi;
        od;
      od;
      for ii in [1..3] do
        for j in [1..len] do
          if w[ii][dstposs[j]] <> m[ii][srcposs[j]] then
              Print("Alarm p=",p," d=",d," j=",dstposs[j]," is wrong\n");
                  Error("You can inspect m, w, srcposs, dstposs");
          fi;
        od;
      od;
  od;
end;

CVEC.TEST.IO := function(p,d)
  local l,m,mm,n,q;
  q := p^d;
  m := CVEC_RandomMat(Random([50..100]),Random([50..100]),p,d);
  n := CVEC_RandomMat(Random([50..100]),Random([50..100]),p,d);
  CVEC_WriteMatToFile("TEMP_MATRIX_CAN_BE_REMOVED",m);
  mm := CVEC_ReadMatFromFile("TEMP_MATRIX_CAN_BE_REMOVED");
  if m <> mm then
      Error("Alarm p=",p," d=",d," IO, you can inspect m and mm");
  fi;
  IO_unlink("TEMP_MATRIX_CAN_BE_REMOVED");
  CVEC_WriteMatsToFile("TEMP_MATRIX_CAN_BE_REMOVED.",[m,n]);
  l := CVEC_ReadMatsFromFile("TEMP_MATRIX_CAN_BE_REMOVED.");
  if l = fail or l[1] <> m or l[2] <> n then
      Error("Alarm p=",p," d=",d," IO, you can inspect m, n and l");
  fi;
  IO_unlink("TEMP_MATRIX_CAN_BE_REMOVED.1");
  IO_unlink("TEMP_MATRIX_CAN_BE_REMOVED.2");
end;

CVEC.TEST.PROD_COEFFS_CVEC_PRIMEFIELD := function(p,d)
  local a,b,c,cc,cl,h,i,j,l1,l2,m,n,u;
  if d > 1 then
      Error("Only implemented for prime fields!");
      return;
  fi;
  l1 := Random(50,100);
  l2 := Random(50,100);
  m := CVEC_RandomMat(Random(50,100),l1,p,d);
  n := CVEC_RandomMat(Random(50,100),l2,p,d);
  cl := CVEC_NewCVecClass(p,d,l1+l2-1);
  u := CVEC_New(cl);
  h := CVEC_New(cl);
  for i in [1..Length(m)] do
      a := Unpack(m[i]);
      for j in [1..Length(n)] do
          CVEC_PROD_COEFFS_CVEC_PRIMEFIELD(u,m[i],n[j],h);
          b := Unpack(n[j]);
          c := Unpack(u);
          CVEC_MAKEZERO(u);
          cc := ProductCoeffs(a,b);
          if c <> cc then
              Error("Alarm p=",p," you can inspect a, b, c, and cc");
          fi;
      od;
  od;
end;

CVEC.TEST.SCALAR_IN := function(p,d)
  local c,i,l,limit,q,tab2,v,z,zz;
  c := CVEC_NewCVecClass(p,d,1);
  v := CVec(c);
  z := Z(p,d);
  q := p^d;
  limit := 1000;
  if q <= MAXSIZE_GF_INTERNAL then
      tab2 := c![CVEC_IDX_fieldinfo]![CVEC_IDX_tab2];
      zz := One(z);
      for i in [1..q-1] do
          zz := zz*z;
          v[1] := zz;
          l := IntegerRep(v);
          if zz <> tab2[l[1]+1] then
              Error("Alarm p=",p," d=",d," you can inspect zz, v, and l");
          fi;
      od;
  elif d = 1 then
      for i in [0..limit] do
          v[1] := ZmodnZObj(i,p);
          l := IntegerRep(v);
          if l[1] <> i then
              Error("Alarm p=",p," d=",d," you can inspect i, v, and l");
          fi;
      od;
  elif p < 65536 then
      zz := One(z);
      for i in [1..limit] do
          zz := zz * z;
          v[1] := zz;
          l := IntegerRep(v);
          if List(zz![1],IntFFE) <> l[1] then
              Error("Alarm p=",p," d=",d," you can inspect i, zz, v, and l");
          fi;
      od;
  else
      zz := One(z);
      for i in [1..limit] do
          zz := zz * z;
          v[1] := zz;
          l := IntegerRep(v);
          if List(zz![1],x->x![1]) <> l[1] then
              Error("Alarm p=",p," d=",d," you can inspect i, zz, v, and l");
          fi;
      od;
  fi;
end;

CVEC.TEST.SCALAR_OUT := function(p,d)
  local c,i,limit,q,v,z,zz;
  c := CVEC_NewCVecClass(p,d,1);
  v := CVec(c);
  z := Z(p,d);
  q := p^d;
  limit := 1000;
  zz := One(z);
  for i in [1..limit] do
      zz := zz * z;
      v[1] := zz;
      if zz <> v[1] then
          Error("Alarm p=",p," d=",d," you can inspect i, zz, and v");
      fi;
  od;
end;

CVEC.TEST.SCALAR_UNPACK := function(p,d)
  local c,i,limit,q,v,z,zz;
  c := CVEC_NewCVecClass(p,d,1);
  v := CVec(c);
  z := Z(p,d);
  q := p^d;
  limit := 1000;
  zz := One(z);
  for i in [1..limit] do
      zz := zz * z;
      v[1] := zz;
      if [zz] <> Unpack(v) then
          Error("Alarm p=",p," d=",d," you can inspect i, zz, and v");
      fi;
  od;
end;

CVEC.TEST.NUMBERFFVECTOR := function(p,d)
  local TestTwo,i,l,q,qq;
  q := p^d;
  if p = 2 then
      l := QuoInt(256,d);
  else
      l := 41;
  fi;
  qq := q^l;

  TestTwo := function(a,b)
    local v,w;
    v := CVecNumber(a,p,d,l);
    w := CVecNumber(b,p,d,l);
    if NumberFFVector(v) <> a or NumberFFVector(w) <> b then
        Error("Alarm p=",p," d=",d," you can inspect, a, b, v, and w");
    fi;
    if (v=w) <> (a=b) then
        Error("Alarm (eq) p=",p," d=",d," you can inspect, a, b, v, and w");
    fi;
    if (v<w) <> (a<b) then
        Error("Alarm (<) p=",p," d=",d," you can inspect, a, b, v, and w");
    fi;
  end;

  # Check some standard things:
  TestTwo(0,1);
  TestTwo(0,qq-1);
  TestTwo(1,2);
  TestTwo(p-1,p);
  
  # Do some random elements:
  for i in [1..100] do
      TestTwo(Random(0,qq-1),Random(0,qq-1));
  od;
end;

CVEC.TEST.TRANSPOSED_MAT := function(p,d)
  local m,mm,mo,n,nno,no,x,y;
  x := Random(50,100);
  y := Random(50,100);
  m := CVEC_RandomMat(x,y,p,d);
  n := TransposedMatOp(m);
  mm := TransposedMatOp(n);
  if m <> mm then
      Error("Alarm p=",p," d=",d," you can inspect m, n, and mm");
  fi;
  if p^d <= 256 then
      mo := List(m,Unpack);
      ConvertToMatrixRep(mo);
      no := TransposedMat(mo);
      nno := List(n,Unpack);
      ConvertToMatrixRep(nno);
      if no <> nno then
          Error("Alarm p=",p," d=",d," you can inspect m, n, no, and nno");
      fi;
  fi;
end;

CVEC.TEST.INVERSION := function(p,d)
  local lev,m,n,nn,x;
  x := Random(50,100);
  repeat
    m := CVEC_RandomMat(x,x,p,d);
  until RankMat(m) = x;
  n := m^-1;
  if not(IsOne(m*n)) then
      Error("Alarm p=",p," d=",d," you can inspect m and n");
  fi;
  if m!.greasehint <> 0 then
      for lev in [1..m!.greasehint+1] do
          nn := CVEC_InverseWithGrease(m,lev);
          if nn <> n then
              Error("Alarm p=",p," d=",d," you can inspect m, n, nn, and lev");
          fi;
      od;
  fi;
end;
  
CVEC.TEST.SCALARPRODUCT := function(p,d)
  local x,m,i,j,y;
  x := Random(5,200);
  m := CVEC_RandomMat(10,x,p,d);
  for i in [1..10] do
    for j in [i..10] do
      y := ScalarProduct(m[i],m[j]);
      if y <> Sum([1..x],k->m[i][k]*m[j][k]) then
          Error("Alarm p=",p," d=",d," you can inspect m, i, and j");
      fi;
    od;
  od;
end;

CVEC.TEST.ENTRYOFMATRIXPRODUCT := function(p,d)
  local x,m,n,i,j,y;
  x := Random(5,200);
  m := CVEC_RandomMat(10,x,p,d);
  n := CVEC_RandomMat(x,10,p,d);
  for i in [1..10] do
    for j in [i..10] do
      y := EntryOfMatrixProduct(m,n,i,j);
      if y <> Sum([1..x],k->m[i][k]*n[k][j]) then
          Error("Alarm p=",p," d=",d," you can inspect m, n, i, and j");
      fi;
    od;
  od;
end;
  
CVEC.TEST.DOALL := function()
  local inf;
  inf := InfoLevel(InfoWarning);
  SetInfoLevel(InfoWarning,0);  # Get rid of messages for Conway polynomials
  CVEC.TEST.ALLFFE("INTFFE_CONV",CVEC.TEST.INTFFE_CONVERSION);
  CVEC.TEST.ALLCHEAP("ADD2",CVEC.TEST.ADD2);
  CVEC.TEST.COMPRESSED_ALL("ADD2", CVEC.TEST.ADD2_COMPRESSED);
  CVEC.TEST.ALLCHEAP("ADD3",CVEC.TEST.ADD3);
  CVEC.TEST.COMPRESSED_ALL("ADD3", CVEC.TEST.ADD3_COMPRESSED);
  CVEC.TEST.ALLCHEAP("MUL1",CVEC.TEST.MUL1);
  CVEC.TEST.COMPRESSED_ALL("MUL1", CVEC.TEST.MUL1_COMPRESSED);
  CVEC.TEST.ALLCHEAP("MUL2",CVEC.TEST.MUL2);
  CVEC.TEST.COMPRESSED_ALL("MUL2", CVEC.TEST.MUL2_COMPRESSED);
  CVEC.TEST.ALLCHEAP("ADDMUL",CVEC.TEST.ADDMUL);
  CVEC.TEST.ALLCHEAP("ELM_CVEC",CVEC.TEST.ELM_CVEC);
  CVEC.TEST.ALLCHEAP("ASS_CVEC",CVEC.TEST.ASS_CVEC);
  CVEC.TEST.ALLFFE("POSITION_NONZERO_CVEC",CVEC.TEST.POSITION_NONZERO_CVEC);
  CVEC.TEST.ALLFFE("POSITION_LAST_NONZERO_CVEC",
                   CVEC.TEST.POSITION_LAST_NONZERO_CVEC);
  CVEC.TEST.COMPRESSED_ALL("MATMUL",CVEC.TEST.MATMUL);
  Print("Testing MATMUL 2^9...\n");
  CVEC.TEST.MATMUL(2,9);
  Print("Testing MATMUL 3^10...\n");
  CVEC.TEST.MATMUL(3,10);
  Print("Testing MATMUL 31^3...\n");
  CVEC.TEST.MATMUL(31,3);
  Print("Testing MATMUL 257^1...\n");
  CVEC.TEST.MATMUL(257,1);
  Print("Testing SLICE 2^1 (bitsperel=1)...\n");
  CVEC.TEST.SLICE(2,1);
  Print("Testing SLICE 3^1 (bitsperel=3)...\n");
  CVEC.TEST.SLICE(3,1);
  Print("Testing SLICE 5^1 (bitsperel=4)...\n");
  CVEC.TEST.SLICE(5,1);
  Print("Testing SLICE 11^1 (bitsperel=5)...\n");
  CVEC.TEST.SLICE(11,1);
  Print("Testing SLICE 19^1 (bitsperel=6)...\n");
  CVEC.TEST.SLICE(19,1);
  Print("Testing SLICE 37^1 (bitsperel=7)...\n");
  CVEC.TEST.SLICE(37,1);
  Print("Testing SLICE 101^1 (bitsperel=8)...\n");
  CVEC.TEST.SLICE(101,1);
  Print("Testing SLICE 2^2 (bitsperel=1)...\n");
  CVEC.TEST.SLICE(2,2);
  Print("Testing SLICE 3^2 (bitsperel=3)...\n");
  CVEC.TEST.SLICE(3,2);
  Print("Testing SLICE 5^2 (bitsperel=4)...\n");
  CVEC.TEST.SLICE(5,2);
  Print("Testing SLICE 2^3 (bitsperel=1)...\n");
  CVEC.TEST.SLICE(2,3);
  Print("Testing SLICE 3^3 (bitsperel=3)...\n");
  CVEC.TEST.SLICE(3,3);
  Print("Testing SLICE 2^4 (bitsperel=1)...\n");
  CVEC.TEST.SLICE(2,4);
  Print("Testing SLICELIST 2^1 (bitsperel=1)...\n");
  CVEC.TEST.SLICELIST(2,1);
  Print("Testing SLICELIST 3^1 (bitsperel=3)...\n");
  CVEC.TEST.SLICELIST(3,1);
  Print("Testing SLICELIST 5^1 (bitsperel=4)...\n");
  CVEC.TEST.SLICELIST(5,1);
  Print("Testing SLICELIST 11^1 (bitsperel=5)...\n");
  CVEC.TEST.SLICELIST(11,1);
  Print("Testing SLICELIST 19^1 (bitsperel=6)...\n");
  CVEC.TEST.SLICELIST(19,1);
  Print("Testing SLICELIST 37^1 (bitsperel=7)...\n");
  CVEC.TEST.SLICELIST(37,1);
  Print("Testing SLICELIST 101^1 (bitsperel=8)...\n");
  CVEC.TEST.SLICELIST(101,1);
  Print("Testing SLICELIST 2^2 (bitsperel=1)...\n");
  CVEC.TEST.SLICELIST(2,2);
  Print("Testing SLICELIST 3^2 (bitsperel=3)...\n");
  CVEC.TEST.SLICELIST(3,2);
  Print("Testing SLICELIST 5^2 (bitsperel=4)...\n");
  CVEC.TEST.SLICELIST(5,2);
  Print("Testing SLICELIST 2^3 (bitsperel=1)...\n");
  CVEC.TEST.SLICELIST(2,3);
  Print("Testing SLICELIST 3^3 (bitsperel=3)...\n");
  CVEC.TEST.SLICELIST(3,3);
  Print("Testing SLICELIST 2^4 (bitsperel=1)...\n");
  CVEC.TEST.SLICELIST(2,4);
  Print("Testing COPYSUBMATRIX 2^1 (bitsperel=1)...\n");
  CVEC.TEST.COPYSUBMATRIX(2,1);
  Print("Testing COPYSUBMATRIX 3^1 (bitsperel=3)...\n");
  CVEC.TEST.COPYSUBMATRIX(3,1);
  Print("Testing COPYSUBMATRIX 5^1 (bitsperel=4)...\n");
  CVEC.TEST.COPYSUBMATRIX(5,1);
  Print("Testing COPYSUBMATRIX 11^1 (bitsperel=5)...\n");
  CVEC.TEST.COPYSUBMATRIX(11,1);
  Print("Testing COPYSUBMATRIX 19^1 (bitsperel=6)...\n");
  CVEC.TEST.COPYSUBMATRIX(19,1);
  Print("Testing COPYSUBMATRIX 37^1 (bitsperel=7)...\n");
  CVEC.TEST.COPYSUBMATRIX(37,1);
  Print("Testing COPYSUBMATRIX 101^1 (bitsperel=8)...\n");
  CVEC.TEST.COPYSUBMATRIX(101,1);
  Print("Testing COPYSUBMATRIX 2^2 (bitsperel=1)...\n");
  CVEC.TEST.COPYSUBMATRIX(2,2);
  Print("Testing COPYSUBMATRIX 3^2 (bitsperel=3)...\n");
  CVEC.TEST.COPYSUBMATRIX(3,2);
  Print("Testing COPYSUBMATRIX 5^2 (bitsperel=4)...\n");
  CVEC.TEST.COPYSUBMATRIX(5,2);
  Print("Testing COPYSUBMATRIX 2^3 (bitsperel=1)...\n");
  CVEC.TEST.COPYSUBMATRIX(2,3);
  Print("Testing COPYSUBMATRIX 3^3 (bitsperel=3)...\n");
  CVEC.TEST.COPYSUBMATRIX(3,3);
  Print("Testing COPYSUBMATRIX 2^4 (bitsperel=1)...\n");
  CVEC.TEST.COPYSUBMATRIX(2,4);
  CVEC.TEST.ALLCHEAP("IO", CVEC.TEST.IO);
  CVEC.TEST.ALLCONWAY("SCALAR_IN", CVEC.TEST.SCALAR_IN);
  Print("Testing SCALAR_IN 65537^1...\n");
  CVEC.TEST.SCALAR_IN(65537,1);
  Print("Testing SCALAR_IN 65537^2...\n");
  CVEC.TEST.SCALAR_IN(65537,2);
  Print("Testing SCALAR_IN 65537^3...\n");
  CVEC.TEST.SCALAR_IN(65537,3);
  CVEC.TEST.ALLCONWAY("SCALAR_OUT", CVEC.TEST.SCALAR_OUT);
  Print("Testing SCALAR_OUT 65537^1...\n");
  CVEC.TEST.SCALAR_OUT(65537,1);
  Print("Testing SCALAR_OUT 65537^2...\n");
  CVEC.TEST.SCALAR_OUT(65537,2);
  Print("Testing SCALAR_OUT 65537^3...\n");
  CVEC.TEST.SCALAR_OUT(65537,3);
  CVEC.TEST.ALLCONWAY("SCALAR_UNPACK", CVEC.TEST.SCALAR_UNPACK);
  Print("Testing SCALAR_UNPACK 65537^1...\n");
  CVEC.TEST.SCALAR_UNPACK(65537,1);
  Print("Testing SCALAR_UNPACK 65537^2...\n");
  CVEC.TEST.SCALAR_UNPACK(65537,2);
  Print("Testing SCALAR_UNPACK 65537^3...\n");
  CVEC.TEST.SCALAR_UNPACK(65537,3);
  Print("Testing NumberFFVector...\n");
  CVEC.TEST.ALLCHEAP("NUMBERFFVECTOR",CVEC.TEST.NUMBERFFVECTOR);
  Print("Testing TransposedMat...\n");
  CVEC.TEST.ALLCHEAP("TRANSPOSED_MAT",CVEC.TEST.TRANSPOSED_MAT);
  Print("Testing inversion...\n");
  CVEC.TEST.COMPRESSED_ALL("INVERSION",CVEC.TEST.INVERSION);
  Print("Testing ScalarProduct...\n");
  CVEC.TEST.ALLFFE("SCALARPRODUCT",CVEC.TEST.SCALARPRODUCT);
  Print("Testing EntryOfMatrixProduct...\n");
  CVEC.TEST.ALLFFE("ENTRYOFMATPROD",CVEC.TEST.ENTRYOFMATRIXPRODUCT);
  SetInfoLevel(InfoWarning,inf);
end;

#############################################################################
# Benchmarks:
#############################################################################

CVEC.BENCH.ADD2 := function(p,d)
  local c,i,j,l,nr,q,r,r2,v,w,wordlen,table,vecsize,throughput;
  q := p^d;
  Print("CVEC.BENCH.ADD2:\n\n");
  Print("Working with vectors over GF(",p,",",d,").\n\n");
  l := 512;
  nr := 2^20;
  if q < 16 then nr := nr * 4; fi;   # some more for small fields
  table := [];
  repeat
    c := CVEC_NewCVecClass(p,d,l);
    wordlen := c![CVEC_IDX_wordlen];
    vecsize := CVEC_BYTESPERWORD*wordlen;
    Print("Doing vectors of length ",l," using ", vecsize," bytes each...\n");
    Print("Initialising...\c");
    v := CVEC_New(c);
    w := CVEC_New(c);
    j := 0;
    for i in [1..l] do
        v[i] := j;
        j := j + 1;
        if j >= q then j := 0; fi;
    od;
    Print("done.\n");
    Print("Doing ",nr," times ADD2 of such vectors...\c");
    r := Runtime();
    for i in [1..nr] do
        CVEC_ADD2(w,v,0,0);
    od;
    r2 := Runtime();
    Print("done.\n");
    throughput := QuoInt(nr*vecsize*1000,(r2-r)*1024*1024);  # in MB/s
    Print("Time: ",r2-r," ms which means: ",throughput," MB/s throughput.\n\n");
    Add(table,[vecsize,throughput]);
    l := l * 2;
    nr := nr / 2;
    Unbind(v);
    Unbind(w);
  until vecsize >= 2^26 or not(IsSmallIntRep(l)); 
  # do until vectors >= 64MB or the length is no longer an immediate int
  return table;
end;

CVEC.BENCH.ADDOLD := function(p,d)
  local i,j,l,li,me,nr,q,r,r2,table,throughput,v,vecsize,w;
  q := p^d;
  Print("CVEC.BENCH.ADDOLD:\n\n");
  Print("Working with vectors over GF(",p,",",d,").\n\n");
  l := 512;
  nr := 2^20;
  if q < 16 then nr := nr * 4; fi;   # some more for small fields
  table := [];
  repeat
    v := 0*[1..l]; ConvertToVectorRep(v,q);
    w := ShallowCopy(v);
    if p = 2 and d = 1 then
        vecsize := SIZE_OBJ(v)-4;
    else
        vecsize := SIZE_OBJ(v)-8;
    fi;
    Print("Doing vectors of length ",l," using ", vecsize," bytes each...\n");
    Print("Initialising...\c");
    li := AsSet(GF(q));
    j := 0;
    for i in [1..l] do
        v[i] := li[j+1];
        j := j + 1;
        if j >= q then j := 0; fi;
    od;
    Print("done.\n");
    me := ApplicableMethod(AddRowVector,[w,v]);
    Print("Doing ",nr," times AddRowVector of such vectors...\c");
    r := Runtime();
    for i in [1..nr] do
        me(w,v);
    od;
    r2 := Runtime();
    Print("done.\n");
    throughput := QuoInt(nr*vecsize*1000,(r2-r)*1024*1024);  # in MB/s
    Print("Time: ",r2-r," ms which means: ",throughput," MB/s throughput.\n\n");
    Add(table,[vecsize,throughput]);
    l := l * 2;
    nr := nr / 2;
    Unbind(v);
    Unbind(w);
  until vecsize >= 2^23 or not(IsSmallIntRep(l)); 
  # do until vectors >= 64MB or the length is no longer an immediate int
  return table;
end;

CVEC.BENCH.MEASUREACCURACY := function()
  local c,d,i,j,l,nr,p,q,r,r2,sqsum,sum,times,throughput,v,vecsize,w,wordlen,x;
  p := 7;
  d := 4;
  q := p^d;
  l := 524288; # 16384;
  nr := 1024;  # 32768;
  times := 20;
  c := CVEC_NewCVecClass(p,d,l);
  wordlen := c![CVEC_IDX_wordlen];
  vecsize := CVEC_BYTESPERWORD*wordlen;
  Print("Doing vectors of length ",l," using ", vecsize," bytes each...\n");
  Print("Initialising...\c");
  v := CVEC_New(c);
  x := [1,2,3];
  w := CVEC_New(c);
  j := 0;
  for i in [1..l] do
      v[i] := j;
      j := j + 1;
      if j >= q then j := 0; fi;
  od;
  Print("done.\n");
  Print("Doing ",nr," times ADD2 of such vectors...\n");
  sum := 0;
  sqsum := 0;
  for j in [1..times] do
      r := Runtime();
      for i in [1..nr] do
          CVEC_ADD2(w,v,0,0);
      od;
      r2 := Runtime();
      throughput := QuoInt(nr*vecsize*1000,(r2-r)*1024);  # in kB/s
      Print("Time: ",r2-r," ms which means: ",throughput," kB/s throughput.\n");
      sum := sum + throughput;
      sqsum := sqsum + throughput^2;
      w := CVEC_New(c);   # see to it, that w changes its place in memory
  od;
  Print("Average: ",QuoInt(sum,times * 1000)," MB/s ",
        " Variance: ",
        QuoInt(QuoInt(sqsum,times)-QuoInt(sum,times)^2,1000000),
               " (MB/s)^2\n\n");
  p := 2;
  d := 16;
  q := p^d;
  l := 524288; # 16384;
  nr := 1024;  # 32768;
  times := 20;
  c := CVEC_NewCVecClass(p,d,l);
  wordlen := c![CVEC_IDX_wordlen];
  vecsize := CVEC_BYTESPERWORD*wordlen;
  Print("Doing vectors of length ",l," using ", vecsize," bytes each...\n");
  Print("Initialising...\c");
  v := CVEC_New(c);
  x := [1,2,3];
  w := CVEC_New(c);
  j := 0;
  for i in [1..l] do
      v[i] := j;
      j := j + 1;
      if j >= q then j := 0; fi;
  od;
  Print("done.\n");
  Print("Doing ",nr," times ADD2 of such vectors...\n");
  sum := 0;
  sqsum := 0;
  for j in [1..times] do
      r := Runtime();
      for i in [1..nr] do
          CVEC_ADD2(w,v,0,0);
      od;
      r2 := Runtime();
      throughput := QuoInt(nr*vecsize*1000,(r2-r)*1024);  # in kB/s
      Print("Time: ",r2-r," ms which means: ",throughput," kB/s throughput.\n");
      sum := sum + throughput;
      sqsum := sqsum + throughput^2;
      w := CVEC_New(c);   # see to it, that w changes its place in memory
  od;
  Print("Average: ",QuoInt(sum,times * 1000)," MB/s ",
        " Variance: ",
        QuoInt(QuoInt(sqsum,times)-QuoInt(sum,times)^2,1000000),
               " (MB/s)^2\n\n");
end;

CVEC.BENCH.INVERSION := function(p,d)
  local l,lev,m,mm,n,nn,q,t,t2;
  q := p^d;
  l := First([1..5000],i->i^3*q > 2500^3*2);
  if l < 100 then l := 100; fi;
  Print("Doing random invertible ",l,"x",l," matrices.");
  repeat
      m := CVEC_RandomMat(l,l,p,d);
      Print(".\c");
  until RankMat(m) = l;
  Print("got one.\n");
  t := Runtime(); n := CVEC_InverseWithoutGrease(m); t2 := Runtime();
  Print("Without grease: ",t2-t," ms\n");
  t := Runtime(); n := m^-1; t2 := Runtime();
  Print("With std. grease (level ",m!.greasehint,"): ",t2-t," ms\n");
  if m!.greasehint <> 0 then
      for lev in [1..m!.greasehint+1] do
        if q^lev < 2500 then   # to get rid of too high greasing levels
          t := Runtime(); n := CVEC_InverseWithGrease(m,lev); t2 := Runtime();
          Print("With grease level ",lev,": ",t2-t," ms\n");
        fi;
      od;
  fi;
  mm := List(m,Unpack);
  if q <= 256 then ConvertToMatrixRep(mm,q); fi;
  t := Runtime(); nn := mm^-1; t2 := Runtime();
  Print("GAP without cmats: ",t2-t," ms\n");
end;

CVEC.BENCH.MULTIPLICATION := function(p,d)
  local a,aa,greasehint,l,lev,m,merklev,mm,n,nn,q,t,t2;
  q := p^d;
  l := First([1..5000],i->i^3*q > 2500^3*2);
  if l < 100 then l := 100; fi;
  Print("Doing random ",l,"x",l," matrices...\c");
  m := CVEC_RandomMat(l,l,p,d);
  n := CVEC_RandomMat(l,l,p,d);
  Print("got them.\n");
  merklev := n!.greasehint;
  n!.greasehint := 0;  # Switch off greasing
  t := Runtime(); a := m*n; t2 := Runtime();
  Print("Without grease: ",t2-t," ms\n");
  n!.greasehint := merklev;
  t := Runtime(); a := m*n; t2 := Runtime();
  Print("With std. grease (level ",n!.greasehint,"): ",t2-t," ms\n");
  if m!.greasehint <> 0 then
      for lev in [1..m!.greasehint+1] do
        if q^lev < 2500 then   # to get rid of too high greasing levels
          n!.greasehint := lev;
          t := Runtime(); a := m*n; t2 := Runtime();
          Print("With grease level ",lev,": ",t2-t," ms\n");
        fi;
      od;
  fi;
  n!.greasehint := merklev;
  GreaseMat(n);
  t := Runtime(); a := m*n; t2 := Runtime();
  Print("With pregreased n (level ",n!.greasehint,"): ",t2-t," ms\n");
  UnGreaseMat(n);
  mm := List(m,Unpack);
  nn := List(n,Unpack);
  if q <= 256 then 
      ConvertToMatrixRep(mm,q); 
      ConvertToMatrixRep(nn,q); 
  fi;
  t := Runtime(); aa := mm * nn; t2 := Runtime();
  Print("GAP without cmats: ",t2-t," ms\n");
end;

##
##  This program is free software; you can redistribute it and/or modify
##  it under the terms of the GNU General Public License as published by
##  the Free Software Foundation; either version 2 of the License,
##  or (at your option) any later version.
##
##  This program is distributed in the hope that it will be useful,
##  but WITHOUT ANY WARRANTY; without even the implied warranty of
##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##  GNU General Public License for more details.
##
##  You should have received a copy of the GNU General Public License
##  along with this program; if not, write to the Free Software
##  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
##

[ Dauer der Verarbeitung: 0.18 Sekunden  (vorverarbeitet)  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge