SetEchoInput(true);

P<x> := PolynomialRing(GF(5));
P<y> := PolynomialRing(P);
F<c> := FunctionField(y^5 - y - x + 1);
D := Factorization(Discriminant(DefiningPolynomial(
EquationOrderInfinite(F))));
time pMaximalOrder(EquationOrderInfinite(F), D[1][1]);
assert Discriminant($1) eq 4/x^8;

time MaximalOrderFinite(F);
assert Discriminant($1) eq 4;
time MaximalOrderInfinite(F);
assert Discriminant($1) eq 4/x^8;

P<x> := PolynomialRing(GF(11));
P<y> := PolynomialRing(FieldOfFractions(P));
F<c> := FunctionField(y^11 - y - x^2 + 1/x);
D := Factorization(Discriminant(DefiningPolynomial(EquationOrderFinite(F))));
time pMaximalOrder(EquationOrderFinite(F), D[1][1]);
assert Discriminant($1) eq x^20;

D := Factorization(Discriminant(DefiningPolynomial(
EquationOrderInfinite(F))));
time pMaximalOrder(EquationOrderInfinite(F), D[1][1]);
assert Discriminant($1) eq 1/x^30;

time MaximalOrderFinite(F);
assert Discriminant($1) eq x^20;
time MaximalOrderInfinite(F);
assert Discriminant($1) eq 1/x^30;

P<x> := PolynomialRing(GF(7, 3));
P<y> := PolynomialRing(P);
F<c> := FunctionField(y^7 - y + x^3 + x + 1);
D := Factorization(Discriminant(DefiningPolynomial(EquationOrderFinite(F))));

D := Factorization(Discriminant(DefiningPolynomial(
EquationOrderInfinite(F))));
time pMaximalOrder(EquationOrderInfinite(F), D[1][1]);
assert Discriminant($1) eq 1/x^24;

time MaximalOrderFinite(F);
assert Discriminant($1) eq 1;
time MaximalOrderInfinite(F);
assert Discriminant($1) eq 1/x^24;

P<x> := FunctionField(GF(5));
P<y> := PolynomialRing(P);
F<c> := FunctionField(y^5 - y - x + 1 + a^5 - a) where a := 1/x^3+1/x+(2*x+x^2+1
)/(x-1);
F;
D := Factorization(Discriminant(DefiningPolynomial(
EquationOrderInfinite(F))));
time pMaximalOrder(EquationOrderInfinite(F), D[1][1]);
assert Discriminant($1) eq (4*x^20 + 4*x^15 + 4*x^10 + 4*x^5 + 4)/x^28;
D := Factorization(Numerator(Discriminant(DefiningPolynomial(EquationOrderFinite
(F)))));
time pMaximalOrder(EquationOrderFinite(F), D[1][1]);
assert Discriminant($1) eq 4*x^20 + 4*x^15 + 4*x^10 + 4*x^5 + 4;
time pMaximalOrder(EquationOrderFinite(F), D[2][1]);
assert Discriminant($1) eq 4*x^60;

time MaximalOrderFinite(F);
assert Discriminant($1) eq 4;
time MaximalOrderInfinite(F);
assert Discriminant($1) eq (4*x^20 + 4*x^15 + 4*x^10 + 4*x^5 + 4)/x^28;

P<x> := PolynomialRing(GF(5));
P<y> := PolynomialRing(P);
K<a> := FunctionField(y^3 + y + 1);
P<y> := PolynomialRing(K);
F<c> := FunctionField(y^5 - y + K!x);
D := Factorization(MaximalOrderInfinite(K)*Discriminant(DefiningPolynomial(
EquationOrderInfinite(F))));
time pMaximalOrder(EquationOrderInfinite(F), D[1][1]);
assert Discriminant($1) eq 4/x^8*MaximalOrderInfinite(K);

time MaximalOrderFinite(F);
assert Discriminant($1) eq 4*MaximalOrderFinite(K);
time MaximalOrderInfinite(F);
assert Discriminant($1) eq 4/x^8*MaximalOrderInfinite(K);

P<x> := PolynomialRing(GF(11));
P<y> := PolynomialRing(FieldOfFractions(P));
K<a> := FunctionField(y^2 + 1);
P<y> := PolynomialRing(K);
F<c> := FunctionField(y^11 - y - K!x^2 + K!1/x);
D := Factorization(MaximalOrderFinite(K)*Discriminant(DefiningPolynomial(
                                                EquationOrderFinite(F))));
