自习课玩魔方发现的一个问题
- 内容介绍
- 文章标签
- 相关推荐
因为刚月考完 实属无聊 想到一个问题 计算 魔方从初始状态开始 F R B’ L’一直循环 回到初始状态 要多少步
由于gpt和claude算出来都是420 于是我们就开始了实践,一共进行了三次都没成功复现
--【壹】--:
这里说的是循环打块,在有限次步骤后回到初始状态
--【贰】--:
魔方本质不就是群论吗 20步之内就可以还原 这叫上帝之数 以前三阶魔方能干15秒 现在已经不会了 只剩下肌肉记忆了xD
--【叁】--:
我们自习课闲的淡疼 两个人盯着一个人操作试了三次都没有成功 奇怪了 但是计算结果都是420次
--【肆】--: 无水硫酸铜:
计算 魔方从初始状态开始 F R B’ L’一直循环 回到初始状态 要多少步
Gemini也说420
image1198×1308 180 KB
--【伍】--:
玩了好多年魔方 现在只剩下肌肉记忆了 CFOP公式字母都快忘完了
--【陆】--:
写Mathematica Wolfram代码来算
(* 1. 定义魔方的54个色块 *)
(* 每个色块由其所在小滑块的坐标 (x,y,z) 和所在面的向外法向量构成 *)
cubies = Tuples[{-1, 0, 1}, 3];
normals = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
initialStickers = Flatten[
Table[If[c . n == 1, {c, n}, Nothing], {c, cubies}, {n, normals}],
1
];
(* 2. 定义单步旋转函数 *)
(* 根据右手定则,沿向外的法向量旋转 -Pi/2 对应从外部观察的顺时针旋转 *)
(* dir = 1 为顺时针,dir = -1 为逆时针 *)
applyMove[stickers_, axis_, dir_] := Module[
{mat = RotationMatrix[-dir * Pi/2, axis]},
Map[
If[#[[1]] . axis == 1,
{mat . #[[1]], mat . #[[2]]}, (* 旋转处于该面上的色块及其法向量 *)
#
] &,
stickers
]
];
(* 3. 定义一次完整的 F R B' L' 复合动作 *)
(* F: +z轴面顺时针; R: +x轴面顺时针; B': -z轴面逆时针; L': -x轴面逆时针 *)
compositeSequence[stickers_] := Fold[
applyMove[#1, #2[[1]], #2[[2]]] &,
stickers,
{
{{0, 0, 1}, 1}, (* F *)
{{1, 0, 0}, 1}, (* R *)
{{0, 0, -1}, -1}, (* B' *)
{{-1, 0, 0}, -1} (* L' *)
}
];
(* 4. 获得执行一次复合动作后的魔方状态 *)
nextStickers = compositeSequence[initialStickers];
(* 5. 寻找初始状态到新状态的置换群映射,并计算其阶数(即循环周期) *)
perm = FindPermutation[initialStickers, nextStickers];
Print[PermutationOrder[perm]]
结果确实是105×4=420
因为刚月考完 实属无聊 想到一个问题 计算 魔方从初始状态开始 F R B’ L’一直循环 回到初始状态 要多少步
由于gpt和claude算出来都是420 于是我们就开始了实践,一共进行了三次都没成功复现
--【壹】--:
这里说的是循环打块,在有限次步骤后回到初始状态
--【贰】--:
魔方本质不就是群论吗 20步之内就可以还原 这叫上帝之数 以前三阶魔方能干15秒 现在已经不会了 只剩下肌肉记忆了xD
--【叁】--:
我们自习课闲的淡疼 两个人盯着一个人操作试了三次都没有成功 奇怪了 但是计算结果都是420次
--【肆】--: 无水硫酸铜:
计算 魔方从初始状态开始 F R B’ L’一直循环 回到初始状态 要多少步
Gemini也说420
image1198×1308 180 KB
--【伍】--:
玩了好多年魔方 现在只剩下肌肉记忆了 CFOP公式字母都快忘完了
--【陆】--:
写Mathematica Wolfram代码来算
(* 1. 定义魔方的54个色块 *)
(* 每个色块由其所在小滑块的坐标 (x,y,z) 和所在面的向外法向量构成 *)
cubies = Tuples[{-1, 0, 1}, 3];
normals = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
initialStickers = Flatten[
Table[If[c . n == 1, {c, n}, Nothing], {c, cubies}, {n, normals}],
1
];
(* 2. 定义单步旋转函数 *)
(* 根据右手定则,沿向外的法向量旋转 -Pi/2 对应从外部观察的顺时针旋转 *)
(* dir = 1 为顺时针,dir = -1 为逆时针 *)
applyMove[stickers_, axis_, dir_] := Module[
{mat = RotationMatrix[-dir * Pi/2, axis]},
Map[
If[#[[1]] . axis == 1,
{mat . #[[1]], mat . #[[2]]}, (* 旋转处于该面上的色块及其法向量 *)
#
] &,
stickers
]
];
(* 3. 定义一次完整的 F R B' L' 复合动作 *)
(* F: +z轴面顺时针; R: +x轴面顺时针; B': -z轴面逆时针; L': -x轴面逆时针 *)
compositeSequence[stickers_] := Fold[
applyMove[#1, #2[[1]], #2[[2]]] &,
stickers,
{
{{0, 0, 1}, 1}, (* F *)
{{1, 0, 0}, 1}, (* R *)
{{0, 0, -1}, -1}, (* B' *)
{{-1, 0, 0}, -1} (* L' *)
}
];
(* 4. 获得执行一次复合动作后的魔方状态 *)
nextStickers = compositeSequence[initialStickers];
(* 5. 寻找初始状态到新状态的置换群映射,并计算其阶数(即循环周期) *)
perm = FindPermutation[initialStickers, nextStickers];
Print[PermutationOrder[perm]]
结果确实是105×4=420

