Solving Standard and Non-Standard Rubik’s Cubes using Group Theory
This project implements Rubik’s Cube models and solving algorithms in GAP using permutation group theory.
The project includes:
- A 3×3 cube representation and solver based on Thistlethwaite’s algorithm
- Reduction methods for 4×4 and 5×5 cubes
- Cube state manipulation through permutation generators
- Validation and reduction utilities
Requirements:
- GAP 4.15 or later
- Standard GAP libraries
Files:
- Models/n3RubiksCube.g 3x3 cube model and generators
- Models/n4RubiksCube.g 4x4 cube model and generators
- Models/n5RubiksCube.g 5x5 cube model and generators
- Models/MegaminxCube.g Megaminx model and generators
- Models/PyraminxCube.g Pryaminx model and generators
- Reduction/CollapseCube4.g 4x4 → 3x3 reduction
- Reduction/CollapseCube5.g 5x5 → 3x3 reduction
- Thistlethwaite/Thistlethwaiten3.g 3x3 solver implementation
- Thistlethwaite/Thistlethwaiten4.g 4x4 solver implementation
- Thistlethwaite/Thistlethwaiten5.g 5x5 solver implementation
- Thistlethwaite/TSolven3.g Driver script for solving 3x3 cubes
- Thistlethwaite/SolveReducedn4.g Driver script for solving reduced 4x4 cubes
- Thistlethwaite/SolveReducedn5.g Driver script for solving reduced 5x5 cubes
- Subgroups/SubgroupSolven3.g 3x3 subgroup-based solver
- Subgroups/SubgroupSolven4.g 4x4 subgroup-based solver
File locations must be changed in:
- all test*.g validation scripts
- CollapseCuben*.g (4 & 5) reduction scripts
- SolveReducedn*.g (4 & 5) and TSolven3.g solution drivers
- Thistlethwaiten*.g (4 & 5) solution scripts
- SubgroupSolven*.g (3 & 4) solution scripts
Known Limitations:
- Certain reduction states may produce invalid 3×3 configurations due to parity inconsistencies
- The reduction process does not fully resolve all even-cube parity cases
- Solver performance decreases significantly for deeper scrambles
Aditional commands for puzzle model manipluation: 3x3
- Cube3.DoTurn(Cube3.*, **); Applies a turn *(F,B,L,R,U,D) **(-1,1,2)
- Cube3.Rot*(); Applies a rotation *(X,Y,Z)
- Cube3.Do*(); Applies a middle slice turn *(M,E,S)
- Cube3.ResetCube(); Resets cube to identity state
- Print(Cube3.Cube); Prints permutation list
- Print(Cube3.GetLayout()); Prints cube layout as list
- Print(Size(Cube3.G)); Prints group size
4x4
- Cube4.DoTurn(Cube4.*, **); Applies a turn *(F,B,L,R,U,D,f,b,l,r,u,d,Ff,Bb,Ll,Rr,Uu,Dd) **(-1,1,2)
- Cube4.Rot*(); Applies a rotation *(X,Y,Z)
- Cube4.ResetCube(); Resets cube to identity state
- Print(Cube4.Cube); Prints permutation list
- Print(Cube4.GetLayout()); Prints cube layout as list
- Print(Size(Cube4.G)); Prints group size
5x5
- Cube5.DoTurn(Cube5.*, **); Applies a turn *(F,B,L,R,U,D,f,b,l,r,u,d,Ff,Bb,Ll,Rr,Uu,Dd) **(-1,1,2)
- Cube5.Rot*(); Applies a rotation *(X,Y,Z)
- Cube5.Do*(); Applies a middle slice *(M,E,S)
- Cube5.ResetCube(); Resets cube to identity state
- Print(Cube5.Cube); Prints permutation list
- Print(Cube5.GetLayout()); Prints cube layout as list
- Print(Size(Cube5.G)); Prints group size
Pyraminx
- CubeP.DoTurn(Cube3.*, **); Applies a turn *(A,B,C,D,a,b,c,d) **(-1,1)
- CubeP.ResetCube(); Resets cube to identity state
- Print(CubeP.Cube); Prints permutation list
- Print(CubeP.GetLayout()); Prints cube layout as list
- Print(Size(CubeP.G)); Prints group size
Megaminx
- CubeM.DoTurn(Cube3.*, **); Applies a turn *(Af,Bf,Cf,Df,Ef,Ff,Gf,Hf,If,Jf,Kf,Lf) **(-1,1)
- Print(CubeM.Cube); Prints permutation list
- Print(CubeM.GetLayout()); Prints cube layout as list
- CubeM.ResetCube(); Resets cube to identity state
- Print(Size(CubeM.G)); Prints group size