time pMaximalOrder(EquationOrderFinite(F), D[1][1]);
assert Discriminant($1) eq x^20*MaximalOrderFinite(K);

D := Factorization(MaximalOrderInfinite(K)*Discriminant(DefiningPolynomial(
EquationOrderInfinite(F))));
time pMaximalOrder(EquationOrderInfinite(F), D[1][1]);
assert Discriminant($1) eq 1/x^30*MaximalOrderInfinite(K);

time MaximalOrderFinite(F);
assert Discriminant($1) eq x^20*MaximalOrderFinite(K);

time MaximalOrderInfinite(F);
assert Discriminant($1) eq 1/x^30*MaximalOrderInfinite(K);

P<x> := PolynomialRing(GF(7, 3));
P<y> := PolynomialRing(P);
K<a> := FunctionField(y^4 + y + 2);
P<y> := PolynomialRing(K);
F<c> := FunctionField(y^7 - y + K!x^3 + K!x + 1);

D := Factorization(MaximalOrderInfinite(K)*Discriminant(DefiningPolynomial(
EquationOrderInfinite(F))));
time pMaximalOrder(EquationOrderInfinite(F), D[1][1]);
assert Discriminant($1) eq 1/x^24*MaximalOrderInfinite(K);

time MaximalOrderFinite(F);
assert Discriminant($1) eq 1*MaximalOrderFinite(K);

time MaximalOrderInfinite(F);
assert Discriminant($1) eq 1/x^24*MaximalOrderInfinite(K);

k := GF(5);
kt<t> := FunctionField(k);
Places(kt, 1) cat Places(kt, 2);
p := $1;
D := 2*Random(p) + 2*Random(p);
R, mR := RayClassGroup(D);
U := 5*R; repeat U := sub<R|Random(R), U>; until #quo<R|U> eq 5;
A := AbelianExtension(D, U);
DA := DiscriminantDivisor(A);
F := FunctionField(A);
F := FunctionField(DefiningPolynomials(F)[1]);
K := RationalExtensionRepresentation(CoefficientField(F));
D := Factorization(MaximalOrderFinite(K)*Discriminant(DefiningPolynomial(
EquationOrderFinite(F))));
D;
time MaximalOrderFinite(F);
CF := CoefficientField(F);
PCF := Places(CF);
for d in D do
    time pMaximalOrder(EquationOrderFinite(F), Minimum(d[1]));
    Discriminant($1);
    Factorization($1);
    assert Valuation(DA, PCF!Place(d[1])) eq 
	Valuation(Divisor(CF!($2)), PCF!Place(d[1]));
    assert &and [Valuation(Divisor(CF!$2), PCF!Place(p[1])) eq 
	Valuation(Divisor(CF!Discriminant(EquationOrderFinite(F))), 
		PCF!Place(p[1])) : p in Exclude(D, d)];
    assert &and [f[2] ge 
    		Valuation(Divisor(CF!Discriminant(MaximalOrderFinite(F))),
		PCF!Place(f[1]*MaximalOrderFinite(K))) : f in $1];
    assert &and [f[2] le 
    Valuation(Divisor(CF!Discriminant(EquationOrderFinite(F))), 
		PCF!Place(f[1]*MaximalOrderFinite(K))) : f in $1];
end for;
D := Factorization(MaximalOrderInfinite(K)*Discriminant(DefiningPolynomial(
EquationOrderInfinite(F))));
D;
time MaximalOrderInfinite(F);
for d in D do
    time pMaximalOrder(EquationOrderInfinite(F), CoefficientRing(EquationOrderInfinite(F))!Minimum(d[1]));
    Discriminant($1);
    Factorization($1);
    assert Valuation(DA, PCF!Place(d[1])) eq 
	Valuation(Divisor(CF!($2)), PCF!Place(d[1]));
    assert &and [Valuation(Divisor(CF!$2), PCF!Place(p[1])) eq 
	Valuation(Divisor(CF!Discriminant(EquationOrderInfinite(F))), 
		PCF!Place(p[1])) : p in Exclude(D, d)];
    assert &and [f[2] ge 
    		Valuation(Divisor(CF!Discriminant(MaximalOrderInfinite(F))),
		PCF!Place(f[1]*MaximalOrderInfinite(K))) : f in $1];
    assert &and [f[2] le 
    Valuation(Divisor(CF!Discriminant(EquationOrderInfinite(F))), 
		PCF!Place(f[1]*MaximalOrderInfinite(K))) : f in $1];
end for;
assert DiscriminantDivisor(A) eq 
FiniteDivisor(Divisor(CoefficientField(F)!Discriminant(MaximalOrderFinite(F)))) + 
InfiniteDivisor(Divisor(CoefficientField(F)!Discriminant(MaximalOrderInfinite(F))));

k := GF(5);
kt<t> := FunctionField(k);
kty<y> := PolynomialRing(kt);
K := FunctionField(y^3+y+1);
p := Places(K, 3) cat Places(K, 2);
Div := 
2*Place(ideal<MaximalOrderFinite(K) | t^3 + 3*t + 3, K.1 + t^2 + 3*t + 2>) +
2*Place(ideal<MaximalOrderInfinite(K) | 1/t>);
R, mR := RayClassGroup(Div);
Fs := [ext<K | x^5 + 4*x + (3*t^3 + 3*t^2 + 2*t + 2)/(t^3 + 3*t + 3)*K.1^2 + 
	(t^4 + 4*t^2 + 3*t)/(t^3 + 3*t + 3)*K.1 + (4*t^4 + t^3 + t^2)/(t^3 + 
	3*t + 3)> where x is PolynomialRing(K).1, 
       ext<K | x^5 + 4*x + (3*t^4 + 3*t^3 + t^2 + 3*t + 1)/(t^3 + 3*t + 3)*K.1^2
       + (4*t^4 + 2*t^2 + 4)/(t^3 + 3*t + 3)*K.1 + (3*t^3 + 4*t^2 + 2)/(t^3 + 
       3*t + 3)> where x is PolynomialRing(K).1];
U := [sub<R | 2*r1 + r2, 3*r1 + r3, 3*r1 + r4, 3*r1 + r5, r1 + r6>, 
   sub<R | r1 + 3*r2, 3*r2 + r3, 3*r2 + r4, 2*r2 + r5, 2*r2 - r6>]
   where r1 := Divisor(ideal<MaximalOrderFinite(K) | t^9 + 3*t^8 + 3*t^7 + 
   3*t^3 + 4*t^2 + 3*t + 4, (4*t + 1)/t^2*K.1^2 + (4*t^2 + 4)/t^3*K.1 + 
   (2*t^11 + 2*t^10 + 2*t^9 + 2*t^8 + 3*t^6 + 4*t^3 + 4*t + 1)/t^3>) @@ mR
   where r2 := Divisor(ideal<MaximalOrderFinite(K) | t^9 + 3*t^7 + 3*t^6 + 
   2*t^4 + 3*t^3 + t + 1, 1/t^2*K.1^2 + (t^2 + 3*t + 3)/t^3*K.1 + (2*t^10 + 
   4*t^9 + t^8 + 3*t^7 + t^6 + 4*t^5 + t^4 + t^3 + 2*t^2 + 4*t + 2)/t^3>) @@ mR
   where r3 := Divisor(ideal<MaximalOrderFinite(K) | t^9 + t^7 + 4*t^6 + t^5 + 
   4*t^4 + 3*t^3 + 2*t + 2, (4*t^2 + t + 4)/t^3*K.1^2 + (t^2 + 1)/t^3*K.1 + 
   (2*t^11 + t^10 + 2*t^9 + t^8 + 2*t^7 + t^6 + 2*t^5 + 4*t^2 + 4*t + 3)/t^3>) 
   @@ mR where r4 := Divisor(ideal<MaximalOrderFinite(K) | t^9 + 4*t^8 + t^7 + 
   t^6 + 3*t^5 + t^4 + 2*t^3 + t^2 + 3, (t^2 + 4*t + 1)/t^3*K.1^2 + 
   (2*t + 2)/t^2*K.1 + (3*t^11 + 2*t^9 + 2*t^8 + t^7 + t^6 + 4*t^4 + 2*t^3 + 
   2*t^2 + 2*t + 2)/t^3>) @@ mR
   where r5 := Divisor(ideal<MaximalOrderFinite(K) | t^9 + 2*t^8 + 3*t^7 + 
   4*t^6 + 3*t^5 + t^4 + 3*t^3 + 3*t^2 + 4*t + 2, (4*t^2 + 3*t + 3)/t^3*K.1^2 + 
   (4*t^2 + t + 2)/t^3*K.1 + (2*t^11 + t^10 + 3*t^9 + 3*t^7 + 2*t^5 + 2*t^4 + 
   2*t^3 + t^2 + 3*t + 3)/t^3>) @@ mR
   where r6 := Divisor(ideal<MaximalOrderFinite(K) | t^3, (2*t^5 + 2*t^4 + 
   3*t^3)/(t^4 + 3*t^3 + 3*t^2 + 4*t + 3)*K.1^2 + (4*t^7 + 4*t^6 + 2*t^5 + 
   2*t^4 + 2*t^3)/(t^3 + 2*t^2 + t + 3)*K.1 + (3*t^7 + 2*t^6 + 4*t^5 + 
   2*t^4)/(t^3 + 2*t^2 + t + 3)>) @@ mR;

u1 := Divisor(ideal<MaximalOrderFinite(K)|t^3 + 4*t^2 + t + 2, K.1 + 4*t^2 + t + 1>)
    + Divisor(ideal<MaximalOrderFinite(K)|t^6 + 3*t^2 + t + 4, K.1 + t^5 + 3*t^2 + 2*t>)
    -3* Divisor(ideal<MaximalOrderFinite(K)|t>);

u2 := Divisor(ideal<MaximalOrderFinite(K)|t^9 + 3*t^8 + 4*t^7 + 2*t^6 + t^5 + 3*t^3 + 3*t^2 + t + 3, K.1 + 4*t^8 + 3*t^6 
    + 3*t^5 + 2*t^3 + 4*t^2 + t + 4>) - 3*Divisor(ideal<MaximalOrderFinite(K)|t>);
   
U[1] := sub<R|U[1], u1@@mR>;
U[2] := sub<R|U[2], u2@@mR>;

Fs := [<Fs[1], U[1]>, <Fs[2], U[2]>];

for FF in Fs do
    U := FF[2];
    F := FF[1];
    time MaximalOrderFinite(F);
    //Discriminant($1);
    //Factorization($1);
    time MaximalOrderInfinite(F);
    //Discriminant($1);
    disc_sum := Divisor(Discriminant(MaximalOrderFinite(F))) + 
		    Divisor(Discriminant(MaximalOrderInfinite(F)));
    A := AbelianExtension(Div, U);
    DA := DiscriminantDivisor(A);
    assert DA eq disc_sum;

    K := RationalExtensionRepresentation(CoefficientField(F));
    D := Factorization(MaximalOrderFinite(K)*Discriminant(DefiningPolynomial(
	    EquationOrderFinite(F))));
    D;
    for d in D do
	time pMaximalOrder(EquationOrderFinite(F), d[1]);
	disc := Discriminant($1);
	disc_fact := Factorization(disc);
	assert Valuation(disc, d[1]) eq Valuation(DA, Place(d[1]));
	assert &and
	[Valuation(disc, p[1]) eq Valuation(Discriminant(
			EquationOrderFinite(F)), p[1]) : p in Exclude(D, d)];
	assert &and [f[2] ge Valuation(DA, Place(f[1])) : f in disc_fact];
	assert &and [f[2] le Valuation(Discriminant(EquationOrderFinite(F)), f[1]) : f in disc_fact];
    end for;
    D := Factorization(MaximalOrderInfinite(K)*Discriminant(DefiningPolynomial(
    EquationOrderInfinite(F))));
    D;
    for d in D do
	time pMaximalOrder(EquationOrderInfinite(F), d[1]);
	disc := Discriminant($1);
	disc_fact := Factorization(disc);
	assert Valuation(disc, d[1]) eq Valuation(DA, Place(d[1]));
	assert &and
	[Valuation(disc, p[1]) eq Valuation(Discriminant(
			EquationOrderInfinite(F)), p[1]) : p in Exclude(D, d)];
	assert &and [f[2] ge Valuation(DA, Place(f[1])) : f in disc_fact];
	assert &and [f[2] le Valuation(Discriminant(EquationOrderInfinite(F)), f[1]) : f in disc_fact];
    end for;

