1.9 Appendix A

1.9 .A1.1  Hilbert’s construction of Double 6

Here I construct a specific Double 6.  We try for a rational one.  If this is the notebook version you may wish, instead of wading through this appendix, to simply, from the pull down Evaluation menu above, select “Evaluate Notebook” to see that this method works.

I will be basically using the method of Hilbert and Cohn-Vassen, but for display reasons I will build this around a known hyperboloid.

To be able to get rational points we will use our example hyperboloid in Section 1.3 since we know both an exact rational parameterization and an exact equation.

hyp1={((t-s^2t)/(1-s^2)),((1+(s^2)-2 s t)/(1-(s^2))),((2 s-t-(s^2) t)/(1-(s^2)))};
hypEq=1-x^2-y^2+z^2;

Note

Simplify[hypEq/.Thread[{x,y,z}->hyp1]]

so this parameterization does lie in the implicit surface, in fact gives all but two lines and the infinite part when  -∞<s,t<∞.

I can even  write down the rulings.  Given a value s0 !=1 for s

r1[s0_]:=Expand[hyp1/.{s->s0}]
r2[s0_]:=Expand[{r1[s0][[1]],r1[s0][[2]],-r1[s0][[3]]}]

for example

r1[1/2]
r2[1/2]

Show[ContourPlot3D[hypEq==0,{x,-3,3},{y,-3,3},{z,-3,3},Mesh->None],ParametricPlot3D[{r1[0],r2[0],r1[.5],r2[.5]},{t,-3,3}]]

We start the Hilbert Cohn-Vassen construction by letting

L1=r2[-1/2]
L8=r1[-2/3]
L9=r1[-1/4]
L10=r1[1/4]

Show[ContourPlot3D[hypEq==0,{x,-3,3},{y,-3,3},{z,-3,3},Mesh->None],ParametricPlot3D[{L1,L8,L9,L10},{t,-3,3},PlotStyle->{Blue,Green,Green,Green}], Boxed->None,Boxed->False,ImageSize->Small]

We number intersection points as

p18=Rationalize[Chop[pLineIntersectionMD[L1,L8,t,{x,y,z},dTol]]]

p19=Rationalize[pLineIntersectionMD[L1,L9,t,{x,y,z},dTol]]

p110=Rationalize[pLineIntersectionMD[L1,L10,t,{x,y,z},dTol]]

By inspection L8,L9, and L10 are skew, we could check this, for examp1e

pLineIntersectionMD[L8,L9,t,{x,y,z},.001]

and I assure the reader that the other tests also confirm skewness .

Now we add a line L11 not in the hyperboloid but still intersecting line 1.

q11a=Chop[L1/.{t->-1.25}]

Or, as a rational number

q11a={-5/4,0,-3/4}

q11b=hyp1/.Thread[{s,t}->{2,2}]

L11Eq=ratLine3D[q11a,q11b]

L11Eq/.Thread[{x,y,z}->q11a]

L11=Expand[First[{x,y,z}/.Solve[L11Eq==0,{x,y,z}]]/.{x->t}]

L11/.{t->-1.25}

L11/.{t->2}

We next add L6 which is in the second ruling of hyp1

P11=Expand[tangentPlaneNS[hypEq,q11b,{x,y,z}]]

{x,y,z}/.Solve[P11==0&&hypEq==0,{x,y,z}]

We are looking for a line in the hyperboloid second ruling.  Try

L6={t,1,t}

q12a=Rationalize[L1/.{t->.5}]

q12b=hyp1/.Thread[{s->11,t->2}]

L12Eq=lineMD[q12a,q12b,{x,y,z}]

L12=Expand[First[{x,y,z}/.Solve[L12Eq==0,{x,y,z}]]/.{x->t}]

P12=Expand[tangentPlaneNS[hypEq,q12b,{x,y,z}]]

L5=Expand[{x,y,z}/.Solve[P12==0&&hypEq==0,{x,y,z}]][[1]]/.{x->t}

For later use we need an implicit equation system for L5.  We can use the technique in F to get a rational one.

pl5=L5/.{t->0}
ql5=L5/.{t->4}

L5Eq=ratLine3D[pl5,ql5]

Show[ContourPlot3D[hypEq==0,{x,-3,3},{y,-3,3},{z,-3,3},Mesh->None],ParametricPlot3D[{L1,L8,L9,L10,L11,L12,L6,L5},{t,-3,3},PlotStyle->{Blue,Green,Green,Green,Cyan,Cyan,Magenta,Magenta}], Axes->None,Boxed->False]

We are now finished with the six  chosen lines,  L1, L8, L9, L10, L11 and  L12.  All the other lines, including L5 and L6 are determined by these.

