/* this file compare the running time of the following routines:

1. Computation of intergral basis
2. Prime ideal factorization of p*O

The test polynomials are especially hard for the Montes algorithm!

*/

load "test_pols.m";

print"******************************
First series

                               ********************************************";


" 1 Functionfield: small degree huge disc";

A<t> := PolynomialRing(GF(13));
p := t+1;
k := 1231;
n := 4;
r := 113;
L := Apnk(p,n,k,r);

Degree(L);
Degree(Discriminant(EquationOrderFinite(L)));
"Basis Computation";

time MaximalOrderFinite(L : Al := "Montes");
//time MaximalOrderInfinite(L : Al := "Montes");

time Genus(L : Al := "Montes");
"Prime factorization";

time Decomposition(MaximalOrderFinite(L), p : Al := "Montes");
//time Decomposition(MaximalOrderInfinite(L), CoefficientRing(MaximalOrderInfinite(L))!(1/p) : Al := "Montes");

"2 Functionfield: big degree small disc";

k := 11;
n := 34;
r := 7;
L := Apnk(p,n,k,r);
L;

Degree(L);
Degree(Discriminant(EquationOrderFinite(L)));
"Basis Computation";

time MaximalOrderFinite(L : Al := "Montes");
//time MaximalOrderInfinite(L : Al := "Montes");

time Genus(L : Al := "Montes");
"Prime factorization";

time Decomposition(MaximalOrderFinite(L),p : Al := "Montes");
//time Decomposition(MaximalOrderInfinite(L), CoefficientRing(MaximalOrderInfinite(L))!(1/p) : Al := "Montes");

print"******************************
Second series

                               ********************************************";

"3 Functionfield: small degree huge disc";

k := 1313;
n := 2;
r := 131;
m := 2;
L := Ampnk(m,p,n,k,r);
L;

Degree(L);
Degree(Discriminant(EquationOrderFinite(L)));
"Basis Computation";

time MaximalOrderFinite(L : Al := "Montes");
//time MaximalOrderInfinite(L : Al := "Montes");

time Genus(L : Al := "Montes");
"Prime factorization";

time Decomposition(MaximalOrderFinite(L),p : Al := "Montes");
//time Decomposition(MaximalOrderInfinite(L), CoefficientRing(MaximalOrderInfinite(L))!(1/p) : Al := "Montes");

"4 Functionfield: small degree huge disc";

k := 13;
n := 24;
r := 31;
m := 2;
L := Ampnk(m,p,n,k,r);
L;

Degree(L);
Degree(Discriminant(EquationOrderFinite(L)));
" Basis Computation";

time MaximalOrderFinite(L : Al := "Montes");
//time MaximalOrderInfinite(L : Al := "Montes");

time Genus(L : Al := "Montes");
"Prime factorization";

time Decomposition(MaximalOrderFinite(L),p : Al := "Montes");
//time Decomposition(MaximalOrderInfinite(L), CoefficientRing(MaximalOrderInfinite(L))!(1/p) : Al := "Montes");

print"******************************
Third series

                               ********************************************";

" 5 Functionfield: small degree huge disc";

k :=1958;
L := Bpk(p,k);
L;

Degree(L);
Degree(Discriminant(EquationOrderFinite(L)));
"Basis Computation";

time MaximalOrderFinite(L : Al := "Montes");
//time MaximalOrderInfinite(L : Al := "Montes");

time Genus(L : Al := "Montes");
"Prime factorization";

time Decomposition(MaximalOrderFinite(L),p : Al := "Montes");
//time Decomposition(MaximalOrderInfinite(L), CoefficientRing(MaximalOrderInfinite(L))!(1/p) : Al := "Montes");

print"******************************
Fourth series

                               ********************************************";
"6 Functionfield: medium degree huge disc";

k := 121;
L := Cpk(p,k);
L;

Degree(L);
Degree(Discriminant(EquationOrderFinite(L)));
"Basis Computation";

time MaximalOrderFinite(L : Al := "Montes");
//time MaximalOrderInfinite(L : Al := "Montes");

time Genus(L : Al := "Montes");
"Prime factorization";

time Decomposition(MaximalOrderFinite(L),p : Al := "Montes");
//time Decomposition(MaximalOrderInfinite(L), CoefficientRing(MaximalOrderInfinite(L))!(1/p) : Al := "Montes");

print"******************************
Fifth series

                               ********************************************";
" 7 Functionfield: small degree huge disc";

k := 1133;
n := 3;
l := 3;
L := Dlpnk(l,p,n,k);
L;

Degree(L);
Degree(Discriminant(EquationOrderFinite(L)));
"Basis Computation";

time MaximalOrderFinite(L : Al := "Montes");
//time MaximalOrderInfinite(L : Al := "Montes");

time Genus(L : Al := "Montes");
"Prime factorization";

time Decomposition(MaximalOrderFinite(L),p : Al := "Montes");
//time Decomposition(MaximalOrderInfinite(L), CoefficientRing(MaximalOrderInfinite(L))!(1/p) : Al := "Montes");


"8 Functionfield: small degree huge disc";

k := 31;
n := 32;
l := 7;
L := Dlpnk(l,p,n,k);
L;

Degree(L);
Degree(Discriminant(EquationOrderFinite(L)));
"Basis Computation";

time MaximalOrderFinite(L : Al := "Montes");
//time MaximalOrderInfinite(L : Al := "Montes");

time Genus(L : Al := "Montes");
"Prime factorization";

time Decomposition(MaximalOrderFinite(L),p : Al := "Montes");
//time Decomposition(MaximalOrderInfinite(L), CoefficientRing(MaximalOrderInfinite(L))!(1/p) : Al := "Montes");

print"******************************
Sixth series

                               ********************************************";
"9 Functionfield: small degree huge disc";

k := 3;
L := Epk(p,k);
L;

"Basis Computation";

time MaximalOrderFinite(L : Al := "Montes");
//time MaximalOrderInfinite(L : Al := "Montes");

time Genus(L : Al := "Montes");
"Prime factorization";

time Decomposition(MaximalOrderFinite(L),p : Al := "Montes");
//time Decomposition(MaximalOrderInfinite(L), CoefficientRing(MaximalOrderInfinite(L))!(1/p) : Al := "Montes");

"10 Functionfield: medium degree medium disc";

L := Epk(p,5);
L;

Degree(L);
Degree(Discriminant(EquationOrderFinite(L)));
"Basis Computation";

time MaximalOrderFinite(L : Al := "Montes");
//time MaximalOrderInfinite(L : Al := "Montes");

time Genus(L : Al := "Montes");
"Prime factorization";

time Decomposition(MaximalOrderFinite(L),p : Al := "Montes");
//time Decomposition(MaximalOrderInfinite(L), CoefficientRing(MaximalOrderInfinite(L))!(1/p) : Al := "Montes");

print"******************************
Sixth series

                               ********************************************";
"11 Functionfield: small degree huge disc";

k := 1231;
n := 4;
L := Eisen(p,n,k);
L;

Degree(L);
Degree(Discriminant(EquationOrderFinite(L)));
"Basis Computation";

time MaximalOrderFinite(L : Al := "Montes");
//time MaximalOrderInfinite(L : Al := "Montes");

time Genus(L : Al := "Montes");
"Prime factorization";

time Decomposition(MaximalOrderFinite(L),p : Al := "Montes");
//time Decomposition(MaximalOrderInfinite(L), CoefficientRing(MaximalOrderInfinite(L))!(1/p) : Al := "Montes");

"12 Functionfield: small degree small disc";

k := 13;
n := 220;
L := Eisen(p,n,k);
L;

Degree(L);
Degree(Discriminant(EquationOrderFinite(L)));
"Basis Computation";

time MaximalOrderFinite(L : Al := "Montes");
//time MaximalOrderInfinite(L : Al := "Montes");

time Genus(L : Al := "Montes");
"Prime factorization";

time Decomposition(MaximalOrderFinite(L),p : Al := "Montes");
//time Decomposition(MaximalOrderInfinite(L), CoefficientRing(MaximalOrderInfinite(L))!(1/p) : Al := "Montes");