end for;

k := GF(5);
kt<t> := FunctionField(k);
kty<y> := PolynomialRing(kt);
K := FunctionField(y^4+3*y+t^2+t+1);
Div := [2*Place(ideal<MaximalOrderInfinite(K) | 1/t, 1/t*K.1^2 + 1/t*K.1 + 3>),
2*Place(ideal<MaximalOrderFinite(K) | t + 4, K.1 + 3>) +
2*Place(ideal<MaximalOrderInfinite(K) | 1/t, 4/t*K.1^2 + 1/t*K.1 + 3>)];
Append(~Div, Div[2]);
Fs := 
[ ext<K | x^5 + 4*x + (2*t + 1)*K.1^3 + 3*K.1^2 + (t^2 + t + 4)*K.1 + 2*t + 
2> where x is PolynomialRing(K).1,
ext< K | x^5 + 4*x + (3*t^2 + t + 3)/(t + 4)*K.1^3 + (3*t + 1)/(t + 4)*
K.1^2 + (t^3 + 4*t
+ 3)/(t + 4)*K.1 + (3*t^2 + 3*t + 1)/(t + 4)> where x is PolynomialRing(K).1,
ext<K | x^5 + 4*x + 3/(t + 4)*K.1^3 + 1/(t + 4)*K.1^2 + (4*t + 3)/(t + 
4)*K.1 + (4*t + 
4)/(t + 4)> where x is PolynomialRing(K).1];

//R, mR := RayClassGroup(Div);
U := [sub<R | 5*r1, r2> where
r1 := (Place(ideal<MaximalOrderInfinite(K) | 1/t, 4/t*K.1^2 + 1/t*K.1 + 3>) - 
Place(ideal<MaximalOrderFinite(K) | t, K.1 + 4>)) @@ mR where 
r2 := Place(ideal<MaximalOrderFinite(K) | t, K.1 + 4>) @@ mR 
where R, mR := RayClassGroup(Div[1]), 
sub<R | r1 + r2, 3*r1 + r3> where 
r1 := (332*Place(ideal<MaximalOrderInfinite(K) | 1/t, 1/t*K.1^2 + 1/t*K.1 + 3>) 
+ 2*Place(ideal<MaximalOrderFinite(K) | t, K.1 + 4>) - 
56*Place(ideal<MaximalOrderFinite(K) | t^6 + 4*t^5 + 4*t^4 + 2*t^3 + 4*t^2 + 2*t
+ 1, K.1 + 2*t^5 + 3*t^4 + t^3 + 4*t + 4>) + Place(ideal<MaximalOrderFinite(K) |
t + 2, K.1^2 + 4*K.1 + 2>)) @@ mR where 
r2 := (6*Place(ideal<MaximalOrderInfinite(K) | 1/t, 1/t*K.1^2 + 1/t*K.1 + 3>) - 
Place(ideal<MaximalOrderFinite(K) | t^6 + 4*t^5 + 4*t^4 + 2*t^3 + 4*t^2 + 2*t + 
1, K.1 + 2*t^5 + 3*t^4 + t^3 + 4*t + 4>)) @@ mR 
where r3 := Place(ideal<MaximalOrderFinite(K) | t, K.1 + 4>) @@ mR 
where R, mR := RayClassGroup(Div[2]),
sub<R | 4*r1 + 5*r2, 139*R.2 + R.3> where
r1 := (332*Place(ideal<MaximalOrderInfinite(K) | 1/t, 1/t*K.1^2 + 1/t*K.1 + 3>) 
+ 2*Place(ideal<MaximalOrderFinite(K) | t, K.1 + 4>) - 
56*Place(ideal<MaximalOrderFinite(K) | t^6 + 4*t^5 + 4*t^4 + 2*t^3 + 4*t^2 + 2*t
+ 1, K.1 + 2*t^5 + 3*t^4 + t^3 + 4*t + 4>) + Place(ideal<MaximalOrderFinite(K) |
t + 2, K.1^2 + 4*K.1 + 2>)) @@ mR where 
r2 := (6*Place(ideal<MaximalOrderInfinite(K) | 1/t, 1/t*K.1^2 + 1/t*K.1 + 3>) - 
Place(ideal<MaximalOrderFinite(K) | t^6 + 4*t^5 + 4*t^4 + 2*t^3 + 4*t^2 + 2*t + 
1, K.1 + 2*t^5 + 3*t^4 + t^3 + 4*t + 4>)) @@ mR 
where r3 := Place(ideal<MaximalOrderFinite(K) | t, K.1 + 4>) @@ mR 
where R, mR := RayClassGroup(Div[3])];

Fs := [<Fs[1], U[1], Div[1]>, <Fs[2], U[2], Div[2]>, <Fs[3], U[3], Div[3]>];
for FF in Fs do
    U := FF[2];
    F := FF[1];
    Div := FF[3];
    time MaximalOrderFinite(F);
    //Discriminant($1);
    //Factorization($1);
    time MaximalOrderInfinite(F);
    //Discriminant($1);
    //Factorization($1);

    disc_sum := Divisor(Discriminant(MaximalOrderFinite(F))) + 
		    Divisor(Discriminant(MaximalOrderInfinite(F)));
    A := AbelianExtension(Div, U);
    DA := DiscriminantDivisor(A);
    assert DA eq disc_sum;
    DA := disc_sum;

    K := RationalExtensionRepresentation(CoefficientField(F));
    D := Factorization(MaximalOrderFinite(K)*Discriminant(DefiningPolynomial(
    EquationOrderFinite(F))));
    D;
    for d in D do
	time pMaximalOrder(EquationOrderFinite(F), d[1]);
	disc := Discriminant($1);
	disc_fact := Factorization(disc);
	assert Valuation(disc, d[1]) eq Valuation(DA, Place(d[1]));
	assert &and
	[Valuation(disc, p[1]) eq Valuation(Discriminant(
			EquationOrderFinite(F)), p[1]) : p in Exclude(D, d)];
	assert &and [f[2] ge Valuation(DA, Place(f[1])) : f in disc_fact];
	assert &and [f[2] le Valuation(Discriminant(EquationOrderFinite(F)), f[1]) : f in disc_fact];
    end for;

    D := Factorization(MaximalOrderInfinite(K)*Discriminant(DefiningPolynomial(
    EquationOrderInfinite(F))));
    D;
    EOI := Order(MaximalOrderInfinite(K), Basis(EquationOrderInfinite(F), F) : 
									Order);
    for d in D do 
	time pMaximalOrder(EOI, d[1]);
	disc := Discriminant($1);
	disc_fact := Factorization(disc);
	assert Valuation(disc, d[1]) eq Valuation(DA, Place(d[1]));
	assert &and
	[Valuation(disc, p[1]) eq Valuation(Discriminant(
			EOI), p[1]) : p in Exclude(D, d)];
	assert &and [f[2] ge Valuation(DA, Place(f[1])) : f in disc_fact];
	assert &and [f[2] le Valuation(Discriminant(EOI), f[1]) : f in disc_fact];
    end for;
end for;

k := GF(5);
kt<t> := FunctionField(k);
kty<y> := PolynomialRing(kt);
K := FunctionField(y^4+3*y+t^2+t+1);
F := ext<K | x^5 + 4*x + 3/(t + 4)*K.1^3 + 1/(t + 4)*K.1^2 + (4*t + 3)/(t + 
4)*K.1 + (4*t + 
4)/(t + 4)> where x is PolynomialRing(K).1;
F;
D := Factorization(MaximalOrderFinite(K)*Discriminant(DefiningPolynomial(
EquationOrderFinite(F))));
D;
d := D[2];
time pMaximalOrder(EquationOrderFinite(F), d[1]);
Discriminant($1);
Factorization($1);

