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

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-4:");
[#Places(AFF,i) : i in [1..4]];
// [ 9, 3, 0, 0 ]

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

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

// 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: [2]
// Rat-places: [] (only multiplicities >1 are listed).
s := {(cuspsum + P1) : P1 in Places(AFF,2)};
s := Min( &cat[FunctionDegrees(D) : D in s] );
s;

// Degree >1 places: []
// Rat-places: [2, 2] (only multiplicities >1 are listed).
s := {(cuspsum + 1*Q1+1*Q2) : Q1 in plc1, Q2 in orbs};
s := Min( &cat[FunctionDegrees(D) : D in s] );
s;
