>

libname := `/home/nfs/jeremy/src/coxeter/lib`,

> f:=x^3-2*x^2+x-6;

f := x^3-2*x^2+x-6

> discrim(f,x);

-948

> ifactor(%);

-``(2)^2*``(3)*``(79)

The root of the polynomial f(x) generates the maximal order, except possibly locally at 2. Sarah proved (using Dedekind's criterion) that in fact it is also maximal at 2. We can check this directly as follows. Let R=Z[theta]

where theta is a root of f(x). The ideals P=(2,theta) and Q=(2, theta-1) are the prime ideals of R lying above

2. We need to show that R is a Dedekind domain, and for that it suffices in this case to show that

R_P and R_Q are discrete valuation rings. For the first notice (from f(theta)=0) that theta=6+2theta^2-theta^3

so theta(theta-1)^2=theta^3-2theta^2+theta=-2theta+6=2(3-theta). Now theta-1 and 3-theta belong to Q,

therefore not to P; consequently they are units in R_P. It follows that theta=2(unit) in R_P, so PR_P is generated

by 2. On the other hand, (theta-1)^2(theta)=theta^3-2theta^2+theta=6, and theta is a unit in R_Q. 3 is also a unit in R_Q, so

2=(theta/3)(theta-1)^2. This means that QR_Q is generated by theta-1, meaning it, too is locally principal and R_Q is a DVR. We conclude

that R is Dedekind.

In particular, the discriminant of f(x) really is -948 and the ramified primes are 2, 3, and 79.

> plot(f(x),x=-2..5);

As the graph shows, f has one real root (OK, this isn't really a proof but it's good enough for Math 180). So r1=1 and r2=1.

[Maple Plot]

The Minkowski constant is:

> 3!/27*(4/Pi)*sqrt(abs(discrim(f,x)));

16/9*sqrt(237)/Pi

> evalf(%);

8.711677174

>

We factor the primes up to the Minkowski bound.

> Factor(f) mod 2;

x*(x+1)^2

> Factor(f) mod 3;

x*(x+2)^2

> Factor(f) mod 7;

x^3+5*x^2+x+1

> Factor(f) mod 5;

(x^2+2*x+4)*(x+1)

The primes 2, 3,5,7 factor as:

2=P2 Q2^2=(2,theta)(2,theta+1)^2

3=P3 Q3^2=(3,theta)(3,theta+2)^2

7 remains prime

5=P5 Q5 =(5,theta+1) (5,theta^2+2theta+4); P5 has f=1, Q5 has 5=2.

Now we need to find relations in the class group; this means we need to factor principal ideals. One way is to consider

f(n)=Norm(n-theta).

> for i from -8 to 8 do print(i,ifactor(subs(x=i,f))) od ;

-8, -``(2)*``(3)*``(109)

-7, -``(2)*``(227)

-6, -``(2)^2*``(3)*``(5)^2

-5, -``(2)*``(3)*``(31)

-4, -``(2)*``(53)

-3, -``(2)*``(3)^3

-2, -``(2)^3*``(3)

-1, -``(2)*``(5)

0, -``(2)*``(3)

1, -``(2)*``(3)

2, -``(2)^2

3, ``(2)*``(3)

4, ``(2)*``(3)*``(5)

5, ``(2)*``(37)

6, ``(2)^4*``(3)^2

7, ``(2)*``(3)*``(41)

8, ``(2)*``(193)

So we see that N(-theta)=6, and N(1-theta)=-6. Now (theta)R must factor as AB with A of norm 2 and B of norm 3.

Looking at the factorization of 2 and 3 we see that A=P2 and B=P3. Now 1-theta also factors as a product of ideals of norm 2 and norm 3,

and since 1-theta belongs to Q2 and to Q3, so we get

Q2 Q3=(1-theta)R. From N(-1-theta)=10 we see that (-1-theta) = UV with U of norm 2 and V of norm 5. There's only one ideal of norm 5,

so V=P5. U must be Q2, because -1-theta doesn't belong to P2. So we have P5 Q2 = (-1-theta)R. The conclusion of this so far

is that

P5 is equivalent to Q2^(-1) (P5 Q2=(-1-theta)R

Q5 is equivalent to Q2 (Q5 P5 = 5R)

Q3 is equivalent to Q2^(-1) (Q2 Q3 = (1-theta) R)

P3 is equivalent to P2^(-1)=Q2^2. (P2 P3=theta R)

So the class group is generated by the class of Q2. But N(2-theta)=-4. And 2-theta belongs to P2, but not Q2. Therefore

(2-theta)R=P2^2.

Therefore Q2^4=P2^2 is principal. From N(3-theta)=6 we have

(3-theta)=Q2 P3,

so P3=Q2^2 is equivalent to Q2^-1 or Q2^3 =1.

Putting these together we see that Q2 itself is actually principal since Q2^4=1 and Q2^3=1. So this ring has class number one.

This means we should be able to find an element of norm 2. Let's look for it. First we need the norm form. Any element

can be written a+btheta+ctheta^2, and we put this in matrix form:

> with(linalg); A:=transpose(matrix(3,3,[[0,1,0],[0,0,1],[6,-1,2]]));

[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...

A := matrix([[0, 0, 6], [1, 0, -1], [0, 1, 2]])

>

This is the "multiplication by theta matrix" on the basis 1, theta, theta^2. An element a+btheta+ctheta^2 acts through the matrix

> matrix(3,3,[[a,0,0],[0,a,0],[0,0,a]])+scalarmul(A,b)+scalarmul(multiply(A,A),c);

matrix([[a, 0, 0], [0, a, 0], [0, 0, a]])+matrix([[...

>

> evalm(%);

matrix([[a, 6*c, 6*b+12*c], [b, a-c, -b+4*c], [c, b...

> M:=%;

M := matrix([[a, 6*c, 6*b+12*c], [b, a-c, -b+4*c], ...

> det(M);

a^3+2*a^2*b+2*a^2*c-16*a*c*b-23*a*c^2+a*b^2+12*c*b^...

> normform:=%;

normform := a^3+2*a^2*b+2*a^2*c-16*a*c*b-23*a*c^2+a...

> for i from -10 to 10 do for j from -10 to 10 do for k from -10 to 10 do z:=subs(a=i,b=j,c=k,normform) ;

> if abs(z)=2 then print(i,j,k,z) fi od od od ;

-8, -7, 4, -2

-5, -1, -2, -2

5, 1, 2, 2

8, 7, -4, 2

>

So you see that 5+theta+2 theta^2 has norm 2 and modulo 2 it is congruent to theta+1 so it generates Q2. The element

8+7 theta -4 theta^2 is congruent to theta mod 2, so it generates P2.

> subs(a=8,b=7,c=-4,op(M));

matrix([[8, -24, -6], [7, 12, -23], [-4, -1, 10]])

> P2:=%;

P2 := matrix([[8, -24, -6], [7, 12, -23], [-4, -1, ...

> Q2:=subs(a=-5,b=-1,c=-2,op(M));

Q2 := matrix([[-5, -12, -30], [-1, -3, -7], [-2, -5...

> multiply(P2,Q2,Q2);

matrix([[2, 0, 0], [0, 2, 0], [0, 0, 2]])

So you see that in fact the elements above multiply together correctly to give the number 2 right on the money.

But now we want to find a unit. For this we collect the relations we have among ideals. The ideals are P2, Q2, P3, Q3, P5, and Q5;

for each element that factors into a product of these ideals we get a row of the following matrix. For example the first row says Q2 P5 =1 in the class group;

the second row says P5 Q5 =1 in the class group, and so on.

>

> Cl:=matrix(7,6,[[0,1,0,0,1,0],[0,0,0,0,1,1],[0,1,0,1,0,0],[1,2,0,0,0,0],[1,0,1,0,0,0],[0,1,1,0,0,0],[2,0,0,0,0,0]]);

Cl := matrix([[0, 1, 0, 0, 1, 0], [0, 0, 0, 0, 1, 1...

>

The ihermite command computes the Hermite normal form H of the matrix, and saves in U the "relation matrix"; that is U Cl = H.

> ihermite(Cl,U);

matrix([[1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0,...

> op(U);

matrix([[0, 0, 0, -1, -2, 2, 2], [0, 0, 0, -1, -3, ...

Each row of this matrix corresponding to a "zero row" of the hermite normal form represents a relation in the class group.

In this case the last row says that (P2 Q2^2)^(-2) (P2 P3)^(-4) (Q2 P3)^4 (P2^2)^3 =1. Sorthing through this we see that

(P2 Q2^2)^2(P2 P3)^4= (Q2 P3)^4 (P2^2)^3 and therefore (2^2 theta^4) = (3-theta)^4 (2-theta)^2 (a relation among principal ideals).

It follows that 4 theta^4/(3-theta)^4/(2-theta)^3 must be a unit. So we have to compute this.

We can do it using matrices, or alternatively using the RootOf function.

> theta:=RootOf(f);

theta := RootOf(_Z^3-2*_Z^2+_Z-6)

> (3-theta)^4*(2-theta)^3/4/theta^4;

1/4*(3-RootOf(_Z^3-2*_Z^2+_Z-6))^4*(2-RootOf(_Z^3-2...

> simplify(%);

-91+79*RootOf(_Z^3-2*_Z^2+_Z-6)-17*RootOf(_Z^3-2*_Z...

So we've found a unit: -91 + 79 theta - 17 theta^2. Let's verify it's a unit:

> 1/%;

1/(-91+79*RootOf(_Z^3-2*_Z^2+_Z-6)-17*RootOf(_Z^3-2...

> simplify(%);

-1235*RootOf(_Z^3-2*_Z^2+_Z-6)-5431-2297*RootOf(_Z^...

Since the inverse also has integer coefficients, it is indeed a unit.

Note how large the coefficients are....

Proving that this is a fundamental unit is a lot of work; I'm confident that it is but haven't checked.