GAP: Rubik's Cube


Vollständiges Beispiel ist im GAP Manual.

Numerierung der Seiten:

                     +--------------+
                     |  1    2    3 |
                     |  4  top    5 |
                     |  6    7    8 |
      +--------------+--------------+--------------+--------------+
      |  9   10   11 | 17   18   19 | 25   26   27 | 33   34   35 |
      | 12  left  13 | 20 front  21 | 28 right  29 | 36  rear  37 |
      | 14   15   16 | 22   23   24 | 30   31   32 | 38   39   40 |
      +--------------+--------------+--------------+--------------+
                     | 41   42   43 |
                     | 44 bottom 45 |
                     | 46   47   48 |
                     +--------------+
Die Drehungen der Seiten um die feststehenden mittleren Punkte generieren die Gruppe.
  gap> cube := Group(
  >   ( 1, 3, 8, 6)( 2, 5, 7, 4)( 9,33,25,17)(10,34,26,18)(11,35,27,19),
  >   ( 9,11,16,14)(10,13,15,12)( 1,17,41,40)( 4,20,44,37)( 6,22,46,35),
  >   (17,19,24,22)(18,21,23,20)( 6,25,43,16)( 7,28,42,13)( 8,30,41,11),
  >   (25,27,32,30)(26,29,31,28)( 3,38,43,19)( 5,36,45,21)( 8,33,48,24),
  >   (33,35,40,38)(34,37,39,36)( 3, 9,46,32)( 2,12,47,29)( 1,14,48,27),
  >   (41,43,48,46)(42,45,47,44)(14,22,30,38)(15,23,31,39)(16,24,32,40)
  > );
Bestimmung der Anzahl der Elemente und Faktorisierung.
  gap> Size( cube );
  43252003274489856000
  gap> Collected( Factors( last ) );
  [ [ 2, 27 ], [ 3, 14 ], [ 5, 3 ], [ 7, 2 ], [ 11, 1 ] ]
D.h. #cube = 2^27 3^14 5^3 7^2 11.

Operation der Gruppe auf den 48 Punkten.

  gap> orbits := Orbits( cube, [1..48] );
  [ [ 1, 3, 17, 14, 8, 38, 9, 41, 19, 48, 22, 6, 30, 33, 43, 11, 46,
        40, 24, 27, 25, 35, 16, 32 ],
    [ 2, 5, 12, 7, 36, 10, 47, 4, 28, 45, 34, 13, 29, 44, 20, 42,
        26, 21, 37, 15, 31, 18, 23, 39 ] ]
Es gibt zwei Orbits: Ecken und Kanten.

Beschränkung der Untersuchung auf die Operation auf den Ecken.

  gap> cube_e := Operation( cube, orbits[1] );
  Group( ( 1, 2, 5,12)( 3, 7,14,21)( 9,16,22,20),
         ( 1, 3, 8,18)( 4, 7,16,23)(11,17,22,12),
         ( 3, 9,19,11)( 5,13, 8,16)(12,21,15,23),
         ( 2, 6,15, 9)( 5,14,10,19)(13,21,20,24),
         ( 1, 4,10,20)( 2, 7,17,24)( 6,14,22,18),
         ( 4,11,13, 6)( 8,15,10,17)(18,23,19,24) )

  gap> Size( cube_e );
  88179840
Die Gruppe operiert dann auf der Menge [1..24], nicht auf der Ausgangmenge [1,3,17,14,8,38,9,41,19,48,22, 6,30,33,43,11,46,40,24,27,25,35,16,32]. [1,2, 3, 4,5, 6,7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]
                     +--------------+
                     |  1         2 |
                     |     top      |
                     | 12         5 |
      +--------------+--------------+--------------+--------------+
      |  7        16 |  3         9 | 21        20 | 14        22 |
      |     left     |    front     |    right     |     rear     |
      |  4        23 | 11        19 | 13        24 |  6        18 |
      +--------------+--------------+--------------+--------------+
                     |  8        15 |
                     |    bottom    |
                     | 17        10 |
                     +--------------+
Entsprechend der Konstruktion operiert cube_e transitiv auf [1..24], also können wir untersuchen ob cube_e primitiv ist.
  gap> ecken := Blocks( cube_e, [1..24] );
  [ [ 1, 7, 22 ], [ 2, 14, 20 ], [ 3, 12, 16 ], [ 4, 17, 18 ],
    [ 5, 9, 21 ], [ 6, 10, 24 ], [ 8, 11, 23 ], [ 13, 15, 19 ] ]
D.h. cube_e ist nicht primitiv, da es ein nicht triviales Blocksystem von [1..24] gibt.

Die Blöcke entsprechen den 8 Ecken des Wüfels.
Die Ecken werden untereinander permutiert und innnerhalb einer Ecke werden die Punke zyklisch vertauscht.

  gap> Orbits( cube_e, ecken, OnTuples );
  [ [ [ 1, 7, 22 ], [ 2, 14, 20 ], [ 3, 16, 12 ], [ 4, 17, 18 ], [ 5, 21, 9 ],
      [ 6, 10, 24 ], [ 7, 22, 1 ], [ 8, 23, 11 ], [ 9, 5, 21 ],
      [ 10, 24, 6 ], [ 11, 8, 23 ], [ 12, 3, 16 ], [ 13, 15, 19 ],
      [ 14, 20, 2 ], [ 15, 19, 13 ], [ 16, 12, 3 ], [ 17, 18, 4 ],
      [ 18, 4, 17 ], [ 19, 13, 15 ], [ 20, 2, 14 ], [ 21, 9, 5 ],
      [ 22, 1, 7 ], [ 23, 11, 8 ], [ 24, 6, 10 ] ],
  [ [ 3, 12, 16 ], [ 7, 1, 22 ], [ 8, 11, 23 ], [ 9, 21, 5 ], [ 14, 2, 20 ],
      [ 16, 3, 12 ], [ 17, 4, 18 ], [ 18, 17, 4 ], [ 15, 13, 19 ],
      [ 19, 15, 13 ], [ 2, 20, 14 ], [ 21, 5, 9 ], [ 10, 6, 24 ],
      [ 22, 7, 1 ], [ 23, 8, 11 ], [ 5, 9, 21 ], [ 24, 10, 6 ], [ 1, 22, 7 ],
      [ 6, 24, 10 ], [ 11, 23, 8 ], [ 20, 14, 2 ], [ 12, 16, 3 ],
      [ 4, 18, 17 ], [ 13, 19, 15 ] ] ]

Ecken

Also untersuchen wir die Operation der Gruppe cube_e auf den Ecken.
  gap> cube_eb := Operation( cube_e, ecken, OnSets );
  Group( (1,2,5,3), (1,3,7,4), (3,5,8,7),
         (2,6,8,5), (1,4,6,2), (4,7,8,6) )

  gap> Size( cube_eb );
       40320
Eine Permutationsgruppe vom Grad 8, die die Ordnung 40320 = 8 ! hat, muss mit der Symmetrischen Gruppe S(8) übereinstimmen. D.h. cube_eb = S(8). Untersuchung des Kerns des Homomorphismus cube_e ---> cube_eb:
  gap> blockhom1:=OperationHomomorphism(cube_e, cube_eb);
  OperationHomomorphism( Group( ( 1, 2, 5,12)( 3, 7,14,21)( 9,16,22,20),
  ( 1, 3, 8,18)( 4, 7,16,23)(11,17,22,12), ( 3, 9,19,11)( 5,13, 8,16)
  (12,21,15,23), ( 2, 6,15, 9)( 5,14,10,19)(13,21,20,24), ( 1, 4,10,20)
  ( 2, 7,17,24)( 6,14,22,18), ( 4,11,13, 6)( 8,15,10,17)(18,23,19,24) ), 
  Group( (1,2,5,3), (1,3,7,4), (3,5,8,7), (2,6,8,5), (1,4,6,2), (4,7,8,6) ) )

  gap> k:=Kernel(blockhom1);
  Subgroup( Group( ( 1, 2, 5,12)( 3, 7,14,21)( 9,16,22,20), ( 1, 3, 8,18)
  ( 4, 7,16,23)(11,17,22,12), ( 3, 9,19,11)( 5,13, 8,16)(12,21,15,23),
  ( 2, 6,15, 9)( 5,14,10,19)(13,21,20,24), ( 1, 4,10,20)( 2, 7,17,24)
  ( 6,14,22,18), ( 4,11,13, 6)( 8,15,10,17)(18,23,19,24) ),
    [ ( 1,22, 7)(13,15,19), ( 1, 7,22)( 2,14,20)(13,15,19),
      ( 2,14,20)( 3,16,12)(13,15,19), ( 1, 7,22)( 2,20,14)( 3,16,12)( 4,18,17),
      ( 5, 9,21)(13,15,19), ( 1, 7,22)( 2,14,20)( 6,24,10)(13,19,15),
      ( 8,11,23)(13,15,19) ] )

  gap> Size(k);
       2187
  gap> Factors(Size(k));
       [ 3, 3, 3, 3, 3, 3, 3 ]
  gap> IsElementaryAbelian(k);
       true
D.h. die Untergruppe k von cube_e ist elementar abelsch der Ordnung 3^7.

Ist das semidirekte Produkt k * cube_eb = cube_e ?

  gap> cm:=Stabilizer( cube_e, [1,2,3,4,,5,6,8,13], OnSets);
  Subgroup( Group( ( 1, 2, 5,12)( 3, 7,14,21)( 9,16,22,20), ( 1, 3, 8,18)
  ( 4, 7,16,23)(11,17,22,12), ( 3, 9,19,11)( 5,13, 8,16)(12,21,15,23),
  ( 2, 6,15, 9)( 5,14,10,19)(13,21,20,24), ( 1, 4,10,20)( 2, 7,17,24)
  ( 6,14,22,18), ( 4,11,13, 6)( 8,15,10,17)(18,23,19,24) ),
  [ ( 8,13)(11,19)(15,23), ( 6, 8)(10,23)(11,24), ( 5, 6)( 9,24)(10,21),
    ( 4, 5)( 9,18)(17,21), ( 3, 4)(12,18)(16,17), ( 2, 3)(12,20)(14,16),
    ( 1, 2)( 7,14)(20,22) ] )

  gap> Size( cm );
  40320

  gap> is:=Intersection( cm, k );
  Subgroup( Group( ( 1, 2, 5,12)( 3, 7,14,21)( 9,16,22,20), ( 1, 3, 8,18)
  ( 4, 7,16,23)(11,17,22,12), ( 3, 9,19,11)( 5,13, 8,16)(12,21,15,23),
  ( 2, 6,15, 9)( 5,14,10,19)(13,21,20,24), ( 1, 4,10,20)( 2, 7,17,24)
  ( 6,14,22,18), ( 4,11,13, 6)( 8,15,10,17)(18,23,19,24) ), [  ] )

  gap> Size( is );
       1

  gap> Closure( cm, k ) = cube_e;
       true
Bem: cube_e ist eine Untergruppe vom Index 3 im WreathProdukt k * cube_eb.
Wenn eine Ecke im Uhrzeigersinn gedreht wird, wird eine andere Ecke gegen den Uhrzeigersinn gedreht.

Kanten

Für die Kanten findet man ein ähnliches Resultat
     cube_k = SemidirektProdukt 2^11 * S(12)
Bem: cube_k ist eine Untergruppe vom Index 2 im WreathProdukt 2^11 * cube_kb. Auch hier sind die Permutationen nicht unabhängig. Wenn eine Kante gedreht wird, dreht sich eine andere mit.

Zusammen

Schliesslich findet man, dass
     cube = SubdirektProdukt cube_k * cube_e
Bem: cube ist eine Untergruppe vom Index 2 im DirektProdukt cube_e * cube_k. Auch hier findet man, dass die Permutationen der Kanten und der Ecken nicht unabhängig von einander sind. Wird ein Paar Ecken vertauscht, vertauschen sich auch 2 Kanten.

cube
cube_ecken cube_kanten
3^7 S(8) 2^11 S(12)


[Previous] [Next] [Contents]