// SetVerbose("Tuitman", 3);

R<x> := PolynomialRing(RationalField());
R<y> := PolynomialRing(R);

//////////////////////////////////////////////////////////////////////////
"\nDegree 4";

Q := y^4 + (91928760555565478733*x + 2244361757896636298)*y^3 + 
    (209698942806408504882*x^2 + 679886983491030868810*x + 
    391539259472362353795)*y^2 + (706437068453413913327*x^3 + 
    328484375155260211814*x^2 + 486734928687070545797*x + 8774064500182803195)*y
    + 476915482725587791310*x^4 + 146783226398770092097*x^3 + 
    98480383209640792360*x^2 + 237826940102698559271*x + 73988014541275897640;

for p in [5, 13, 17, 23] do
    "Prime", p;
    time z := ZetaFunction(Q, p);
    time CheckZetaFunction(Q, p, z);
end for;

//////////////////////////////////////////////////////////////////////////

"Degree 5";

Q := y^5 + (489366869181567611086718019419287962158015448651481*x +
597495423401295132166863269249026976555047898275093)*y^4 +
(350579322898083644519288011100273636999340903850861*x^2 +
668620144048450770188860077972661535670940904511248*x +
218001881865754145694889724871551475415621996048343)*y^3 +
(855001628575694257167265626740112502849721049822916*x^3 +
975102091785399628903206330617454478786213344257719*x^2 +
923556096024650955171723446791883948285894722471231*x +
654807997097894131240126937480143428026548934727794)*y^2 +
(55125529664752333363230161916756640182190786455216*x^4 +
624985817297392415514400475142688796881296923736038*x^3 +
33910399429346902133593970157977352723502901384851*x^2 +
522126473666978132810609279556791885442190633999320*x +
76133901844027558094490217356137776872740706038221)*y +
717397904696394030018183938124184320859812682923958*x^5 +
125663096864252080254553621339837838771014150447888*x^4 +
840909930124637139783755762659176901487465063349753*x^3 +
733277636379979040104692087509037877847193608963217*x^2 +
249425589296543458526805847836851855626309213720608*x +
19492100289775323386275414124753859267358349722626;

F<t> := FunctionField(IntegerRing());

p := 7; "Prime", p;
time z := ZetaFunction(Q, p);
assert z eq
    (117649*x^12 + 16807*x^11 + 21609*x^10 + 8918*x^9 + 2891*x^8
	+ 1274*x^7 + 413*x^6 + 182*x^5 + 59*x^4 + 26*x^3 + 9*x^2
	+ x + 1)/(7*x^2 - 8*x + 1);
time CheckZetaFunction(Q, p, z);

p := 11; "Prime", p;
time z := ZetaFunction(Q, p);
assert z eq
    (1771561*x^12 - 1288408*x^11 + 424589*x^10 - 57233*x^9 + 
	2178*x^8 - 2497*x^7 + 1558*x^6 - 227*x^5 + 18*x^4 - 
	43*x^3 + 29*x^2 - 8*x + 1)/(11*x^2 - 12*x + 1);

p := 13; "Prime", p;
time z := ZetaFunction(Q, p);
assert z eq
    (4826809*x^12 + 742586*x^11 + 342732*x^10 + 116441*x^9 + 
	31434*x^8 + 5746*x^7 + 3483*x^6 + 442*x^5 + 186*x^4 + 
	53*x^3 + 12*x^2 + 2*x + 1)/(13*x^2 - 14*x + 1);


//////////////////////////////////////////////////////////////////////////
"\nDegree 6";

 Q := y^6 + (37944*x + 424615)*y^5 + (179422*x^2 + 372739*x + 367112)*y^4 +
 (373088*x^3 + 342914*x^2 + 148044*x + 517220)*y^3 + (123736*x^4 + 176042*x^3 +
 169355*x^2 + 130532*x + 261787)*y^2 + (391521*x^5 + 100723*x^4 + 424858*x^3 +
 224272*x^2 + 492275*x + 272191)*y + 394614*x^6 + 43390*x^5 + 165869*x^4 +
 358848*x^3 + 464796*x^2 + 149177*x + 90835;


for p in [5, 7, 11, 13, 17] do
    "Prime", p;
    time z := ZetaFunction(Q, p);
    time CheckZetaFunction(Q, p, z);
end for;

//////////////////////////////////////////////////////////////////////////

p := 61;
R<x> := PolynomialRing(GF(p));
z3 := Roots(x^2 + x + 1)[1][1];
F := GF(p);
R<a,b,c> := PolynomialRing(F,3);
f := a^4 + (z3-1)*a^3*b + (3*z3+2)*a^3*c -3*a^2*c^2 + (2*z3+2)*a*b^3 -
 3*z3*a*b^2*c + 3*z3*a*b*c^2 - 2*z3*a*c^3 - z3*b^3*c + 3*z3*b^2*c^2 +
 (-z3+1)*b*c^3 + (z3+1)*c^4;
OR := R;
C := Curve(ProjectiveSpace(R),f);
C;
R<t> := PolynomialRing(Integers());
for i := 1 to 10 do
    "i:", i; GetSeed();
    time zeta := LPolynomial(C); // crashes
    C := Curve(ProjectiveSpace(OR),f);
end for;

//////////////////////////////////////////////////////////////////////////

// E Costa, Sep 2024

"Special degree 9";

R<x> := PolynomialRing(RationalField());
R<y> := PolynomialRing(R);

for p in [3, 5, 7] do
    "Prime", p;
    t := 314;
    f := y^9 - x*(x-1)^3*(x-t)^6;
    time z := ZetaFunction(f, p);
    time CheckZetaFunction(f, p, z);
end for;