k := GF(5);
kt<t> := FunctionField(k);
p := Places(kt, 1) cat Places(kt, 2);
for i in [1 .. 5] do
    Div := 2*Random(p) + 2*Random(p);
    R, mR := RayClassGroup(Div);
    for j in [1 .. 5] do
        U := 5*R; repeat U := sub<R|Random(R), U>; until #quo<R|U> eq 5;
        A := AbelianExtension(Div, U);
        F := FunctionField(A);
        F := FunctionField(DefiningPolynomials(F)[1]);
        K := RationalExtensionRepresentation(CoefficientField(F));
        CF := CoefficientField(F);
        PCF := Places(CF);
        MaximalOrderFinite(F);
        Md := Discriminant($1);
        Mf := Factorization(Md);
        DA := DiscriminantDivisor(A);
        D := Factorization(MaximalOrderFinite(K)*Discriminant(
                            DefiningPolynomial(EquationOrderFinite(F))));
        D;
        for d in D do
            assert Valuation(DA, PCF!Place(d[1])) eq
                Valuation(Divisor(CF!(Md)), PCF!Place(d[1]));
            time pMaximalOrder(EquationOrderFinite(F), Minimum(d[1]));
            disc := Discriminant($1);
            disc_fact := Factorization(disc);
            assert Valuation(DA, PCF!Place(d[1])) eq
                Valuation(Divisor(CF!(disc)), PCF!Place(d[1]));
            assert &and [Valuation(Divisor(CF!disc), PCF!Place(p[1])) eq
                Valuation(Divisor(CF!Discriminant(EquationOrderFinite(F))),
                        PCF!Place(p[1])) : p in Exclude(D, d)];
            assert &and [f[2] ge
                        Valuation(Divisor(CF!Discriminant(
                        MaximalOrderFinite(F))),
                        PCF!Place(f[1]*MaximalOrderFinite(K))) : f in disc_fact];
            assert &and [f[2] le
            Valuation(Divisor(CF!Discriminant(EquationOrderFinite(F))),
                PCF!Place(f[1]*MaximalOrderFinite(K))) : f in disc_fact];
        end for;
        D := Factorization(MaximalOrderInfinite(K)*Discriminant(
                            DefiningPolynomial(EquationOrderInfinite(F))));
        D;
        EOI := EquationOrderInfinite(F);
        MaximalOrderInfinite(F);
        Md := Discriminant($1);
        Mf := Factorization(Md);
        assert DiscriminantDivisor(A) eq
        FiniteDivisor(Divisor(CoefficientField(F)!Discriminant(MaximalOrderFinite(F)))) +
        InfiniteDivisor(Divisor(CoefficientField(F)!Discriminant(MaximalOrderInfinite(F))));

        for d in D do
            assert Valuation(DA, PCF!Place(d[1])) eq
                Valuation(Divisor(CF!(Md)), PCF!Place(d[1]));
            time pMaximalOrder(EOI, CoefficientRing(EOI)!Minimum(d[1]));
            disc := Discriminant($1);
            disc_fact := Factorization(disc);
            assert Valuation(DA, PCF!Place(d[1])) eq
                Valuation(Divisor(CF!(disc)), PCF!Place(d[1]));
            assert &and [Valuation(Divisor(CF!disc), PCF!Place(p[1])) eq
                Valuation(Divisor(Discriminant(EquationOrderInfinite(F))),
                        PCF!Place(p[1])) : p in Exclude(D, d)];
            assert &and [f[2] ge
                        Valuation(Divisor(CF!Discriminant(
                        MaximalOrderInfinite(F))),
                        PCF!Place(f[1]*MaximalOrderInfinite(K))) : f in disc_fact];
            assert &and [f[2] le
            Valuation(Divisor(CF!Discriminant(EquationOrderInfinite(F))),
                PCF!Place(f[1]*MaximalOrderInfinite(K))) : f in disc_fact];
        end for;
    end for;
end for;

