allocatemem(50*10^6);
{
test(p,f) = setrand(1); a = ffgen(ffinit(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),
if (2*a && 4*a^3+27, ellinit([0,0,0,a,1])),
a/x,
(x+a)/(x-a),
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)

test2(p)=
{
  ffgen(x*Mod(1,p));
  g = ffprimroot(ffgen((x+1)*Mod(1,p)), &o);
  print([g, o]);
  fflog(g^17, g, o);
}
test2(2)
test2(3)
test2(46744073709551653)
test2(precprime(1<<32))

do(f,p,T)=centerlift(lift(polrootsff(f,p,T)));
do(x^3+x^2+x-1,3,t^3+t^2+t-1)
t = ffgen(ffinit(3,3),'t); do((x^3+x^2+x-1)*t^0, t.p, t.mod)
polrootsff(x^4+1,2,y^2+y+1)

t = ffgen(ffinit(7,4)); fflog(t^6,t^2)

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

t = ffgen(('t^2+'t+1)*Mod(1,2));
factorff(x^12 + t*x^10 + x^6 + (t+1)*x^2 + 1)

\\ #1241
polrootsff(x^2 - x - ffgen((v^2+1) * Mod(1,3)))