Each of the three (green) lines are in one ruling of hyp1 while the three lines L1, L5 and L6 (blue and magenta in the plot above are in the other ruling so each of L8, L9, L10 meet each of L1, L5 and L6. The notebook reader may need to confirm the plot that L11 and L12 do not intersect L8, L9, L10 or each other but do intersect L1, L5 and L6.  The construction showed that L11 and L12 do meet L1,   L6 meets L11 and L5 meets L12, other confirmations may be made with pLineIntersectionMD.

At this point I summarize my progress using the diagram.  Note that the blue, green and magenta lines are all in the hyperboloid, the magenta lines hit the hyperbola in two points.

For our next lines we need new hyperboloids.  First  we need the hyperboloid through L8, L9 and L11. To get this we need the equations for L8 and L9.  Note that p1 we calculated above is in L8.  Another point would be the intersection of L8 and L5.

p85=pLineIntersectionMD[L8,L5,t,{x,y,z},dTol]

Then we compute and check

L8Eq=lineMD[p18,p85,{x,y,z}]
Chop[Simplify[L8Eq/.Thread[{x,y,z}->L8]]]

For line 9 we compute and check

p95=pLineIntersectionMD[L9,L5,t,{x,y,z},dTol]

L9Eq=lineMD[p19,p95,{x,y,z}]
Chop[Simplify[L9Eq/.Thread[{x,y,z}->L9]]]

Now to find the hyperboloid through lines L8, L9 and L11

syl8=sylvesterMD[L8Eq,2,{x,y,z}];
syl9=sylvesterMD[L9Eq,2,{x,y,z}];
syl11=sylvesterMD[L11Eq,2,{x,y,z}];
int8911=vectorSpaceIntersection3[syl8,syl9,syl11,dTol]

hyp2=First[int8911.mExpsMD[2,{x,y,z}]]

Line L1 already intersects L8,L9, L11, and L12, our tool E  from Section 1.9.3 says there will be another which will be in this hyperboloid hyp2.  Note that L12 meets this hyperboloid at the intersection of L12 and L1 so must meet at another point.

p112=pLineIntersectionMD[L1,L12,t,{x,y,z},dTol]

p412=NSolveValues[hyp2/.Thread[{x,y,z}->L12],{t}]

Note

L12/.{t->.5}

is p112 so our other intersection of L12 and the hyperboloid is

p412=L12/.{t->1.5072992700729924`}

This will be one point on L4 hence the name.  We note in passing

rp412=Rationalize[p412]
hyp2/.Thread[{x,y,z}->rp412]

so p412 is actually a rational point on hyp2 and obviously so is p112.

Now

P412=Expand[tangentPlaneNS[hyp2,rp412,{x,y,z}]]

Note

Solve[hyp2==0&&P412==0,{x,y,z}][[1]]

So Solve does not work here and we need to use the alternate method for problem A of 1.9.3

sol4=NSolveValues[{hyp2,P412},{x,y,z}]

The lines through p412 and either of these points will be on hyp2 and the one in the opposite ruling of L8, L9, L11 is the one we want for L4, that is we want, say, L8 and L4 to intersect.  we try the first

L4Eq= lineMD[p412,sol4[[1]],{x,y,z}]

p48=NSolveValues[Join[L4Eq,L8Eq],{x,y,z}]

So this the correct line.

L4=First[SolveValues[L4Eq==0,{x,y,z}]/.{x->t}]

Show[ContourPlot3D[hyp2==0,{x,-4,4},{y,-4,4},{z,-4,4},Mesh->None],ParametricPlot3D[{L8,L9,L11,L12,L1,L6,L4},{t,-4,4}, PlotStyle->{Green,Green,Cyan,Cyan,Blue,Magenta,Black}],Axes->None,Boxed->False]

We use the same method to get L3 .

p510=Rationalize[pLineIntersectionMD[L5,L10,t,{x,y,z},dTol]]

L10Eq=lineMD[p110,p510,{x,y,z}]

We already have syl8, syl11 so

syl10=sylvesterMD[L10Eq,2,{x,y,z}];
int8910=vectorSpaceIntersection3[syl8,syl10,syl11,dTol]

So the hyperboloid generated by lines L8, L10, L11 is

hyp3=Chop[First[int8910.mExpsMD[2,{x,y,z}]]]

Note that L1 is in this hyperboloid also, at least numerically

Simplify[hyp3/.Thread[{x,y,z}->L1]]

Now we note that L12 meets this hyperboloid in 2 points our point

p112

and the point

q3= NSolveValues[{L12Eq==0,hyp3==0},{x,y,z}][[2]]

The first point already contains a line meeting L8, L10, L11  and L12 so we will find a point in the opposite ruling of the first 3 of these lines again using Problem E.

P15=Expand[tangentPlaneNS[hyp3,q3,{x,y,z}]]

Again Solve is not able to give a good solution since hyp3 is given numerically  so we use our other method

sol15=NSolveValues[{hyp3,P15},{x,y,z}]

We try first

L3eq=lineMD[q3,sol15[[1]],{x,y,z}]

then we would have

L3=First[SolveValues[L3eq==0,{x,y,z}]/.{x->t}]

pLineIntersectionMD[L1,L3,t,{x,y,z},.003]

So this must be in the opposite ruling so it will meet L8, L10, L11 also .

Show[ContourPlot3D[{hyp3==0},{x,-4,4},{y,-4,4},{z,-4,4},Mesh->None],ParametricPlot3D[{L1,L8, L10,L11,L12,L3},{t,-4,4}, PlotStyle->{Green,Green,Cyan,Blue,Cyan,Magenta}],Axes->None,Boxed->False]

Next for L2  we  must solve Problem E for L9, L10,  L11 and L12.  We have already calculated the Sylvester matrices for L9, L10 and L11 so the hyperboloid generated by skew lines L9, L10 and L11 is

hyp4=First[vectorSpaceIntersection3[syl9,syl10,syl11,dTol].mExpsMD[2,{x,y,z}]]

This again also contains L1 because L1 meets this hyperboloid in 3 points.

Simplify[hyp4/.Thread[{x,y,z}->L1]]

So we again have that line L12 meets hyp4 in

p112

and the other point is q2

q2= NSolveValues[{L12Eq==0,hyp4==0},{x,y,z}][[2]]

The tangent plane is

P2=Expand[tangentPlaneNS[hyp4, q2,{x,y,z}]]

which meets hyp4 at q2 and the two points

solq2=NSolveValues[{hyp4,P2},{x,y,z}]

Try again the first

L2Eq=lineMD[q2,solq2[[1]],{x,y,z}]

L2=First[SolveValues[L2Eq==0,{x,y,z}]/.{x->t}]

which again is the correct line because

pLineIntersectionMD[L1,L2,t,{x,y,z},.003]

and L2 intersects L9, L10, L11 and L12

pLineIntersectionMD[L2,L10,t,{x,y,z},dTol]

Only L7 remains to be calculated .  Here we will use Problem E with lines L2, L3, L4, and L5.  Note that it has been previously established that L12 meets L2, L3 and L4 so must lie in the hyperboloid containing L2, L3, and L4  and thus the intersection point with L5 is in this hyperboloid requiring L5 to meet it in two points.  Thus Problem E will give a second line, besides L12, meeting L2, L3, L4 and L5.

We start with the Sylvester Matrices.

syl2=sylvesterMD[L2Eq,2,{x,y,z}];
syl4=sylvesterMD[L4Eq,2,{x,y,z}];
syl3=sylvesterMD[L3eq,2,{x,y,z}];

int234=vectorSpaceIntersection3[syl2,syl3,syl4,dTol]

hyp6=int234[[1]].mExpsMD[2,{x,y,z}]

Show[ContourPlot3D[hyp6==0,{x,-3,3},{y,-3,3},{z,-3,3}, Mesh->None],ParametricPlot3D[{L2,L3,L4,L5,L12},{t,-5,5},PlotStyle->{Magenta,Magenta,Magenta,Cyan,Black}]]

We see in the plot above that L5, (cyan) does intersect hyp6 in two points, the first being on L5.

p512= pLineIntersectionMD[L5,L12,t,{x,y,z},dTol]

The second point is then the first solution of

sol7=NSolveValues[Append[L5Eq,hyp6],{x,y,z}]

tP7=Expand[tangentPlaneNS[hyp6,sol7[[1]],{x,y,z}]]

sol7a=NSolveValues[{hyp6,tP7},{x,y,z}]

We have had luck with the first so try

L7eq=lineMD[sol7a[[1]],sol7[[1]],{x,y,z}]

L7=First[SolveValues[L7Eq==0,{x,y,z}]/.{x->t}]

pLineIntersectionMD[L7,L2,t,{x,y,z},.003]

But this is not what we need so try again

L7Eq=ratLine3D[sol7a[[2]],sol7[[1]]]

L7=First[SolveValues[L7Eq==0,{x,y,z}]/.{x->t}]

{t,1.661032057842025` -0.9952722110334632` t,-0.40924299170135053`+1.6161700818709201` t}

p72=pLineIntersectionMD[L7,L2,t,{x,y,z},dTol]

Show[ContourPlot3D[hyp6==0,{x,-3,3},{y,-3,3},{z,-3,3}, Mesh->None],ParametricPlot3D[{L2,L3,L4,L5,L12,L7,L6},{t,-5,5},PlotStyle->{Magenta,Magenta,Magenta,Cyan,Cyan,Black,Red}]]

One question remains, we did not use in our construction that we want L7 to meet L6. Hilbert tells us that it should.

p67=pLineIntersectionMD[L7,L6,t,{x,y,z},dTol]

And this works, so we are done!

9.A.1.2 The Lines

L1={t,(5/3)+((4 t)/3),(4/3)+((5 t)/3)};
L1eq={(5/4)+x-((3 y)/4),(4/5)+x-((3 z)/5)};

L2={t,1.10873690400994` -0.4642368931192767` t,-0.4642368931190869`+1.669047069329676` t}

L2eq={-0.05856424068705457`-0.7846339418831927` x+0.2825671917736605` y+0.5487035530145024` z,0.7097653649608596` -0.2885124026251688` x-0.6426189684002892` y-0.005880619489322159` z}

L3={t,1.125206152628268` -0.5076671846982648` t,-0.3081725820785607`+1.5241953578676644` t}

L3eq={-0.07919271164605779`-0.7739189116548401` x+0.23046916193711295` y+0.5845186036398986` z,0.7126914245841259` -0.28414503392789914` x-0.6407833543545166` y-0.027004181167662733` z}

L4={t,0.9721721581433124` -0.4260900032234079` t,-0.11264557902259985`+1.3711014253079723` t}

L4eq={-0.09320923495074473`-0.7676666733794391` x+0.16675641783827816` y+0.6117125257931114` z,0.6718672486640745` -0.25577006590019996` x-0.6944917223436137` y-0.029280047099945975` z}

L5={t,(29/20)-((21 t)/20),-(21/20)+((29 t)/20)};
L5eq={-(29/21)+x+((20 y)/21),-(21/29)+x-((20 z)/29)};

L6={t,1,t};
L6eq={x-z,y-1};

L7={t,1.661032057842025` -0.9952722110334632` t,-0.40924299170135053`+1.6161700818709201` t}

L7eq={-1.6689223706120404`+x+1.00475024713256` y,-0.2532177747206617`+x-0.6187467589069536` z}

L8={t,(13/5)+((12 t)/5),-(12/5)-((13 t)/5)};
L8eq={(13/12)+x-((5 y)/12),(12/13)+x+((5 z)/13)};

L9={t,(17/15)+((8 t)/15),-(8/15)-((17 t)/15)};

L9eq={(17/8)+x-((15 y)/8),(8/17)+x+((15 z)/17)};

L10={t,(17/15)-((8 t)/15),(8/15)-((17 t)/15)};
L10eq={-(17/8)+x+((15 y)/8),-(8/17)+x+((15 z)/17)};

L11={t,0.38461538461538447` +0.3076923076923076` t,0.3076923076923077` +0.8461538461538464` t}

L11eq={-0.07590449452743864`-0.5126286562865799` x-0.4051883951148316` y+0.7531751011077149` z,0.3669985639110611` +0.38382837350094035` x-0.8338902363393038` y-0.15038253728681905` z}

L12={t,(599/180)-((179 t)/90),(409/180)-((19 t)/90)};
L12eq={-(599/358)+x+((90 y)/179),-(409/38)+x+((90 z)/19)};

Here is a diagram, the blue lines are rational.

Here is a plot.  The green lines are in the original hyperboloid, given in background, while the others are not.

Show[ContourPlot3D[hypEq==0,{x,-4,4},{y,-4,4},{z,-4,4},ContourStyle->Directive[LightGreen,Opacity[.2]],Mesh->None],ParametricPlot3D[{L1,L9,L10,L5,L6},{t,-20,20},PlotStyle->Green,PlotRange->5],ParametricPlot3D[{L2,L3,L4,L7,L11,L12},{t,-5,5},PlotStyle->Magenta],Boxed->False,Axes->False]

9. A .1 .2 Verifications

We verify skewness first .

pLineIntersectionMD[L1,L2,t,{x,y,z},.003]

pLineIntersectionMD[L1,L3,t,{x,y,z},.003]

pLineIntersectionMD[L1,L4,t,{x,y,z},.003]

pLineIntersectionMD[L1,L5,t,{x,y,z},.003]

pLineIntersectionMD[L1,L6,t,{x,y,z},.003]

pLineIntersectionMD[L2,L3,t,{x,y,z},.003]

pLineIntersectionMD[L2,L4,t,{x,y,z},.003]

pLineIntersectionMD[L2,L5,t,{x,y,z},.003]

pLineIntersectionMD[L2,L6,t,{x,y,z},.003]

pLineIntersectionMD[L3,L4,t,{x,y,z},.003]

pLineIntersectionMD[L3,L5,t,{x,y,z},.003]

pLineIntersectionMD[L3,L6,t,{x,y,z},.003]

pLineIntersectionMD[L4,L5,t,{x,y,z},.003]

pLineIntersectionMD[L4,L6,t,{x,y,z},.003]

pLineIntersectionMD[L5,L6,t,{x,y,z},.003]

pLineIntersectionMD[L1,L7,t,{x,y,z},.003]

pLineIntersectionMD[L2,L8,t,{x,y,z},.003]

pLineIntersectionMD[L3,L9,t,{x,y,z},.003]

pLineIntersectionMD[L4,L10,t,{x,y,z},.003]

pLineIntersectionMD[L5,L11,t,{x,y,z},.003]

pLineIntersectionMD[L6,L12,t,{x,y,z},.003]

Now we find the intersection points

p18=pLineIntersectionMD[L1,L8,t,{x,y,z},dTol]

p19=pLineIntersectionMD[L1,L9,t,{x,y,z},dTol]

p110=pLineIntersectionMD[L1,L10,t,{x,y,z},dTol]

p111=Chop[pLineIntersectionMD[L1,L11,t,{x,y,z},dTol]]

p112=pLineIntersectionMD[L1,L12,t,{x,y,z},dTol]

p27=pLineIntersectionMD[L2,L7,t,{x,y,z},dTol]

p29=pLineIntersectionMD[L2,L9,t,{x,y,z},dTol]

p210=pLineIntersectionMD[L2,L10,t,{x,y,z},dTol]

p211=pLineIntersectionMD[L2,L11,t,{x,y,z},.01]

p212=pLineIntersectionMD[L2,L12,t,{x,y,z},dTol]

p37=pLineIntersectionMD[L3,L7,t,{x,y,z},dTol]

p38=pLineIntersectionMD[L3,L8,t,{x,y,z},dTol]

p310=pLineIntersectionMD[L3,L10,t,{x,y,z},dTol]

p311=pLineIntersectionMD[L3,L11,t,{x,y,z},dTol]

p312=pLineIntersectionMD[L3,L12,t,{x,y,z},dTol]

p47=pLineIntersectionMD[L4,L7,t,{x,y,z},dTol]

p48=pLineIntersectionMD[L4,L8,t,{x,y,z},dTol]

p49=pLineIntersectionMD[L4,L9,t,{x,y,z},dTol]

p411=pLineIntersectionMD[L4,L11,t,{x,y,z},dTol]

p412=pLineIntersectionMD[L4,L12,t,{x,y,z},dTol]

p57=pLineIntersectionMD[L5,L7,t,{x,y,z},dTol]

p58=pLineIntersectionMD[L5,L8,t,{x,y,z},dTol]

p59=pLineIntersectionMD[L5,L9,t,{x,y,z},dTol]

pLineIntersectionMD[L5,L10,t,{x,y,z},dTol]

or

p510={(19/31),(25/31),-(5/31)}

p512=pLineIntersectionMD[L5,L12,t,{x,y,z},dTol]

p67=pLineIntersectionMD[L6,L7,t,{x,y,z},dTol]

p68=pLineIntersectionMD[L6,L8,t,{x,y,z},dTol]

p69=pLineIntersectionMD[L6,L9,t,{x,y,z},dTol]

p610=pLineIntersectionMD[L6,L10,t,{x,y,z},dTol]

p611=pLineIntersectionMD[L6,L11,t,{x,y,z},dTol]

So everything Checks!

D6Points=N[{p18,p19,p110,p111,p112,p27,p29,p210,p211,p212,p37,p38,p310,p311,p312,p47,p48,p49,p411,p412,p57,p58,p59,p510,p512,p67,p68,p69,p610,p611}]

Here is a new graphic, with points

Show[ContourPlot3D[hypEq==0,{x,-4,4},{y,-4,4},{z,-4,4},ContourStyle->Directive[LightGreen,Opacity[.2]],Mesh->None],ParametricPlot3D[{L1,L9,L10,L5,L6},{t,-20,20},PlotStyle->Green,PlotRange->5],ParametricPlot3D[{L2,L3,L4,L7,L11,L12},{t,-5,5},PlotStyle->Magenta],Graphics3D[{Black,PointSize[.015],Point[D6Points]}],Boxed->False,Axes->False]