Rational bracings of regular polygons
by Jeremy Tan / Parcly Taxel
National University of Singapore
by Jeremy Tan / Parcly Taxel
National University of Singapore
The Nobel Prize winner Gerard ’t Hooft made three monographs, Meccano Math I, II and III, on the construction of geometric figures through a rigid framework of ideal Meccano strips. While the distance between adjacent holes is constant, that distance can be equated with any real-world length, so the problem of bracing a figure with Meccano strips is equivalent to the problem of bracing with strips where all distances between hinges on the same strip are rational numbers (a rational strip). This notebook will give such rational bracings for several regular polygons (scaled to unit side length), as well as one other interesting length.
To visualise such constructions in Mathematica it is convenient to have a function taking in vertices as complex numbers and returning a graph with edges labelled according to what rational strip they belong to.
To visualise such constructions in Mathematica it is convenient to have a function taking in vertices as complex numbers and returning a graph with edges labelled according to what rational strip they belong to.
In[]:=
cSignAbs[z_]:=With[{Rz=RootReduce[Re[z]],Iz=RootReduce[Im[z]]},RootReduce[{Sign[z],Abs[z]}If[Rz>0∨(Rz==0∧Iz>0),1,-1]]]
All possible rational strips, defined by edge sets with the same weight, are found by the function below, while the rational distances are stored in the edge labels for display.
In[]:=
ratgraph[verts_]:=Module[{n=Length[verts],G,vrange,vects,nedge,rods={}},G=Graph[Range[n],{},VertexCoordinates->ReIm/@verts];Do[vrange=Select[Range[i+1,n],Function[j,NoneTrue[rods,SubsetQ[#,{i,j}]&]]];vects=Table[Append[cSignAbs[verts[[j]]-verts[[i]]],j],{j,vrange}];vects=Select[vects,#[[2]]∈Rationals&];vects=SortBy[Append[#[[All,2;;]],{0,i}],First]&/@GatherBy[vects,First];Do[Do[nedge=UndirectedEdge@@pair[[All,2]];G=EdgeAdd[G,nedge];AnnotationValue[{G,nedge},EdgeLabels]=-Subtract@@pair[[All,1]];AnnotationValue[{G,nedge},EdgeWeight]=Length[rods],{pair,Partition[rod,2,1]}];AppendTo[rods,rod[[All,2]]],{rod,vects}],{i,n-1}];G]
A few more helper functions to generate the vertices of a regular polygon, a point collinear with and at specified distance from two other points and a “butterfly” to be discussed later.
In[]:=
circlepoints[n_]:=FoldList[Plus,0,Exp[2IRange[0,n-2]Pi/n]]
In[]:=
linterp[a_,b_,t_]:=a(1-t)+bt
In[]:=
butterfly[p_,a_,b_,i_]:=With[{n=Length[p]},{linterp[p[[Mod[i+1,n]+1]],p[[Mod[i,n]+1]],a],linterp[p[[Mod[i+1,n]+1]],p[[Mod[i,n]+1]],b],linterp[p[[Mod[i+2,n]+1]],p[[Mod[i+3,n]+1]],a],linterp[p[[Mod[i+2,n]+1]],p[[Mod[i+3,n]+1]],b]}]
The regular triangle, square and hexagon can then be trivially braced with 0, 1 and 0 extra strips respectively, where extensions of the polygon’s sides don’t count as extra strips:
B3=ratgraph[circlepoints[3]]
Out[]=
B4=ratgraph[Append[circlepoints[4],3I/4]]
Out[]=
B6=VertexDelete[ratgraph[Flatten[Table[i+jExp[IPi/3],{i,0,2},{j,0,2}]]],5]
Out[]=
The pentagon is not as easy to brace, but consider the following framework:
Module[{av=1/3,bv=1/2,G},G=Graph[{12,13,24,34},VertexCoordinates->ReIm[{0,1,-avExp[-2IPi/5],1+bvExp[2IPi/5]}],EdgeLabels{12->1,13->a,24->b,34->u}];G]
Out[]=
Here the edges span three consecutive sides of the pentagon. Now suppose are all rational and simplify the expression for :
a,1,b
a,u,b
2
u
uv5=ComplexExpand[aExp[-2IPi/5]+1+bExp[2IPi/5]]
Out[]=
1-+-++-+a++b
a
4
5
a4
b
4
5
b4
5
8
5
8
5
8
5
8
usq5=uv5[[;;-2]]^2+uv5[[-1,-1]]^2//Expand//Collect[#,Sqrt[5]]&
Out[]=
1-+--+++-
a
2
2
a
b
2
ab
2
2
b
5
a
2
b
2
ab
2
Now is rational but is a -basis for , so the coefficient of must be zero, giving a necessary expression for in terms of :
2
u
1,
5
Q
Q(
5
)5
b
a
ba5=SolveValues[usq5[[-1,-1]]==0,b][[1]]
Out[]=
a
-1+a
Then the following gives in terms of a single rational parameter :
u,a,b
s
{PowerExpand[(Sqrt[usq5/.b->ba5]//Together)/.a->s+1//Factor],s+1,ba5/.a->s+1//FullSimplify}
Out[]=
,1+s,1+
1+s+++
2
s
3
s
4
s
s
1
s
Hence the rational bracings of the regular pentagon with two extra strips added in the above manner are in bijection with rational points on +++s+1. The latter is an elliptic curve of rank 1 as shown in this Maths Stack Exchange question of mine, and hence has infinitely many rational points. The following function generates the corresponding bracings, which is where the butterfly function comes in – two bracing strips can connect the same two edges non-redundantly, and the result looks like a butterfly:
2
y
4
s
3
s
2
s
In[]:=
B5t[n_/;n∈PositiveIntegers]:=Module[{x=4,y=2,s,xr,p=circlepoints[5]},Do[s=(y-1)/(x-1);xr=s^2-x+4;{x,y}={xr,s(x-xr)-y},n];s=(2y-x)/(4x-5);ratgraph[Join[p,butterfly[p,1+s,1+1/s,4]]]]
I originally found this bracing by random search:
B5=B5t[2]
Out[]=
And this is the bracing from Meccano Math I:
Analogous “butterfly bracings” whose equations can be derived by the same method exist for the regular octagon, decagon and dodecagon. The octagon’s parameters are related to Pell numbers, the decagon’s are just the pentagon’s with a sign flip and the dodecagon’s are related to Pythagorean triples:
The below line of code counts how many extra strips were used to brace the above polygons: