quickfur wrote:Nice puzzle. Not sure I know the answer... but there's something about these constructions where you have an initial polytope P, layered on top of a phi-scaled P, and then some other vertex layers to close things up. In that sense, they are all generalizations of teddi (as triangle || phi*triangle || dual triangle).
Am I close?
o3o o3o o3o o3o
x3o + x3o x3o = x3o x3o
f3o f3o f3o
o3x o3x o3x o3x o3x
{3} || teddi + tetrahedral ursachoron = 3-mibdi-laced-wedge
1.00000000000000000 0.70710678118654752 0.00000000000000000 0.00000000000000000
-1.00000000000000000 0.70710678118654752 0.00000000000000000 0.00000000000000000
0.00000000000000000 -0.70710678118654752 1.00000000000000000 0.00000000000000000
0.00000000000000000 -0.70710678118654752 -1.00000000000000000 0.00000000000000000
0.00000000000000000 1.85122958682191612 0.61803398874989485 1.14412280563536860
0.00000000000000000 1.85122958682191612 -0.61803398874989485 1.14412280563536860
1.00000000000000000 0.43701602444882107 1.61803398874989485 1.14412280563536860
-1.00000000000000000 0.43701602444882107 1.61803398874989485 1.14412280563536860
1.00000000000000000 0.43701602444882107 -1.61803398874989485 1.14412280563536860
-1.00000000000000000 0.43701602444882107 -1.61803398874989485 1.14412280563536860
1.61803398874989485 -0.43701602444882107 1.00000000000000000 1.14412280563536860
1.61803398874989485 -0.43701602444882107 -1.00000000000000000 1.14412280563536860
-1.61803398874989485 -0.43701602444882107 1.00000000000000000 1.14412280563536860
-1.61803398874989485 -0.43701602444882107 -1.00000000000000000 1.14412280563536860
0.61803398874989485 -1.85122958682191612 0.00000000000000000 1.14412280563536860
-0.61803398874989485 -1.85122958682191612 0.00000000000000000 1.14412280563536860
1.61803398874989485 1.14412280563536860 0.00000000000000000 1.85122958682191612
-1.61803398874989485 1.14412280563536860 0.00000000000000000 1.85122958682191612
0.00000000000000000 -1.14412280563536860 1.61803398874989485 1.85122958682191612
0.00000000000000000 -1.14412280563536860 -1.61803398874989485 1.85122958682191612
0.00000000000000000 1.41421356237309505 0.00000000000000000 2.99535239245728471
1.00000000000000000 0.00000000000000000 1.00000000000000000 2.99535239245728471
1.00000000000000000 0.00000000000000000 -1.00000000000000000 2.99535239245728471
-1.00000000000000000 0.00000000000000000 1.00000000000000000 2.99535239245728471
-1.00000000000000000 0.00000000000000000 -1.00000000000000000 2.99535239245728471
0.00000000000000000 -1.41421356237309505 0.00000000000000000 2.99535239245728471
quickfur wrote:As it turns out, the 10,10-duoprism actually has 11,921,273 augmentations (that's 11.9 million!), which is several times more than the previous count. The reason for this is that the bug in the previous version of the program failed to account for the fact that the rings of the duoprism cannot be rotated independently of each other: a rotation in one ring causes a gyration in the other, and vice versa. Furthermore, some augmentations are chiral, so they contribute 2 to the count rather than just 1 -- they cannot be transformed to each other via rotations only; they require a reflection. There's also a slight reduction in the count because the previous version didn't check the full rotational symmetry of the duoprism, so some combinations were duplicated.
Mrrl wrote:quickfur wrote:And furthermore, one doesn't have to stick with the 24 apices of the snub 24-cell alone. One could, for example, diminish the 600-cell at an apex that lies between two of the snub 24-cell's icosahedra, leading to a different kind of diminishing. Adding in these other possibilities greatly expand the number of diminishings of the 600-cell (I think mrrl estimated the number to be close to a million).
No, these were closer to 2^100 but rectified 600-cell (using only one type of diminishing) beats them - there are proven 2^156 different CRFS with estimations up to 2^500
mr_e_man wrote:quickfur wrote:As it turns out, the 10,10-duoprism actually has 11,921,273 augmentations (that's 11.9 million!), which is several times more than the previous count. The reason for this is that the bug in the previous version of the program failed to account for the fact that the rings of the duoprism cannot be rotated independently of each other: a rotation in one ring causes a gyration in the other, and vice versa. Furthermore, some augmentations are chiral, so they contribute 2 to the count rather than just 1 -- they cannot be transformed to each other via rotations only; they require a reflection. There's also a slight reduction in the count because the previous version didn't check the full rotational symmetry of the duoprism, so some combinations were duplicated.
I would not double-count the chiral ones. A left-handed thing is isomorphic to a right-handed thing, in my view.
So would the count be something like 6 million? Aren't "most" augmentations chiral?
Also, can anyone explain or confirm the huge numbers in Mrrl's linked post?
Mrrl wrote:quickfur wrote:And furthermore, one doesn't have to stick with the 24 apices of the snub 24-cell alone. One could, for example, diminish the 600-cell at an apex that lies between two of the snub 24-cell's icosahedra, leading to a different kind of diminishing. Adding in these other possibilities greatly expand the number of diminishings of the 600-cell (I think mrrl estimated the number to be close to a million).
No, these were closer to 2^100 but rectified 600-cell (using only one type of diminishing) beats them - there are proven 2^156 different CRFS with estimations up to 2^500
Here I'm more interested in lower bounds than upper bounds. An obvious upper bound for the rectified 600-cell is 2^720.
quickfur wrote:mr_e_man wrote:quickfur wrote:[...]
Furthermore, some augmentations are chiral, so they contribute 2 to the count rather than just 1 -- they cannot be transformed to each other via rotations only; they require a reflection.
[...]
I would not double-count the chiral ones. A left-handed thing is isomorphic to a right-handed thing, in my view.
So would the count be something like 6 million? Aren't "most" augmentations chiral?
No, I'd say the majority of them are not chiral. I doubt it would be as low as 6 million. My wild guess is that it would still be 10 million or above.
[...]
quickfur wrote:But certainly, this is nowhere near Mrrl's astronomical 2^100, which is a 31-digit number. I think his estimate did not account for the symmetries of the 600-cell and/or did not adequately recompense for them.
Klitzing wrote:Stated differntly, whenever your potential diminishing of the hexacosachoron includes at least a subset of 3 to be cut off vertices, then these ought not form a unit edged triangle.
mr_e_man wrote:quickfur wrote:But certainly, this is nowhere near Mrrl's astronomical 2^100, which is a 31-digit number. I think his estimate did not account for the symmetries of the 600-cell and/or did not adequately recompense for them.
Well, the symmetry group's size is 14400, so each thing Mrrl counted would have at most 14400 isomorphs he also counted; this would give a lower bound of 2^100 / 14400 ≈ 2^86.
(I like to use 2^10 ≈ 10^3 to convert between binary and decimal. For example, 2^100 = (2^10)^10 ≈ (10^3)^10 = 10^30, which indeed has 31 digits.)
How could we count the triangle-free subsets of the 600-cell's vertices? That would give a lower bound better than 314 million.Klitzing wrote:Stated differntly, whenever your potential diminishing of the hexacosachoron includes at least a subset of 3 to be cut off vertices, then these ought not form a unit edged triangle.
quickfur wrote:[...]
Actually, I just checked my code again: it does not double count chiral augmentations. I think what I meant when I wrote what was quoted above, is that I corrected the counts because previously it double-counted chiral augmentations, and now it takes chirality into account. So the 11.9 million count actually does not count chiral augmentations twice. If you were to count mirror images separately the final total would be higher.
mr_e_man wrote:The pentagons in x5o3x3o correspond to the vertices in o5o3x3o, or the edges in o5o3o3x. There's a total of 720.
Consider the 120 pentagons in x5o3x3o corresponding to the vertices in o5o3x3o which are deleted to get spidrox. Any of these pentagons (with their magnabicupolic rings) can be deleted, or gyrated, or left alone. This gives us at least 3^120 / 14400 ≈ 10^53 different CRFs!
quickfur wrote:But that's only the tip of the iceberg. Something horrible happens when we get to the 10,10-duoprism: the pentagonal magnabicupolic ring augments are, again, very shallow, so both rings can be independently augmented. Furthermore, each augment has two distinct orientations, which greatly increases the number of combinations (now each prism has 3 possible states: unaugmented, ortho-augmented, and gyro-augmented). It's not quite 3^n, because some gyrations are isomorphic to others under the duoprism's symmetry group, but nevertheless, there is an absolutely humongous number of combinations here. Add to this the fact that the intra-ring angles are shallow enough for for adjacent decagonal prisms to be simultaneously augmented and still remain convex, and we have (up to) 3^10 * 3^10 combinations, divided by the size of the symmetry group of the 10,10-duoprism. Of course, the symmetry group is pretty big, but not very big compared to the sheer number of combinations. The final count of 10,10-duoprism CRF augmentations, if my program is correct, is 1,365,377, up to isomorphism(!!) (and not counting the unaugmented 10,10-duoprism).
quickfur wrote:Alright, I've fixed the bug in my program (hopefully that's the last of 'em...).
[...]
As it turns out, the 10,10-duoprism actually has 11,921,273 augmentations (that's 11.9 million!), which is several times more than the previous count. The reason for this is that the bug in the previous version of the program failed to account for the fact that the rings of the duoprism cannot be rotated independently of each other: a rotation in one ring causes a gyration in the other, and vice versa. Furthermore, some augmentations are chiral, so they contribute 2 to the count rather than just 1 -- they cannot be transformed to each other via rotations only; they require a reflection. There's also a slight reduction in the count because the previous version didn't check the full rotational symmetry of the duoprism, so some combinations were duplicated.
mr_e_man wrote:Hold on...quickfur wrote:[...]
As it turns out, the 10,10-duoprism actually has 11,921,273 augmentations (that's 11.9 million!), which is several times more than the previous count. The reason for this is that the bug in the previous version of the program failed to account for the fact that the rings of the duoprism cannot be rotated independently of each other: a rotation in one ring causes a gyration in the other, and vice versa. Furthermore, some augmentations are chiral, so they contribute 2 to the count rather than just 1 -- they cannot be transformed to each other via rotations only; they require a reflection. There's also a slight reduction in the count because the previous version didn't check the full rotational symmetry of the duoprism, so some combinations were duplicated.
The 10,10-duoprism's symmetry group's size is 800 (as each ring has 20 symmetries, and the two rings can be swapped, which gives 20 * 20 * 2).
It should be expected that "most" augmentations have no symmetry at all; it's easy to break symmetry. For such an augmentation, all 800 isomorphs would be unequal to each other, thus contributing 800 to the count of 3^10 * 3^10 . So the true count should be very close to 3^20 / 800 ≈ 4.36 million.
But both 1.3 million and 11.9 million are not close to that. Maybe there's another bug in your program?
At least 4.3 million is a lower bound for the 10,10-duoprism.
quickfur wrote:[...]
Don't forget that for the 10,10-duoprism, the augments are orientable (meaning they can be in one of two positions that, when other augments are present, represents two distinct augmentations). As the number of augments increase, the number of distinct orientations increase approximately exponentially, until the number of augments nears the saturation point.
[...]
quickfur wrote:Are you sure you got the symmetry group order right? Take one of the prism cells in one of the rings. You can rotate it around the ring in 10 distinct positions. You can also rotate it in-place in 10 orientations. And reflect it across 10 different planes around its vertical axis, as well as reflect it across the horizontal plane. And rotate it by 90° onto the second ring. I'm not very good with computing the order of symmetry groups, but it would appear to me that this should give us 10*10*10*2*2 = 4000. Did I screw up somewhere?
It should be expected that "most" augmentations have no symmetry at all; it's easy to break symmetry. For such an augmentation, all 800 isomorphs would be unequal to each other, thus contributing 800 to the count of 3^10 * 3^10 . So the true count should be very close to 3^20 / 800 ≈ 4.36 million.
Don't forget that for the 10,10-duoprism, the augments are orientable (meaning they can be in one of two positions that, when other augments are present, represents two distinct augmentations). As the number of augments increase, the number of distinct orientations increase approximately exponentially, until the number of augments nears the saturation point.
quickfur wrote:In step (3), the following transformations are applied (in all combinations):
(a) Rotate each array up to n positions where n is the size of the corresponding ring;
(b) If a ring contains orientable augments, flip the orientations of the augments (and rotate the other ring appropriately). (In the implementation, this is done along with (a) because the two are equivalent under a swapping of rings.)
(c) Reverse the order of elements in the array (corresponding to a reflection).
(d) If it's an n,n-duoprism, swap the two arrays (corresponding to a 90° rotation that exchanges the rings). (For m,n-duoprisms where m≠n, there is no such symmetry so we don't perform the swap.) In the implementation, we simply standardize on the first ring being lexicographically less, so if m=n and ring1 > ring2, we discard the pair immediately.
mr_e_man wrote:quickfur wrote:In step (3), the following transformations are applied (in all combinations):
(a) Rotate each array up to n positions where n is the size of the corresponding ring;
(b) If a ring contains orientable augments, flip the orientations of the augments (and rotate the other ring appropriately). (In the implementation, this is done along with (a) because the two are equivalent under a swapping of rings.)
I hope that parenthetic part means you're not doing (a) independently. A rotation in (a), by an odd number of positions, must be accompanied by a gyration (1 <-> 2) in the opposite ring (if applicable).
(c) Reverse the order of elements in the array (corresponding to a reflection).
That's definitely a problem!
A reflection can effectively gyrate the augments.
[...](d) If it's an n,n-duoprism, swap the two arrays (corresponding to a 90° rotation that exchanges the rings). (For m,n-duoprisms where m≠n, there is no such symmetry so we don't perform the swap.) In the implementation, we simply standardize on the first ring being lexicographically less, so if m=n and ring1 > ring2, we discard the pair immediately.
This looks fine, though I think it's actually a 180° rotation.
[...](d) If it's an n,n-duoprism, swap the two arrays (corresponding to a 90° rotation that exchanges the rings). (For m,n-duoprisms where m≠n, there is no such symmetry so we don't perform the swap.) In the implementation, we simply standardize on the first ring being lexicographically less, so if m=n and ring1 > ring2, we discard the pair immediately.
This looks fine, though I think it's actually a 180° rotation.
Why would it be 180°? The 2-planes of each ring are linearly-independent and therefore must be at 90° to each other. Swapping them in effect is equal to rotating the polytope such that each ring moves into the plane of the other, i.e., a 90° rotation.
(c) Reverse the order of elements in the array (corresponding to a reflection).
That's definitely a problem!
A reflection can effectively gyrate the augments.
Sorry, I didn't describe it accurately enough. A reversal is done to both rings simultaneously, since reversing one ring without reversing the other may create a non-isomorphic augmentation. Reversing both produces the mirror image of the polytope.
# Keep in mind the operator precedence:
# arithmetic operations (+ - * //) are evaluated first, then
# bit shifts (<< >>), then other bitwise operations (& | ^).
# no augment = 00, pyramid augment = 01,
# ortho augment = 10, gyro augment = 11 (binary)
all_bits = (1 << 2*10) - 1
even_bits = all_bits // 3
odd_bits = even_bits << 1
def pyramids(x):
return x & even_bits & ~(x & odd_bits)>>1
def rotate(x, num_places, total_places):
return x >> 2*num_places | (
(x & ((1<<2*num_places)-1)) << 2*(total_places - num_places))
def gyrate(x):
return (x & odd_bits) | ((x & even_bits) ^ (x & odd_bits)>>1)
def reverse(x, total_places):
y = 0
for i in range(total_places):
y |= (x>>2*i & 3) << 2*(total_places - 1 - i)
return y
count = 0
ring1 = 0
while ring1 < 1<<2*10:
ring2 = 0
while ring2 < 1<<2*10:
rings1and2 = ring1 << 2*10 | ring2
is_least = True
i = 0
while is_least and i < 2:
ring1_i = reverse(ring1, 10) if i else ring1
ring2_i = gyrate(ring2) if i else ring2
j = 0
while is_least and j < 2:
ring2_ij = reverse(ring2_i, 10) if j else ring2_i
ring1_ij = gyrate(ring1_i) if j else ring1_i
k = 0
while is_least and k < 10:
ring1_ijk = rotate(ring1_ij, k, 10)
ring2_ijk = gyrate(ring2_ij) if k & 1 else ring2_ij
l = 0
while is_least and l < 10:
ring2_ijkl = rotate(ring2_ijk, l, 10)
ring1_ijkl = gyrate(ring1_ijk) if l & 1 else ring1_ijk
new_rings1and2 = ring1_ijkl << 2*10 | ring2_ijkl
new_rings2and1 = ring2_ijkl << 2*10 | ring1_ijkl
is_least &= rings1and2 <= new_rings1and2
is_least &= rings1and2 <= new_rings2and1
l += 1
k += 1
j += 1
i += 1
count += is_least
ring2 += 1
ring2 += pyramids(ring2)
ring1 += 1
# Pyramid augments aren't allowed on the 10,10-duoprism; skip over these.
ring1 += pyramids(ring1)
print(count)
mr_e_man wrote:Here's an implementation of your algorithm, with part (3)(c) fixed, in Python.
It's specialized for the 10,10-duoprism. It assumes that both rings can be augmented independently, and that adjacent augments are possible. I haven't considered the more general cases.
Instead of encoding the augments as 0,1,2, I encoded them as 0,1,2,3, keeping pyramids and magnabicupolic rings separate.
Also, I packaged the augmentation information for each ring into a single integer instead of an array.
I had fun doing everything with bitwise operations.
The reflections are done at the outer levels of iteration, and the rotations at the inner levels, because it's more expensive to reverse the bits in a number than to rotate them.
- Code: Select all
# Keep in mind the operator precedence:
# arithmetic operations (+ - * //) are evaluated first, then
# bit shifts (<< >>), then other bitwise operations (& | ^).
# no augment = 00, pyramid augment = 01,
# ortho augment = 10, gyro augment = 11 (binary)
all_bits = (1 << 2*10) - 1
even_bits = all_bits // 3
odd_bits = even_bits << 1
def pyramids(x):
return x & even_bits & ~(x & odd_bits)>>1
def rotate(x, num_places, total_places):
return x >> 2*num_places | (
(x & ((1<<2*num_places)-1)) << 2*(total_places - num_places))
def gyrate(x):
return (x & odd_bits) | ((x & even_bits) ^ (x & odd_bits)>>1)
def reverse(x, total_places):
y = 0
for i in range(total_places):
y |= (x>>2*i & 3) << 2*(total_places - 1 - i)
return y
count = 0
ring1 = 0
while ring1 < 1<<2*10:
ring2 = 0
while ring2 < 1<<2*10:
rings1and2 = ring1 << 2*10 | ring2
is_least = True
i = 0
while is_least and i < 2:
ring1_i = reverse(ring1, 10) if i else ring1
ring2_i = gyrate(ring2) if i else ring2
j = 0
while is_least and j < 2:
ring2_ij = reverse(ring2_i, 10) if j else ring2_i
ring1_ij = gyrate(ring1_i) if j else ring1_i
k = 0
while is_least and k < 10:
ring1_ijk = rotate(ring1_ij, k, 10)
ring2_ijk = gyrate(ring2_ij) if k & 1 else ring2_ij
l = 0
while is_least and l < 10:
ring2_ijkl = rotate(ring2_ijk, l, 10)
ring1_ijkl = gyrate(ring1_ijk) if l & 1 else ring1_ijk
new_rings1and2 = ring1_ijkl << 2*10 | ring2_ijkl
new_rings2and1 = ring2_ijkl << 2*10 | ring1_ijkl
is_least &= rings1and2 <= new_rings1and2
is_least &= rings1and2 <= new_rings2and1
l += 1
k += 1
j += 1
i += 1
count += is_least
ring2 += 1
ring2 += pyramids(ring2)
ring1 += 1
# Pyramid augments aren't allowed on the 10,10-duoprism; skip over these.
ring1 += pyramids(ring1)
print(count)
It took several hours for this to run. I guess it would be faster with a lower-level language.
4924629 is the final count of 10,10-duoprism augmentations. (It includes the un-augmented duoprism.) Compare this to my estimate: 3^20 / 800 =
4358481 (rounding up). They are fairly close!
quickfur wrote:mr_e_man wrote:Here's an implementation of your algorithm, with part (3)(c) fixed, in Python.
It's specialized for the 10,10-duoprism. It assumes that both rings can be augmented independently, and that adjacent augments are possible. I haven't considered the more general cases.
Instead of encoding the augments as 0,1,2, I encoded them as 0,1,2,3, keeping pyramids and magnabicupolic rings separate.
Wait, I thought the 10,10-duoprism only takes magnabicupolic rings as augments?
Also, I packaged the augmentation information for each ring into a single integer instead of an array.
I had fun doing everything with bitwise operations.
The reflections are done at the outer levels of iteration, and the rotations at the inner levels, because it's more expensive to reverse the bits in a number than to rotate them.
Are you natively compiling the Python code? 'cos if not, the difference between between reversing bits and rotating them would probably be unnoticeable.
I'll have to look more carefully into your code later, busy right now. All those bit operations are hard to read. I would've preferred a more straightforward, obvious implementation for a first stab, which would be easier to verify, and only if necessary, a more optimized implementation afterwards.
mr_e_man wrote:(c) Reverse the order of elements in the array (corresponding to a reflection).
That's definitely a problem!
A reflection can effectively gyrate the augments.
Sorry, I didn't describe it accurately enough. A reversal is done to both rings simultaneously, since reversing one ring without reversing the other may create a non-isomorphic augmentation. Reversing both produces the mirror image of the polytope.
Reversing both gives a 180° rotation, not a reflection.
In the vertex figure, the axis of rotation passes through the two 144° edges of the tetrahedron.
Users browsing this forum: No registered users and 1 guest