白冥 发表于 2025-2-26 19:02:40

【Python】【原创】魔方群置换与生成元

本帖最后由 白冥 于 2025-2-26 19:58 编辑


目录      

[*]概述
[*]核心功能
[*]类结构与方法
[*]Cube 类(小立方体类)
[*]MagicCube 类(魔方类)
[*]原理
[*]算法复杂度
[*]使用示例



概述      

      本帖实现了一个3x3魔方的抽象模型,通过面向对象的方式模拟魔方的立方体块(Cube)和整体结构(MagicCube)。核心目标是为魔方状态跟踪、旋转操作及算法研究提供基础框架。本帖代码均由本人写就。


核心功能      

[*]支持六种基础面旋转(U/F/R/L/B/D)
[*]自动维护立方体块的邻接关系
[*]实时跟踪各块的面归属状态
[*]提供可扩展的置换规则接口


类结构与方法      
      Cube 类
            ├ __init__ 构造方法
            ├ _set_group 私有方法
            ├ binding 方法
            ├ get_group 方法
            ├ observe 方法
            └ group_permutation 方法
      MagicCube 类
            ├ __init__ 构造方法
            ├ _build_cube 私有方法
            ├ get_magic_cube 方法
            ├ face 方法
            ├ _group_permutation 私有方法
            ├ U 方法
            ├ F 方法
            ├ R 方法
            ├ L 方法
            ├ B 方法
            └ D 方法


Cube 类(小立方体类)      
      表示单个立方体块,负责维护自身状态和相邻块关系。
class Cube:
    def __init__(self, x: int, y: int, z: int):
      if not (-1 <= x <= 1 and -1 <= y <=1 and -1 <= z <= 1):
            raise ValueError("超出范围")
      self._group = self._set_group(x,y,z)
      self._permutation_matrix = [
            ,
            ,
            ,
            ,
            ,
            
      ]
      self._bind=None
      self._cube_group=None
    def _set_group(self,x,y,z):
      faces =
      return [(idx if faces else None) for idx in range(6)]
    def binding(self, bind):
      if self._bind is not None:
            raise ValueError("重复操作")
      self._bind=bind
    def get_group(self):
      return self._group
    def observe(self, permutation):
      next = self._bind
      group = next.get_group()
      self._cube_group = group[:]
    def group_permutation(self, permutation):
      pg = self._permutation_matrix
      self._group = for next in pg]
      关键方法:
      binding(self, bind):
      功能:绑定扭转面的块
      observe(self, permutation):
      功能:根据生成元信息获取绑定块的属性
      group_permutation(self, permutation):
      功能:群置换
MagicCube 类(魔方类)      
      
class MagicCube:
    def __init__(self):
      self._cube = self._build_cube()
    def _build_cube(self):
      cubes = {(x, y, z): Cube(x, y, z) for x in [-1, 0, 1] for y in [-1, 0, 1] for z in [-1, 0, 1]}
      for crood, cube in cubes.items():
            x, y, z = crood
            bind = , cubes[(1,-z,y)], cubes[(z,1,-x)], cubes[(-z,-1,x)], cubes[(-1,z,-y)], cubes[(y,-x,-1)]]
            cube.binding(bind)
    def get_magic_cube(self):
      return self._cube
    def face(self, permutation):
      cubes = []
      for crood, cube in self._cube.items():
            x, y, z = crood
            faces =
            if faces:
                cubes.append(cube)
      return cubes
   
    def _group_permutation(self, permutation):
      cubes = self.face(permutation)
      for cube in cubes:
            cube.observe(permutation)
      for cube in cubes:
            cube.group_permutation(permutation)
   
    def U(self):
      self._group_permutation(0)
    def F(self):
      self._group_permutation(1)
    def R(self):
      self._group_permutation(2)
    def L(self):
      self._group_permutation(3)
    def B(self):
      self._group_permutation(4)
    def D(self):
      self._group_permutation(5)

      关键方法:
      _group_permutation(self, permutation):
      功能:
            1、收集目标面所有块
            2、通知每个块使用的生成元
            3、群置换
      U/F/R/L/B/D(self):
      功能:扭转上/前/右/左/后/下面,充当魔方置换循环群的生成元


