shankslog(a,g,card)=
{
  my(M=Map());
  my(h=a,B=sqrtint(card)+1);
  for(i=0,B-1,
    mapput(M,h,i);
    h*=g);
  g2=h*a^-1;
  h=1;
  for(i=0,B,my(j);
    if(mapisdefined(M,h,&j),
      return(i*B-j));
    h*=g2);
  error("shankslog: not found");
}
if(Mod(2,1000003)^shankslog(Mod(3,1000003),Mod(2,1000003),1000002)!=3, error("shankslog"));

tablelog(g,card)=
{
  my(M=Map());
  my(h=1);
  for(i=0,card-1,
    mapput(M,h,i);h*=g);
  M;
}
tablelogdel(g,card)=
{
  my(M=Map());
  my(h=1);
  for(i=0,card-1,
    mapput(M,h,i);h*=g);
  h=1;
  for(i=0,card-1,
    mapdelete(M,h);h*=g);
  #M;
}
a=ffgen(5^5,'a); g=ffprimroot(a); T=tablelog(g,5^5-1);
if(g^mapget(T,a^2+a+1)!=a^2+a+1,error("shankslog"));
if(tablelogdel(g,5^5-1),error("mapdelete"));

M=Map([1,2;3,4;5,6])
Vec(M)
Mat(M)
apply(sqr,M)
for(i=0,2,mapput(M, 2*i+1, -mapget(M,2*i+1)));M

M0=Map(matrix(10,2,i,j,i));
M1=Map(matrix(10,2,i,j,if(j==1,i,i*x^0)));
M2=Map(matrix(10,2,i,j,11-i));
M3=Map(matrix(10,2,i,j,12-i));
M4=Map(matrix(10,2,i,j,i*x^0));
MV=[M0,M1,M2,M3,M4];
[a==b|a<-MV;b<-MV]
[a===b|a<-MV;b<-MV]
