A<x,y> := PolynomialRing(GF(2),2);
P,homogenize := Homogenization(A);
print("f := The polynomial from math.mit.edu/~drew/FFFc29.txt reduced mod 2:");
f := y^4*(y+1)*x^12+(y^2+y+1)*y^3*(y+1)^2*x^10+x^9*y^3+(y^2+y+1)*y^5*(y+1)^2*x^8+(y^2+y+1)*y^4*(y+1)^2*x^7+y^2*(y+1)^6*(y^3+y^2+1)*x^6+y*(y^9+y^8+y^5+y^4+1)*x^5+y^4*(y+1)*(y^6+y^5+y^2+y+1)*x^4+(y+1)^4*(y^3+y^2+1)*x^3+y^2*(y+1)^5*x^2+y^3*(y+1)^4*x+y^2*(y+1)^5 ;

f := homogenize(f);
XF2 := Scheme(ProjectiveSpace(P),f);
FF := FunctionField(XF2);
AFF := AlgorithmicFunctionField(FF);
plc1 := Places(AFF,1);
divgrp := DivisorGroup(AFF);
div1 := [divgrp ! i : i in plc1];
cuspsum := &+ div1;
load "function_degrees.m";

print("The number of places of degrees 1-5:");
[#Places(AFF,i) : i in [1..5]];

// Our goal is to show that X1(29) has no non-constant functions of degree <11
// over F2 and hence over Q.

// Say f is a function of degree <= 10, since f^(-1)({0,1,infinity}) contains
// all 14 rational points, by the pigeon hole principle we may assume that
// f^(-1)({infinity} contains at least 5 distinct rational points, and so
// the remaining polar-part of f has degree at most 5.

// This contains one place of each diamond-orbit of rational places. In
// this case there is only one such orbit.
orbs := [plc1[1]];


// Degree >1 places: []
// Rat-places: [2, 2, 2, 2, 2] (only multiplicities >1 are listed).
s := {(cuspsum + 1*Q1+1*Q2+1*Q3+1*Q4+1*Q5) : Q1 in plc1, Q2 in plc1, Q3 in plc1, Q4 in plc1, Q5 in orbs};
print "The number of RR-computations to be done for this case is:",
#s;
s := &cat[FunctionDegrees(D) : D in s];
if not s eq [] then s := Min(s); end if;
s;

