A Lattice Computation for Dick Gross

William A. Stein

August 2001

1 The Assignment

From: gross@math.harvard.edu
To: was@math.harvard.edu
Date: Wed, 8 Aug 2001 10:52:49 -0400 (EDT)

I have a computational request, which isn’t entirely trivial. Take the reciprocal polynomial of degree 18:

x^{18} − x^{17} + x^{16} − x^{15} − x^{12} + x^{11} − x^{10} + x^{9} − x^{8} + x^{7} − x^{6} − x^{3} + x^{2} − x + 1.

If I entered it correctly, the discriminant = (53995179961)^{2}. There is a degree 9 polynomial satisfied by (x + 1/x), of discriminant 53995179961, call this g(x).

First, verify that both the degree 9 field and the degree 18 field have class number 1. Next, find a totally positive generator for the inverse different ideal I of the degree 9 field. This has generator 1/g′(x), but that isn’t totally positive, so this involves finding a unit of the right signs. Anyhow, call the totally positive generator d, and let A be the ring of integers of the degree 9 field, generated by a root of g(x) over Z.

Finally, consider the Euclidean lattive L of rank 9, with elements in the ring of integers A and with bilinear form ⟨a, b⟩ = Tr(dab). This lattice is unimodular and positive definite, so by the theory of lattices is either isomorphic to Z^{9} or to E_{8} + Z. I suspect that the latter is true. If one did a search for vectors a with ⟨a, a⟩ = 1, one could distinguish these lattices, as the former has 18 such vectors, and the latter has only 2. Is this doable?

2 Answer

2.1 Class number of degree 18 field in PARI

? f = x^18 - x^17 + x^16 - x^15 - x^12 + x^11 - x^10 + x^9 - x^8 \
           + x^7 - x^6 - x^3 + x^2 - x + 1;
? factor(poldisc(f))
%1 =

[53995179961 2]
? b = bnfclassunit(f);
? b.clgp
%2 = [1, [], []]

2.2 Creating the degree 9 field in MAGMA

> f := x^18 - x^17 + x^16 - x^15 - x^12 + x^11 - x^10 + x^9 - x^8
          + x^7 - x^6 - x^3 + x^2 - x + 1;
> factor(Discriminant(f));
[ <53995179961, 2> ]
> K<a> := NumberField(f);
> L<b> := sub<K|a+1/a>;
> L;
Number Field with defining polynomial x^9 - 3*x^8 - 23*x^7 +
   35*x^6 + 81*x^5 - 116*x^4 - 67*x^3 + 104*x^2 + 8*x - 19
   over the Rational Field
> time h := ClassNumber(MaximalOrder(L));
Time: 1.350
> h;
1

2.3 Computing the unit group

Next we find the group of units.

> g := DefiningPolynomial(L);
> g;
x^9 - 3*x^8 - 23*x^7 + 35*x^6 + 81*x^5 - 116*x^4 - 67*x^3 + 104*x^2 + 8*x - 19
> Roots(PolynomialRing(RealField())!g);
[ <-0.468111906454000689322313234631336807368973901776, 1>, <0.558484342299467301848260817414060396183155100382, 1>, <1.2313073740889668988677367163865053658, 1>, <1.3706568287964283199650620889897443169, 1>, <1.1474930126118010257418142242557119149, 1>, <5.6479185634867740095959132409297992529, 1>, <-3.6958681103558892478674250772828809120, 1>, <-1.7843250602092410500834767489211165859, 1>, <-1.00755504426430656874557202714048694160132114234, 1> ]
> #$1;
9
> O := MaximalOrder(L);
> U,phi := UnitGroup(O);  // takes < 10 seconds
> U;   // as expected (r-1)
Abelian Group isomorphic to Z/2 + Z (8 copies)
Defined on 9 generators
Relations:
2*U.1 = 0
> [phi(U.i) : i in [1..9]];   // on a basis for O.
[
[-1, 0, 0, 0, 0, 0, 0, 0, 0],
[2444, 1559, 4517, 2264, 3770, 4548, 2086, 1083, -6909],
[24992, 15909, 46139, 23157, 38546, 46485, 21320, 11069, -70615],
[18236, 11605, 33686, 16906, 28130, 33927, 15561, 8079, -51540],

[2443, 1559, 4517, 2264, 3770, 4548, 2086, 1083, -6909],
[47385, 30164, 87513, 43915, 73086, 88147, 40429, 20990, -133906],
[2307, 1466, 4259, 2146, 3558, 4288, 1968, 1022, -6519],
[15894, 10113, 29338, 14725, 24515, 29563, 13558, 7039, -44906],
[2500, 1586, 4596, 2316, 3851, 4639, 2128, 1105, -7049]
]