原理      
      根据笛卡尔坐标系的旋转变换,绑定变换与扭转变换反向,以块(1,1,-1)的F操作为例:
      原始坐标:(x=1, y=1, z=-1)
      F旋转(绕X轴顺时针转90°)后的新坐标:(1,1,-1) → (1,1,1)
      则(1,1,1)块继承(1,1,-1)块的状态


算法复杂度      
      时间复杂度:每次面扭转后仅影响4个边块和4个角块,总体时间复杂度为O(1)
      空间复杂度:存储27个Cube对象,每个包含6个绑定,总内存消耗约27*6=162个整型索引


使用示例      
      
if __name__=="__main__":
    magic_cube = MagicCube()
    cubes = magic_cube.get_magic_cube()
   
    # U操作
    print(cubes[(1,1,1)].get_group())
      ###输出:
      #
      # 上:上,前:前,右:右
    magic_cube.U()
    print(cubes[(1,1,1)].get_group())
      ###输出:
      #
      # 上:上,前:右,右:后
   
    # 组合操作(FRU操作)
    magic_cube.F().R().U()
    print(cubes[(1,1,1)].get_group())
      ###输出:
      #
      # 上:右,前:上,右:前
   
    # U'操作
    magic_cube.U().U().U()
    print(cubes[(1,1,1)].get_group())
      ###输出:
      #
      # 上:右,前:后,右:上
   



百变小阴 发表于 2025-2-26 19:25:43

不明觉厉帮忙点追随了
说实话我完全没看懂这代码是什么...反正应该不是我知道的那个魔方就是了{:6_175:}

娱乐法师火布偶 发表于 2025-2-26 19:57:37

离散数学学习群论的时候就不太懂

ddbGameMale 发表于 2025-2-26 19:59:38

感觉像是在做题,莫名的既视感。;P

遥接秦霞 发表于 2025-2-26 20:11:15

我的妈大佬啊,本可学的软件工程,写的孱弱代码上不了台面,算法也蒟蒻{:4_100:},我们离散数学学得也很浅,完全想不到这个关于魔方解和群论的关联,而且时间复杂度居然是O1,自己玩魔方都是套公式,难怪世界级的魔方竞赛可以那么快

随心110 发表于 2025-2-26 21:22:35

这素什么?不明觉厉。感觉是用软件内的魔方模型的代码?很有才华惹~赞赞~~~

i2205909 发表于 2025-2-26 22:28:26

WOC无敌。才发现这李居然还有代码模块:funk:

zibatco2 发表于 2025-2-26 22:51:23

实在素有点深奥完全看不懂, 但这个是可以延伸应用在哪方面嘛....{:4_109:}

锦书致南辞 发表于 2025-2-26 23:03:43

有点阅读门槛惹,看起来好专业,不明觉厉

zzz171962736 发表于 2025-2-26 23:38:11

看着感觉很厉害的样子本程序员没看懂

万俟 发表于 2025-2-27 15:11:59

这个感觉快到我的领域了,楼主用这个计算什么吗?比如正规子群或者不可约表示?

找乐子企鹅仔 发表于 2025-2-28 11:15:19

偶尔拧魔方的咱自信满满点进来,看到代码留下追随屁滚尿流抬出去இ௰இ

zhuovboyan 发表于 2025-3-6 05:24:39

QAQ 看到熟悉的楼主 就知道今天又是头很痒的一天了jpg 晕头转向jpg

2302594 发表于 2025-3-7 06:33:57

头好痒,感觉要长脑子了.jpg

rayyyyy 发表于 2025-6-22 13:58:53

刚好最近又在自学python,可惜目前只上手了蒙特马利算法,LZ的还看不懂
页: [1]
查看完整版本: 【Python】【原创】魔方群置换与生成元