Oregon Curriculum Network
Discovering Math with Python
This is a cut and paste job, working from notes messaged by David Koski to Casey House and myself. It's about the volume of Five Octahedrons (a five-fold symmetric non-convex shape -- it has "bumps").
My goal is to verify David's numbers using the extended precision library gmpy2.
The precision is expressed in bits, not decimal digits. 100 is already well beyond what a native floating point IEEE 754 would contain. If using a live version of this Notebook, you'll be able to take control of the context, including how many bits.
Lets go with 200 bits this time. You'll start to see discrepancies in the least significant digits, which is to be expected.
In [1]:
import gmpy2
gmpy2.get_context().precision=200
In [2]:
root5 = gmpy2.sqrt(5)
root2 = gmpy2.sqrt(2)
Ø = (1 + root5)/2
Ø
Out[2]:
In [3]:
S = (Ø **-5)/2 # home base Smod
S3 = S * Ø**3 # capital s, phi up
S6 = S3 * Ø**3 # phi up yet again
# and so on
s3 = S * Ø**-3 # small s, phi down
s6 = s3 * Ø**-3
s9 = s6 * Ø**-3
s12= s9 * Ø**-3
for i in 's12, s9, s6, s3, S, S3, S6'.split(","):
print("{:>4} =".format(i), eval(i))
The S may be expressed in terms of phi-scaled versions of itself.
In [4]:
S = 4*s3 + s6 # synonyms
S
Out[4]:
The five octahedrons are presumed to have edges 2R, the same edge used for the unit volume tetrahedron, and for the 12-around-1 cuboctahedron. The dissection by David Koski was done in vZome.
In [5]:
# Koski writes:
FiveOcta = 132 * S + 36 * s3
RD6 = 126*S + 30*s3
# 1/10 of RTW is 6S+6s3
# adding them together gets the result
# Whew
FiveOcta
Out[5]:
In [6]:
RD6
Out[6]:
In [7]:
FiveOcta2 = 10116 * s9 + 2388 * s12
FiveOcta2
Out[7]:
David: "So, the beauty of working with these bits is that I can move them around."
In [8]:
for i in 132*S + 36*s3, 564*s3 + 132*s6, 2388*s6 + 564*s9, 10116*s9 + 2388*s12:
print(i)
The Five Octahedra each of volume 4, edges 2R, contain a shared Icosahedron, the long diagonals of which define a corresponding RT as shown by the Koski vZomes above.
This shared Icosahedron has a volume of $2.5 * sfactor^2$ (See All Aboard the S Train link below).
An Icosahedron 8 times larger, $20 * sfactor^2$, has the volume 20 cuboctahedron + that of the RT defined above.
In [9]:
cubocta = gmpy2.mpfr(2.5) # inscribed in Octa 4
sfactor = 2 * gmpy2.sqrt(2) * Ø ** -2
Icosa_within = cubocta * sfactor ** 2 # inscribed in Octa 4
RT_within = 60*S + 60*s3 # RT anchored by Icosa_within (long diags)
In [10]:
print(Icosa_within * 8)
print(cubocta * 8 + RT_within) # 20 + RT Within
In [11]:
480*S + 280*s3
Out[11]:
Lets take this opportunity to contextualize the above in terms of our larger volumes table. We'll need a few more players, namely the E family.
The T_factor, about 0.99948333, and discussed in Synergetics, is the linear scale factor by which the E module is reduced to create a T module. This T_factor to the 3rd power would be the volumetric reduction factor, and applied to the E module returns volume 1/24.
T_factor = $(\Phi/\sqrt{2}) (\sqrt[3]{2/3})$.
An RT of 120 T modules has a volume of exactly 5, where T = A = B = 1/24 tetravolumes.
An RT of 120 E modules has a radius (center to diamond face centers) of exactly 1, and encases a unit radius sphere.
This slightly larger RT shows up as RT5+ in the table below.
In [14]:
E = (root2/8) * (Ø ** -3) # home base Emod
E3 = E * Ø ** 3 # Emod phi up
e3 = E * Ø ** -3 # Emod phi down
SuperRT = 120 * E3 # = 20 * Synergetics Constant sqrt(9/8)
F = gmpy2.mpfr(gmpy2.mpq(1, 16)) # space-filling shape, appears in 5RD
T_factor = Ø/root2 * gmpy2.root( gmpy2.mpq(2, 3), 3) # T radius vs. E radius of 1
T = E * T_factor ** 3
T_factor
Out[14]:
In [15]:
print("Five VEs : {:60.57}".format(480*S + 280*s3)) # compound shape
print("SuperRT : {:60.57}".format(SuperRT)) # formed by P Dodeca + Icosa verts
print("Cubocta : {:60.57}".format(20*S6 + 20*S3)) # classic Jitterbug (JB) starts here
print("Icosa : {:60.57}".format(100*E3 + 20*E)) # JB icosa
print("SmallGuy : {:60.57}".format(360*E + 85*e3)) # skew to JB icosa
print("P Dodeca : {:60.57}".format(348*E + 84*e3)) # dual to JB icosa, edges crossing
print("Five Octas : {:60.57}".format(132*S + 36*s3)) # compound shape
print("Rh Dodeca (RD): {:60.57}".format(6*S6 + 6*S3)) # space filler, shares verts with RT7.5
print("RT5+ : {:60.57}".format(120*E)) # 120 E modules
print("RT5 : {:60.57}".format(5*S6 + 5*S3)) # 120 T modules
print("RT5 (check) : {:60.57}".format(T * 120))
print("Octa : {:60.57}".format(4*S6 + 4*S3)) # JB octahedron
print("Cube : {:60.57}".format(3*S6 + 3*S3))
print("Skew Icosa : {:60.57}".format(Icosa_within)) # askew to 2.5 VE
print("Small VE : {:60.57}".format(cubocta)) # 1/8 volume of JB cubocta
print("Five Tetras : {:60.57}".format(35*S + 45*s3)) # per Koski
print("Tetra : {:60.57}".format(5*S3 + S)) # unit volume
print("-" * 76)
print("F : {:60.57}".format(F)) # fourth RITE (Rite = 2 Mites)
print("E3 : {:60.57}".format(E3))
print("E : {:60.57}".format(E))
print("e3 : {:60.57}".format(e3))
print("T : {:60.57}".format(E * T_factor**3))
print("S6 : {:60.57}".format(S6))
print("S3 : {:60.57}".format(S3))
print("S : {:60.57}".format(S))
print("s3 : {:60.57}".format(s3))
print("s6 : {:60.57}".format(s6))
For further reading: