jell(x)=if(#x,x.j,[]);
{
test(p,f) = setrand(1); a = ffgen([p,f], 'a); [
a^2+3*a+1,
a/(1+a),
2*(a+1)/3,
1/5+a,
if (6*a, 5/6/(a+1)),
if (6*a, 5/6*(a+1)),
shiftmul(a+1,10),
if (2*a, shiftmul(a+1,-10)),
a^-1,
-a,
sqr(a),
sqrt(a^(2^10)),
sqrtn((a^2+a+1)^3,3),
sqrtn((a^2+a+1)^3,3,&z),
z,
if (ispower(a,3), a^(2/3)),
norm(a^2+1),
trace(a),
charpoly(a),
minpoly(a),
conjvec(a),
factor(x^6-a*x^3+1),
jell(ellinit([a,1])),
a/x,
(x+a)/(x-a),
if(1,setrand(1);b=ffprimroot(a)),
fforder(a),
b^fflog(a,b),
factorff(x^2+x+a),
polrootsff(x^2+x+a)
];
}
default(echo,1);

test(2, 20)
test(7, 7)
test(precprime(2^32), 3)
test(nextprime(2^32), 3)

ftest(p,n,r)=
{
  my(a=ffgen(ffinit(p,n),'a)^r);
  if(sqrtn(a,r)^r!=a,error([p,n,r]));
}

ftest(2,1005,7);
ffgen(ffinit(2^32-5,101),'a)^10000
ffgen(ffinit(2^64-59,101),'a)^10000

for(i=1,10,print(ffnbirred(11,i)));
for(i=1,10,print(ffnbirred(11,i,1)));

t = ffgen(2^64)^((2^64-1)\5);1/t

sqrt(Mod(-1,4296540161))
sqrt(Mod(-1,18446744073944432641))
centerlift(factorcantor(prod(i=-10,10,(x^2-i)),2^64+13)[,1])
ffgen(x^2+x+Mod(1,3))
conjvec(Mod(x, x^2+Mod(1,3)))

test(q)=
{
  my(t = ffgen(q,'t), m=[t,t^2,1+t^3; 1+t,1+t^2,1+t^3]);
  print(matker(m));
  print(matimage(m));
  print(matrank(m));
  my(M = [t,2*t^0,3*t^0; t,t^2,1+t^3; 1+t,1+t^2,1+t^3]);
  print(matdet(M));
  print(M^(-1)*M);
  my(v = [t^0, t^1, t^2]~);
  print(M*v);
  my(N = t*[0, 1; 0, 0]);
  iferr(N^-1, e,, errname(e) == "e_INV");
}
test(2^5)
test(7^5)
test((2^64+13)^5)

test(q)={
  my(t = ffgen(q, 't), M = matrix(10, 10, i, j, random(t)));
  subst(charpoly(M), 'x, M) == 0;
}
test(nextprime(2^7)^5)
test(nextprime(2^15)^5)
test(nextprime(2^31)^5)
test(nextprime(2^63)^5)