k := GF(5);
kt<t> := FunctionField(k);
kty<y> := PolynomialRing(kt);
K := FunctionField(y^3+y+1);
p := Places(K, 3) cat Places(K, 2);
Div := 2*p[1] + 2*p[7];
R, mR := RayClassGroup(Div);
for i in [1 .. 5] do
    U := 5*R; repeat U := sub<R|Random(R), U>; until #quo<R|U> eq 5;
    A := AbelianExtension(Div, U);
    F := FunctionField(A);
    F := FunctionField(DefiningPolynomials(F)[1]);
    K := RationalExtensionRepresentation(CoefficientField(F));
    time MaximalOrderFinite(F);
    //Discriminant($1);
    //Factorization($1);
    time MaximalOrderInfinite(F);
    //Discriminant($1);
    //Factorization($1);
    disc_sum := Divisor(Discriminant(MaximalOrderFinite(F))) +
                    Divisor(Discriminant(MaximalOrderInfinite(F)));
    DA := DiscriminantDivisor(A);
    assert DA eq disc_sum;

    D := Factorization(MaximalOrderFinite(K)*Discriminant(DefiningPolynomial(
    EquationOrderFinite(F))));
    D;
    for d in D do
        time pMaximalOrder(EquationOrderFinite(F), d[1]);
        disc := Discriminant($1);
        disc_fact := Factorization(disc);
        assert Valuation(disc, d[1]) eq Valuation(DA, Place(d[1]));
        assert &and
        [Valuation(disc, p[1]) eq Valuation(Discriminant(
                        EquationOrderFinite(F)), p[1]) : p in Exclude(D, d)];
        assert &and [f[2] ge Valuation(DA, Place(f[1])) : f in disc_fact];
        assert &and [f[2] le Valuation(Discriminant(EquationOrderFinite(F)), f[1]) : f in disc_fact];
    end for;
    D := Factorization(MaximalOrderInfinite(K)*Discriminant(DefiningPolynomial(
    EquationOrderInfinite(F))));
    D;
    for d in D do
        time pMaximalOrder(EquationOrderInfinite(F), d[1]);
        disc := Discriminant($1);
        disc_fact := Factorization(disc);
        assert Valuation(disc, d[1]) eq Valuation(DA, Place(d[1]));
        assert &and
        [Valuation(disc, p[1]) eq Valuation(Discriminant(
                        EquationOrderInfinite(F)), p[1]) : p in Exclude(D, d)];
        assert &and [f[2] ge Valuation(DA, Place(f[1])) : f in disc_fact];
        assert &and [f[2] le Valuation(Discriminant(EquationOrderInfinite(F)), f[1]) : f in disc_fact];
    end for;

end for;

k := GF(5);
kt<t> := FunctionField(k);
kty<y> := PolynomialRing(kt);
K := FunctionField(y^4+3*y+t^2+t+1);
p := Places(K, 1) cat Places(K, 2);
Div := 2*p[1] + 2*p[7];
R, mR := RayClassGroup(Div);
for i in [1 .. 5] do
    U := 5*R; repeat U := sub<R|Random(R), U>; until #quo<R|U> eq 5;
    A := AbelianExtension(Div, U);
    F := FunctionField(A);
    F := FunctionField(DefiningPolynomials(F)[1]);
    K := RationalExtensionRepresentation(CoefficientField(F));
    time MaximalOrderFinite(F);
    //Discriminant($1);
    //Factorization($1);
    time MaximalOrderInfinite(F);
    //Discriminant($1);
    //Factorization($1);
    disc_sum := Divisor(Discriminant(MaximalOrderFinite(F))) +
                    Divisor(Discriminant(MaximalOrderInfinite(F)));
    DA := DiscriminantDivisor(A);
    assert DA eq disc_sum;

    D := Factorization(MaximalOrderFinite(K)*Discriminant(DefiningPolynomial(
    EquationOrderFinite(F))));
    D;
    for d in D do
        time pMaximalOrder(EquationOrderFinite(F), d[1]);
        disc := Discriminant($1);
        disc_fact := Factorization(disc);
        assert Valuation(disc, d[1]) eq Valuation(DA, Place(d[1]));
        assert &and
        [Valuation(disc, p[1]) eq Valuation(Discriminant(
                        EquationOrderFinite(F)), p[1]) : p in Exclude(D, d)];
        assert &and [f[2] ge Valuation(DA, Place(f[1])) : f in disc_fact];
        assert &and [f[2] le Valuation(Discriminant(EquationOrderFinite(F)), f[1]) : f in disc_fact];
    end for;

    D := Factorization(MaximalOrderInfinite(K)*Discriminant(DefiningPolynomial(
    EquationOrderInfinite(F))));
    D;
    EOI := Order(MaximalOrderInfinite(K), Basis(EquationOrderInfinite(F), F) :
                                                                        Order);
    for d in D do
        time pMaximalOrder(EOI, d[1]);
        disc := Discriminant($1);
        disc_fact := Factorization(disc);
        assert Valuation(disc, d[1]) eq Valuation(DA, Place(d[1]));
        assert &and
        [Valuation(disc, p[1]) eq Valuation(Discriminant(EOI), p[1])
                                                        : p in Exclude(D, d)];
        assert &and [f[2] ge Valuation(DA, Place(f[1])) : f in disc_fact];
        assert &and [f[2] le Valuation(Discriminant(EOI), f[1]) : f in disc_fact];
    end for;
end for;