2.4 Finding a totally positive generator for the inverse different.

> gprime := Derivative(g); gprime;
9*x^8 - 24*x^7 - 161*x^6 + 210*x^5 + 405*x^4 - 464*x^3 - 201*x^2 + 208*x + 8
> alpha := 1/Evaluate(gprime,b);
> // This element is not totally positive
> RR<y> := PolynomialRing(RealField());
> #[r : r in Roots(RR!MinimalPolynomial(alpha)) | r[1] gt 0];
5  // 5 is less than 9 = # embeddings

Since α is not totally positive, we have to find a unit u such that uα is totally positive.

> R := [r[1] : r in Roots(RR!g)];  // these correspond to the real embeddings.
> function EmbeddingSigns(z)
    h := RR!Eltseq(L!z);
    return [Sign(Evaluate(h, R[i])) : i in [1..#R]];
  end function;
> EmbeddingSigns(alpha);
[ -1, 1, 1, -1, -1, 1, 1, -1, 1 ]
> EmbeddingSigns(alpha^2);           // a good check.
[ 1, 1, 1, 1, 1, 1, 1, 1, 1 ]

We can now see the embedding signs for the units.

> for i in [1..9] do EmbeddingSigns(phi(U.i)); end for;
[ -1, -1, -1, -1, -1, -1, -1, -1, -1 ]
[ -1, 1, -1, -1, 1, 1, 1, 1, -1 ]
[ 1, 1, -1, 1, 1, -1, -1, -1, -1 ]
[ 1, -1, -1, -1, -1, 1, 1, -1, 1 ]
[ -1, -1, -1, -1, -1, 1, 1, 1, -1 ]
[ 1, -1, 1, -1, 1, -1, 1, 1, -1 ]
[ 1, -1, 1, -1, 1, -1, 1, -1, -1 ]
[ 1, -1, -1, 1, -1, 1, -1, 1, 1 ]
[ 1, 1, -1, -1, -1, 1, 1, -1, -1 ]

Now the problem is reduced to linear algebra over F_{2}.

> A := MatrixAlgebra(GF(2),9)!0;
> for r in [1..9] do for c in [1..9] do

     if EmbeddingSigns(phi(U.r))[c] eq -1 then A[r,c] := 1; end if;
  end for; end for;
> A;
[1 1 1 1 1 1 1 1 1]
[1 0 1 1 0 0 0 0 1]
[0 0 1 0 0 1 1 1 1]
[0 1 1 1 1 0 0 1 0]
[1 1 1 1 1 0 0 0 1]
[0 1 0 1 0 1 0 0 1]
[0 1 0 1 0 1 0 1 1]
[0 1 1 0 1 0 1 0 0]
[0 0 1 1 1 0 0 1 1]
> Rank(A);
8
> V := RowSpace(A);
> W := VectorSpace(GF(2),9);
> v1 := W![1,0,0,1,1,0,0,1,0];
> v2 := W![0,1,1,0,0,1,1,0,1];
> v1 in V;
false
> v2 in V;
false

Ut oh, something’s wrong. There is no totally positive generator of the inverse different!

Since V has dimension 8, NOT dimension 9, there is a nontrivial totally positive unit. Let’s exhibit it.

> Kernel(A);
Vector space of degree 9, dimension 1 over GF(2)
Echelonized basis:
(1 0 0 0 1 1 0 1 1)
> EmbeddingSigns(phi(U.1*U.5*U.6*U.8*U.9));
[ 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
> aa := U.1*U.5*U.6*U.8*U.9;
> MinimalPolynomial(phi(aa));
$.1^9 - 37*$.1^8 + 334*$.1^7 - 1251*$.1^6 + 2322*$.1^5 - 2250*$.1^4 + 1125*$.1^3 - 272*$.1^2 + 28*$.1 - 1
> ZZ<x> := Parent($1);
> MinimalPolynomial(phi(aa));
x^9 - 37*x^8 + 334*x^7 - 1251*x^6 + 2322*x^5 - 2250*x^4 + 1125*x^3 - 272*x^2 + 28*x - 1
> [r[1] gt 0 : r in Roots(RR!MinimalPolynomial(phi(aa)))];
[ true, true, true, true, true, true, true, true, true ]

Thus

x^{9} − 37x^{8} + 334x^{7} − 1251x^{6} + 2322x^{5} − 2250x^{4} + 1125x^{3} − 272x^{2} + 28x − 1

is the characteristic polynomial of a nontrivially nonsquare totally positive unit.

I’m confused, so I send the following email:

To: gross@math.harvard.edu
Date: Wed, 8 Aug 2001 19:30:00 -0400

Dear Dick,
I should clarify that I had checked that the totally positive unit
that I sent you in the proceeding email is not a square.
I flipped through the paper you gave me and came across your
Proposition 12.1.  I think that condition (a) of that proposition
isn't satisfied for the field k defined by the polynomial
 f = x^18 - x^17 + x^16 - x^15 - x^12 + x^11 - x^10 + x^9 - x^8
          + x^7 - x^6 - x^3 + x^2 - x + 1
I mapped the units to (F_2)^9 using the map that sends a unit to
sequence of 1s and 0s, where a 1 means that the corresponding
embedding of the unit is negative.  Unless I made a mistake,
the image has the following basis:
[
(1 0 0 0 0 0 0 0 1),
(0 1 0 0 0 0 0 0 1),
(0 0 1 0 0 0 0 0 1),
(0 0 0 1 0 0 0 0 1),
(0 0 0 0 1 0 0 0 1),
(0 0 0 0 0 1 0 0 1),
(0 0 0 0 0 0 1 0 1),
(0 0 0 0 0 0 0 1 0)
]
So we don't have the vector (0 0 0 0 0 0 0 1 1).
I think by "strict class number" you mean the "narrow class number",
because of what the mathscinet review of "On the $4$-rank of the
strict class group of a quadratic number field" says.  Using PARI, I
find that the narrow class number of Q[x]/(f) is 1, not 2 like it
would have to be to use in Proposition 12.1.  Here's how the PARI
computation of the narrow class number goes:
? f = x^18 - x^17 + x^16 - x^15 - x^12 + x^11 - x^10 + x^9 - x^8 \
           + x^7 - x^6 - x^3 + x^2 - x + 1;
? k=bnfinit(f);
? bnfnarrow(k)
%1 = [1, [], []]

 -- William

He responds

From: gross@math.harvard.edu
To: was@math.harvard.edu
Date: Thu, 9 Aug 2001 09:46:43 -0400 (EDT)

In my paper, the field k is defined by the 9th degree polynomial, which
I think is
y^9 - y^8 - 8*y^7 + 7*y^6 + 20*y^5 - 14*y^4 - 17*y^3 + 8*y^2 + 4*y - 1
and the field K is defined by the 18th degree polynomial I sent you.
The strict class number of k is 2, and the strict class number of K
is 1.
You are right that there is a relation on the signs of units in k, so
there is a totally positive unit which is not a square. The relation
is that the product of signs over the 8 real places which become
complex in K is equal to 1; these correspond to the 8 roots of the
polynomial g(y) above which lie in the interval -2 < y < 2. But
g'(y) is positive at 4 of these roots, and negative at 4 of them, by
what I used to teach in math 1a. So there should be a unit u which
makes u/g'(y) totally positive. One can modify u by the totally
positive unit you sent me, and that gives the two lattices L1 and L2
of my paper.
Dick
---
Let g(y) = y^9 - y^8 - 8*y^7 + 7*y^6 + 20*y^5 - 14*y^4 - 17*y^3 + 8*y^2 + 4*y - 1
be the polynomial for the degree 9 field k, and index the real places of k by
the roots of g(y), in increasing order, from -1.995.. to 2.029.. Just fooling
around, I found the following units, with their signs:
-1  - - - - - - - - -
y   - - - - + + + + +
y-2 - - - - - - - - +
y-1 - - - - - - + + +
y+2 + + + + + + + + +  (and not a square).
With a little more work, I found the signs

    + + + - - - - + +  for y^2 - y - 1
    + - - + + + - - +  for y^4 - 4*y^2 + 2
Anyhow, this fits my prediction that the only relation on signs is that the
first 8 entries (the real places ramified in K/k) have an even number of
- signs. Since g'(y) has the signs + - + - + - + - +, we should be able to
find a unit that matches it.
Dick
---

Since g(y) + 1 = (y-2)*(y-1)^2*(y)*(y+1)*(y+2)*(y^3-3*y-1), the elements
y-2,y-1,y,y+1,y+2  are all units. Amazing.
Dick

Indeed,

? g=x^9 - 3*x^8 - 23*x^7 + 35*x^6 + 81*x^5 - \
            116*x^4 - 67*x^3 + 104*x^2 + 8*x - 19;
? k=bnfinit(g);
? bnfnarrow(k)
%5 = [2, ...]

Now I see what the problem is. The degree 9 polynomial g that I’ve been using above is not the minimal polynomial of x+1/x; it’s just a polynomial that MAGMA chose which corresponds to the same field, but is somehow reduced in a better way than the minimal polynomial of x + 1/x. So, we restart the computation with the correct g. time h := ClassNumber(MaximalOrder(L));

>  f := x^18 - x^17 + x^16 - x^15 - x^12 + x^11 - x^10 + x^9 - x^8
          + x^7 - x^6 - x^3 + x^2 - x + 1;
> K<a> := NumberField(f);
> g := MinimalPolynomial(a+1/a);
> g;
x^9 - x^8 - 8*x^7 + 7*x^6 + 20*x^5 - 14*x^4 - 17*x^3 + 8*x^2 + 4*x - 1
> L<b> := NumberField(g);
> L;
Number Field with defining polynomial x^9 - x^8 - 8*x^7 + 7*x^6 + 20*x^5 - 14*x^4 - 17*x^3 + 8*x^2 + 4*x - 1 over the Rational Field
> time h := ClassNumber(MaximalOrder(L));
Time: 0.900
> h;

> O := MaximalOrder(L);
> time U,phi := UnitGroup(O);  // takes < 10 seconds
Time: 2.800
> U;   // as expected (r-1)
Abelian Group isomorphic to Z/2 + Z (8 copies)
Defined on 9 generators
Relations:
2*U.1 = 0
> gprime := Derivative(g); gprime;
9*x^8 - 8*x^7 - 56*x^6 + 42*x^5 + 100*x^4 - 56*x^3 - 51*x^2 + 16*x + 4
> alpha := 1/Evaluate(gprime,b);
> RR<y> := PolynomialRing(RealField());
> #[r : r in Roots(RR!MinimalPolynomial(alpha)) | r[1] gt 0];
5
> R := [r[1] : r in Roots(RR!g)];  // these correspond to the real embeddings.
> function EmbeddingSigns(z)
    h := RR!Eltseq(L!z);
    return [Sign(Evaluate(h, R[i])) : i in [1..#R]];
  end function;
function> function> function> >
>
> EmbeddingSigns(alpha);
[ -1, 1, -1, 1, -1, 1, 1, -1, 1 ]
> for i in [1..9] do EmbeddingSigns(phi(U.i)); end for;
[ -1, -1, -1, -1, -1, -1, -1, -1, -1 ]
[ 1, 1, -1, 1, 1, 1, -1, -1, -1 ]
[ 1, 1, -1, -1, -1, -1, 1, 1, -1 ]
[ 1, 1, 1, -1, -1, 1, 1, -1, -1 ]
[ 1, 1, 1, -1, -1, -1, 1, 1, 1 ]
[ 1, -1, -1, -1, 1, -1, 1, -1, 1 ]
[ 1, -1, -1, -1, 1, 1, 1, -1, 1 ]
[ 1, 1, 1, 1, -1, -1, -1, -1, -1 ]
[ 1, -1, -1, 1, 1, -1, -1, 1, -1 ]
>  A := MatrixAlgebra(GF(2),9)!0;
> for r in [1..9] do for c in [1..9] do
> for|for>      if EmbeddingSigns(phi(U.r))[c] eq -1 then A[r,c] := 1; end if;
  end for; end for;
for|for> >
> A;
[1 1 1 1 1 1 1 1 1]
[0 0 1 0 0 0 1 1 1]
[0 0 1 1 1 1 0 0 1]
[0 0 0 1 1 0 0 1 1]
[0 0 0 1 1 1 0 0 0]
[0 1 1 1 0 1 0 1 0]

[0 1 1 1 0 0 0 1 0]
[0 0 0 0 1 1 1 1 1]
[0 1 1 0 0 1 1 0 1]
> V := RowSpace(A);
> V;
Vector space of degree 9, dimension 8 over GF(2)
Echelonized basis:
(1 0 0 0 0 0 0 0 1)
(0 1 0 0 0 0 0 0 1)
(0 0 1 0 0 0 0 0 1)
(0 0 0 1 0 0 0 0 1)
(0 0 0 0 1 0 0 0 1)
(0 0 0 0 0 1 0 0 0)
(0 0 0 0 0 0 1 0 1)
(0 0 0 0 0 0 0 1 1)
> W := VectorSpace(GF(2),9);
> // [ -1, 1, -1, 1, -1, 1, 1, -1, 1 ]
> v := W![1,0,1,0,1,0,0,1,0];
> > v in V;
true
> v;
(1 0 1 0 1 0 0 1 0)
> Eltseq(V!v);
[ 1, 0, 1, 0, 1, 0, 0, 1, 0 ]
> ?Solve;
MAGMA_HTML_DIR is not set
> Solution(A,v);
(1 1 0 0 0 1 0 0 0)
> alpha;
1/53995179961*(8462152596*b^8 - 6852528273*b^7 - 64893174399*b^6 + 44327911581*b^5 + 148290056856*b^4 - 74228933970*b^3 - 99225969383*b^2 + 23785291597*b + 10873550202)
> d := alpha*phi(U.1+U.2+U.6);
> EmbeddingSigns(d);
[ 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
> d;
1/53995179961*(-3426147347*b^8 + 817946757*b^7 + 29470572047*b^6 - 3984702109*b^5 - 80455461231*b^4 + 2178527185*b^3 + 70870946633*b^2 + 3409710051*b - 2902988849)
> Norm(d);
1/53995179961
> Norm(alpha);
1/53995179961
> // d is the totally positive generator for the inverse different!
> Kernel(A);
Vector space of degree 9, dimension 1 over GF(2)
Echelonized basis:
(0 0 0 0 1 1 0 1 1)
> // ... and, that's a nonsquare unit that is totally positive...
>

> O;
Maximal Equation Order with defining polynomial x^9 - x^8 - 8*x^7 + 7*x^6 + 20*x^5 - 14*x^4 - 17*x^3 + 8*x^2 + 4*x - 1 over Z
> Trace(d*O.1*O.2);
0
> Trace(d*O.1*O.3);
1
> function bin(a,b) return Trace(d*a*b); end function;
> bin(O.1,O.3);
1
> Type($1);
FldRatElt
> B := MatrixAlgebra(Rationals(),9)!0;
> for r in [1..9] do for c in [1..9] do B[r,c] := bin(O.r,O.c); end for; end for;
> B;
[   1    0    1    0    2    0    6    0   21]
[   0    1    0    2    0    6    0   21    0]
[   1    0    2    0    6    0   21    0   78]
[   0    2    0    6    0   21    0   78    0]
[   2    0    6    0   21    0   78    0  298]
[   0    6    0   21    0   78    0  298    0]
[   6    0   21    0   78    0  298    0 1157]
[   0   21    0   78    0  298    0 1157    1]
[  21    0   78    0  298    0 1157    1 4539]
> Determinant(B);
1
> // B is the Gram matrix that defines our lattice.
> L := LatticeWithGram(B);
> L;
Standard Lattice of rank 9 and degree 9
Inner Product Matrix:
[   1    0    1    0    2    0    6    0   21]
[   0    1    0    2    0    6    0   21    0]
[   1    0    2    0    6    0   21    0   78]
[   0    2    0    6    0   21    0   78    0]
[   2    0    6    0   21    0   78    0  298]
[   0    6    0   21    0   78    0  298    0]
[   6    0   21    0   78    0  298    0 1157]
[   0   21    0   78    0  298    0 1157    1]
[  21    0   78    0  298    0 1157    1 4539]
> time short := ShortVectors(L,1);
Time: 0.000
> short;
[
<( 1  0 -1  0  0  0  0  0  0), 1>,
<(1 0 0 0 0 0 0 0 0), 1>,
<( 2  0 -4  0  1  0  0  0  0), 1>,

<( 3  0 -9  0  6  0 -1  0  0), 1>,
<(  4   0 -17   0  20   0  -8   0   1), 1>,
<(  4   3 -17  -9  20   6  -8  -1   1), 1>,
<(  4   5 -17 -13  20   7  -8  -1   1), 1>,
<(  4   7 -17 -14  20   7  -8  -1   1), 1>,
<(0 1 0 0 0 0 0 0 0), 1>
]

Now I’ll send an email:

Dear Dick,
The problem was that MAGMA chose the wrong polynomial as defining
polynomial for the subfield.  With the correct polynomial, the
computation was very easy.  A totally-positive generator for the
inverse different has minimal polynomial
x^9 - x^8 + 21031903322/53995179961*x^7 - 4130791902/53995179961*x^6 +
    447388898/53995179961*x^5 - 27890118/53995179961*x^4 +
    1015898/53995179961*x^3 - 21138/53995179961*x^2 + 230/53995179961*x
    - 1/53995179961
The rank 9 lattice is defined by the Gram matrix:
[   1    0    1    0    2    0    6    0   21]
[   0    1    0    2    0    6    0   21    0]
[   1    0    2    0    6    0   21    0   78]
[   0    2    0    6    0   21    0   78    0]
[   2    0    6    0   21    0   78    0  298]
[   0    6    0   21    0   78    0  298    0]
[   6    0   21    0   78    0  298    0 1157]
[   0   21    0   78    0  298    0 1157    1]
[  21    0   78    0  298    0 1157    1 4539]
This lattice has 18 vectors of length 1, so it's Z^9.
The vectors, up to sign and along with their norms, are:
[
<( 1  0 -1  0  0  0  0  0  0), 1>,
<(1 0 0 0 0 0 0 0 0), 1>,
<( 2  0 -4  0  1  0  0  0  0), 1>,
<( 3  0 -9  0  6  0 -1  0  0), 1>,
<(  4   0 -17   0  20   0  -8   0   1), 1>,
<(  4   3 -17  -9  20   6  -8  -1   1), 1>,
<(  4   5 -17 -13  20   7  -8  -1   1), 1>,
<(  4   7 -17 -14  20   7  -8  -1   1), 1>,
<(0 1 0 0 0 0 0 0 0), 1>
]

Then Dick asked me to compute the same info with d multiplied by b + 2:

> restore "august9.session";
Restoring Magma state from "august9.session"
> d;
1/53995179961*(-3426147347*b^8 + 817946757*b^7 + 29470572047*b^6 - 3984702109*b^5 - 80455461231*b^4 + 2178527185*b^3 + 70870946633*b^2 + 3409710051*b - 2902988849)
> EmbeddingSigns(b+2);
[ 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
> d2 := (b+2)*d;
> function bin2(a,b) return Trace(d2*a*b); end function;
> B2 := MatrixAlgebra(Rationals(),9)!0;
> for r in [1..9] do for c in [1..9] do B2[r,c] := bin2(O.r,O.c); end for; end for;
> B2;
[   2    1    2    2    4    6   12   21   42]
[   1    2    2    4    6   12   21   42   78]
[   2    2    4    6   12   21   42   78  156]
[   2    4    6   12   21   42   78  156  298]
[   4    6   12   21   42   78  156  298  596]
[   6   12   21   42   78  156  298  596 1157]
[  12   21   42   78  156  298  596 1157 2315]
[  21   42   78  156  298  596 1157 2315 4541]
[  42   78  156  298  596 1157 2315 4541 9095]
>
> L2 :=  LatticeWithGram(B2);
> L2;
Standard Lattice of rank 9 and degree 9
Inner Product Matrix:
[   2    1    2    2    4    6   12   21   42]
[   1    2    2    4    6   12   21   42   78]
[   2    2    4    6   12   21   42   78  156]
[   2    4    6   12   21   42   78  156  298]
[   4    6   12   21   42   78  156  298  596]
[   6   12   21   42   78  156  298  596 1157]
[  12   21   42   78  156  298  596 1157 2315]
[  21   42   78  156  298  596 1157 2315 4541]
[  42   78  156  298  596 1157 2315 4541 9095]
>  time short2 := ShortVectors(L2,1);
Time: 0.000
> #short2;
1
> short2;
[
<( 2 -1 -8  4  8 -4 -2  1  0), 1>
]
> Determinant(L2);
1

> save "august9.session";
Saving Magma state to "august9.session"

I then wrote to him:

From: William A. Stein <was@math.harvard.edu>
To: gross@math.harvard.edu
Date: Thu, 9 Aug 2001 16:09:04 -0400

On Thursday 09 August 2001 04:02 pm, you wrote:
> Great. Could you now multiply the totally positive generator you used
> by the totally positive unit (x+2) and calculate the new Gram matrix and
> lattice. Is it also Z^9?

No, it's not!
The Gram matrix for this other lattice is
[   2    1    2    2    4    6   12   21   42]
[   1    2    2    4    6   12   21   42   78]
[   2    2    4    6   12   21   42   78  156]
[   2    4    6   12   21   42   78  156  298]
[   4    6   12   21   42   78  156  298  596]
[   6   12   21   42   78  156  298  596 1157]
[  12   21   42   78  156  298  596 1157 2315]
[  21   42   78  156  298  596 1157 2315 4541]
[  42   78  156  298  596 1157 2315 4541 9095]
There are only two vectors of length 1:
  ( 2 -1 -8  4  8 -4 -2  1  0) and its negative.
Best regards,
   William