魔方有多少样(魔方这么多)
魔方有多少样(魔方这么多)
2024-06-27 06:19:17  作者:断了的情歌  网址:https://m.xinb2b.cn/know/tfe371708.html

作者 | 刘洋洲

来源 | 转自知乎专栏《万物皆数也》,“数学英才”获授权转载,在此感谢!

儿童节刚刚过去,本期文章我们谈谈童年回(噩)忆(梦)中的魔方。

也许这是一个略显愚蠢的问题:为什么一个完好的魔方总是可以恢复原样?这其实是一个既简单又深刻的问题。

答:魔方的每个状态都是由初始状态通过一系列有限的操作所得到的,这些操作包括(顺时针旋转上层四分之一周)、(顺时针旋转前层四分之一周)、(顺时针旋转右层四分之一周)……那我们只需要“原路返回”,不就可以回到起点了吗?

魔方有多少样(魔方这么多)(1)

魔方有多少样(魔方这么多)(2)

例如我们对魔方进行操作:,那么我们只需要再进行如下操作即可:

其中表示的反向操作,即「逆时针」旋转前层四分之一周,其余符号同理。不过按照魔方术语,往往用其小写字母表示,即。

在群论中,称为的「逆」,因为他们的复合的结果是「单位元」,即魔方会回到初始状况:

群的复合运算满足「结合律」,容易给出上面等式成立的证明:

一个代数系统如果满足三条性质,则称为群:

存在单位元;

存在逆元;

满足结合律。

可见魔方确实是一个实实在在的「有限群(Finite group)」

为什么说它有限呢?因为它是「置换群(Permutation group)」「子群(Subgroup)」,置换群是有限群,而它的子群是由其元素的子集构成的更小的群,所以其子群也一定是有限群。

所谓置换群,用魔方来讲就是:魔方的所有状态构成一个有限集合。状态与状态之间的转移,就是群的元素。一个的魔方有6个面,每个面又分为9个小的块面,于是一共有54个小的块面。这些小的块面的颜色共同构成魔方的当前状态,如果这54个块面可以随意互换位置,那么构成的群我们记为。然而魔方由于其特殊的内部构造,使得这种随意性是不可能发生的,真实的情况则是的一个子群,我们称为「魔方群(Rubik' Cube group)」

这个群的实际状态数已被数学家给出,它是一个巨大的数字:

大约是现在地球人口数目的平方。

有限,但太巨大了。所以回答是否存在魔方还原策略还远远不够,我们更关心的是,能否快速还原魔方?或者我们更进一步:还原一个魔方至多需要几步?

答:20步!

这个结果被称之为上帝之数。与平面图的四色定理(给不含有飞地的地图着色,使得邻国颜色不同,只需要四种颜色就够了)的证明类似,同样是通过计算机暴力证明。

这么多,那么少!

这意味着什么呢?说明魔方的各个状态高度关联,所有的状态统统被压缩在直径为20的高维球体内。

魔方有多少样(魔方这么多)(3)

通常购买魔方都会附有说明书,上面介绍的是还原魔方的公式。在套用这些公式时,我们似乎并不需要关注每个面块的状态,往往“糊里糊涂”地还原了魔方,知其然不知其所以然。而且还原的步数往往超过20步,这意味着这些公式有些“绕远路”。

我们如何理解魔方的还原公式呢?

我们可以将魔方群以图论的方式表示:每个状态记为一个节点,如果存在一个变换,可以从此状态得到彼状态,那么这两个节点必有一条边相连接,于是我们得到一个关于魔方状态的网络。在这个网络中,寻找最优路线对于新手而言是不切实际的,而还原公式帮助我们进入特定的轨道中,这个轨道就像是时钟表盘,而轨道上各个状态正如表盘上的刻度,而魔方的初始状态就是这个表盘上的12点,只要我们按照顺(逆)时针走,就一定会经过我们的目标。

魔方有多少样(魔方这么多)(4)

魔方群中这种类似于表盘结构的子群,我们称之为「循环群(Cyclic group)」,并且是有限循环群。

而魔方还原公式本身的结构也非常耐人寻味,例如

在群论中我们称之为的「共轭(Conjugate)」。在还原魔方的时候,我们往往会遇到这样的窘境:我们想让和交换,然而两者直接交换会影响到,然而我们并不想让发生改变……这个时候我们就利用和去消弭掉所带来的影响。与共轭的原理类似,我们还会用到「交换子(Commutator)」,形如。前文我们在定义群的时候,只提及了结合律而没有提及交换律,这是因为有大量的群是非交换的,例如矩阵群。交换群是没有所谓交换子的,这是因为

在某种意义上,交换子群(由交换子生成的群)提供了群的可交换程度。一个群内可交换的元素越多,交换子就越少,交换子群也就越小。

关于魔方的具体内容请读者参考《Group Theory via Rubik's Cube》(链接:http://geometer.org/rubik/group.pdf)。另外提供一个在线魔方的程序(链接:https://iamthecu.be),非常精美有趣。

R语言程序

下面是我写的2阶魔方的平面展开图,给定操作自动演算出结果。

魔方有多少样(魔方这么多)(5)

代码说明:

代码中两个变换的乘法表示先执行再执行,这虽然与映射复合的乘法规则相反,但是符合我们从左往右的阅读习惯。

最后一行代码

倒数第三行(括号不算)的代码,我为了做演示视频,有意设置了延迟效果。如果网友想要快速得到结果,可以删掉这行代码。

####2阶魔方#矩阵中心对称o <- function(A){t = A[1,1]A[1,1] = A[2,2]A[2,2] = tt = A[1,2]A[1,2] = A[2,1]A[2,1] = tA}#矩阵元素逆时针旋转r <- function(A){t = A[1,1]A[1,1] = A[1,2]A[1,2] = A[2,2]A[2,2] = A[2,1]A[2,1] = tA}#矩阵元素顺时针旋转v <- function(A){t = A[1,1]A[1,1] = A[2,1]A[2,1] = A[2,2]A[2,2] = A[1,2]A[1,2] = tA}#魔方的六个面A = matrix(rep(1,4),2)B = matrix(rep(2,4),2)C = matrix(rep(3,4),2)a = matrix(rep(4,4),2)b = matrix(rep(5,4),2)c = matrix(rep(6,4),2)#A为俯视图,B为正视图,C为右侧视图,X=A,B,C;结果为矩阵形式,方便绘图。Xup <- function(A,a,B,b,C,c){Aup = matrix(rep(0,48),6)Aup[3:4,5:6] = AAup[3:4,1:2] = aAup[1:2,5:6] = BAup[5:6,5:6] = bAup[3:4,3:4] = CAup[3:4,7:8] = cAup}cube = list(A,a,B,b,C,c)cube[[7]] = Xup(A,a,B,b,C,c)#B朝上的十字架展开图(A --> B),输入输出皆为列表ABup <- function(Aup){Bup = listBup[[1]] = Aup[[1]]Bup[[2]] = o(Aup[[2]])Bup[[3]] = Aup[[3]]Bup[[4]] = o(Aup[[4]])Bup[[5]] = v(Aup[[5]])Bup[[6]] = r(Aup[[6]])Bup[[7]] = Xup(Bup[[3]],Bup[[4]],Bup[[2]],Bup[[1]],Bup[[5]],Bup[[6]])Bup}#(B --> A)BAup <- function(Bup){Aup = listAup[[1]] = Bup[[1]]Aup[[2]] = o(Bup[[2]])Aup[[3]] = Bup[[3]]Aup[[4]] = o(Bup[[4]])Aup[[5]] = r(Bup[[5]])Aup[[6]] = v(Bup[[6]])Aup[[7]] = Xup(Aup[[1]],Aup[[2]],Aup[[3]],Aup[[4]],Aup[[5]],Aup[[6]])Aup}#C朝上的十字架展开图(A --> C)ACup <- function(Aup){Cup = listCup[[1]] = Aup[[1]]Cup[[2]] = Aup[[2]]Cup[[3]] = r(Aup[[3]])Cup[[4]] = v(Aup[[4]])Cup[[5]] = Aup[[5]]Cup[[6]] = Aup[[6]]Cup[[7]] = Xup(Cup[[5]],Cup[[6]],Cup[[3]],Cup[[4]],Cup[[2]],Cup[[1]])Cup}#(C --> A)CAup <- function(Cup){Aup = listAup[[1]] = Cup[[1]]Aup[[2]] = Cup[[2]]Aup[[3]] = v(Cup[[3]])Aup[[4]] = r(Cup[[4]])Aup[[5]] = Cup[[5]]Aup[[6]] = Cup[[6]]Aup[[7]] = Xup(Aup[[1]],Aup[[2]],Aup[[3]],Aup[[4]],Aup[[5]],Aup[[6]])Aup}#画出魔方展开图color = c("white","red","orange","yellow","green","blue","purple")par(mai=rep(0,4),oma=rep(0,4))plot(0,0, type = "n", xlim = c(0,7), ylim = c(0,9))draw <- function(Cube) #输入矩阵{for(i in 1:6)for(j in 1:8)points(i, j, pch = 15, cex = 4, col = color[Cube[i,j] 1])}draw(Xup(A,a,B,b,C,c)) #魔方初始状态##三大变换#对A(红色面)逆时针旋转90度;此时List应该是A面为俯视面的形式U <- function(List){unfold = Xup(List[[1]],List[[2]],List[[3]],List[[4]],List[[5]],List[[6]])A = matrix(rep(0,48),6)for(i in 2:5)for(j in 4:7) A[9-j,2 i] = unfold[i,j] #坐标旋转由复数推导unfold[2:5,4:7] = A[2:5,4:7]A = unfold[3:4,5:6]a = unfold[3:4,1:2]B = unfold[1:2,5:6]b = unfold[5:6,5:6]C = unfold[3:4,3:4]c = unfold[3:4,7:8]List = list(A,a,B,b,C,c,unfold)List}#U的逆变换,此时List应该是A面为俯视面的形式V <- function(List){unfold = Xup(List[[1]],List[[2]],List[[3]],List[[4]],List[[5]],List[[6]])A = matrix(rep(0,48),6)for(i in 2:5)for(j in 4:7) A[j-2,9-i] = unfold[i,j] #坐标旋转由复数推导unfold[2:5,4:7] = A[2:5,4:7]A = unfold[3:4,5:6]a = unfold[3:4,1:2]B = unfold[1:2,5:6]b = unfold[5:6,5:6]C = unfold[3:4,3:4]c = unfold[3:4,7:8]List = list(A,a,B,b,C,c,unfold)List}#对B(橙色面)逆时针旋转90度;此时List应该是B面为俯视面的形式F <- function(List){unfold = Xup(List[[3]],List[[4]],List[[2]],List[[1]],List[[5]],List[[6]])A = matrix(rep(0,48),6)for(i in 2:5)for(j in 4:7)A[9-j,2 i] = unfold[i,j] #坐标旋转由复数推导unfold[2:5,4:7] = A[2:5,4:7]B = unfold[3:4,5:6]b = unfold[3:4,1:2]a = unfold[1:2,5:6]A = unfold[5:6,5:6]C = unfold[3:4,3:4]c = unfold[3:4,7:8]List = list(A,a,B,b,C,c,unfold)List}#F的逆变换,此时List应该是B面为俯视面的形式E <- function(List){unfold = Xup(List[[3]],List[[4]],List[[2]],List[[1]],List[[5]],List[[6]])A = matrix(rep(0,48),6)for(i in 2:5)for(j in 4:7)A[j-2,9-i] = unfold[i,j] #坐标旋转由复数推导unfold[2:5,4:7] = A[2:5,4:7]B = unfold[3:4,5:6]b = unfold[3:4,1:2]a = unfold[1:2,5:6]A = unfold[5:6,5:6]C = unfold[3:4,3:4]c = unfold[3:4,7:8]List = list(A,a,B,b,C,c,unfold)List}#对C(黄色面)逆时针旋转90度;此时List应该是C面为俯视面的形式R <- function(List){unfold = Xup(List[[5]],List[[6]],List[[3]],List[[4]],List[[2]],List[[1]])A = matrix(rep(0,48),6)for(i in 2:5)for(j in 4:7)A[9-j,2 i] = unfold[i,j] #坐标旋转由复数推导unfold[2:5,4:7] = A[2:5,4:7]C = unfold[3:4,5:6]c = unfold[3:4,1:2]B = unfold[1:2,5:6]b = unfold[5:6,5:6]A = unfold[3:4,7:8]a = unfold[3:4,3:4]List = list(A,a,B,b,C,c,unfold)List}#R的逆变换,此时List应该是C面为俯视面的形式K <- function(List){unfold = Xup(List[[5]],List[[6]],List[[3]],List[[4]],List[[2]],List[[1]])A = matrix(rep(0,48),6)for(i in 2:5)for(j in 4:7)A[j-2,9-i] = unfold[i,j] #坐标旋转由复数推导unfold[2:5,4:7] = A[2:5,4:7]C = unfold[3:4,5:6]c = unfold[3:4,1:2]B = unfold[1:2,5:6]b = unfold[5:6,5:6]a = unfold[3:4,3:4]A = unfold[3:4,7:8]List = list(A,a,B,b,C,c,unfold)List}#魔方的变换Transform <- function(Cha) #输入由U/V/F/E/R/K构成的字符串{Cha = unlist(strsplit(Cha,split="")) #将字符串的字母逐个拆开for(i in Cha){if(i=="U"){cube = U(cube)}if(i=="V"){cube = V(cube)}if(i=="F"){cube = F(ABup(cube)); cube = BAup(cube)}if(i=="E"){cube = E(ABup(cube)); cube = BAup(cube)}if(i=="R"){cube = R(ACup(cube)); cube = CAup(cube)}if(i=="K"){cube = K(ACup(cube)); cube = CAup(cube)}draw(cube[[7]])Sys.sleep(0.2)}cube[[7]]}Transform(rep("RVE",30))

- END -

数学英才

中学生英才计划

数学学科官方公众号

推送数学微慕课和学习资料

  • 奔腾b70值得购买吗这车怎么样(中德日家轿横评)
  • 2024-06-27中德日家轿横评在家轿市场,不少消费者在购车的时候都会很纠结——自主品牌、德系车、日系车选谁好?网络上的各种声音公说公有理、婆说婆有理,大家的意见高度不统一,纠结的人甚至会选择困难症直接发作所以我们本次选择了很有代表。
  • 刚加女生的微信怎么聊天(刚加微信女生如何聊天)
  • 2024-06-27刚加微信女生如何聊天不管是别人介绍的,还是自己通过一些途径加到女生微信的,我相信有很多朋友不知道刚开始怎么和女生聊天,内心纠结了很久还是不知道如何去发第一句话尤其遇到自己喜欢的女生就更加纠结了首先加到一个女生的微信,先不。
  • 海信a5活动在哪里参加(白漂碎碎念篇一)
  • 2024-06-27白漂碎碎念篇一相信白漂党应该都知道海信A5了,参数啊手机质量啥的我就不说了,之前还有两位值友在售卖前写过分析,其实主要就是说冷静!想好再出手!目录一,数学算断签概率二,抢购收货地址建议三,下面就说我京东收货的经历四。
  • 灵魂工匠文永涛做客飞扬(灵魂工匠文永涛做客飞扬)
  • 2024-06-27灵魂工匠文永涛做客飞扬汽车改装处于地下状态已经多年从中国的改装文化诞生之日起,「改装车」三个字在普通大众心中就一直是古惑仔、嬉皮士和飙车族的代名词时至今日,在一代又一代改装人和车友们的努力下,终于有越来越多的人愿意了解和接。
  • 天乩之白蛇传说在哪个播放器可以看(免费观看播放器分享)
  • 2024-06-27免费观看播放器分享天乩之白蛇传说可以在影视大全播放器观看天乩之白蛇传说剧情简介:药师宫宫上许宣和师妹冷凝行医救人,在桃花节和白夭夭邂逅,历经波折两人终成眷属但白夭夭为救许宣盗取仙草,触犯天条,病愈的许宣忆起前尘往事,只。
  • 四个常见的跨境电商平台 全球化经营必备
  • 2024-06-27四个常见的跨境电商平台 全球化经营必备跨境电商平台是指为国内企业提供跨境电商服务的平台,目前国内市场上有许多跨境电商平台这些平台主要提供包括海外仓储物流、商品采购、商务服务等方面的支持,为跨境电商企业提供全方位的服务一、主流跨境电商平台1。
  • 理性对待狂犬病(狂犬病日话狂犬)
  • 2024-06-27狂犬病日话狂犬世界狂犬病日2022年9月28日,是第十六个世界狂犬病日(WorldRabiesDay),今年的主题是“狂犬病:同一个健康,零死亡(Rabies:onehealth,zerodeaths)”,旨在集合。
  • tvb吕四娘粤语(那个独一无二的吕四娘)
  • 2024-06-27那个独一无二的吕四娘作者:咖啡里的云声明:原创文章,禁止转载,抄袭必究!01《九五至尊》中,吕四娘其实是很难演的一个角色TVB剧有无数英姿飒爽的侠女珠玉在前,要有突破就必须有自己的特点张可颐饰演的吕四娘,抓住了古代侠女的。
  • 西游记1-100回阅读解析(西游记第一回梗概)
  • 2024-06-27西游记第一回梗概宇宙灭而复生,盘古开天辟地,将世界分为四洲东胜神洲傲来国海中有一花果山,山顶有块仙石,一日山石崩裂,产出一个石猴石猴带领群猴在他们居住的涧水源头之处发现一石洞,名曰“水帘洞”,石猴被群猴拥护,做了美猴。
  • 韭菜馅的素包子怎么调起来才好吃(有什么好吃的素包子馅)
  • 2024-06-27有什么好吃的素包子馅包子是我们生活中常见的食品,南方流行小笼包,北方流行家庭大包,鲜香味美,各有特色,在我们这里,大包最流行,可荤可素,采用应季的时令蔬菜,黄瓜、茄子、韭菜、茴香苗等,搭配上木耳、鸡蛋、肉馅、虾仁,搅拌在。
  • 奥特银河格斗捷德篇(新生代英雄之捷德奥特曼)
  • 2024-06-27新生代英雄之捷德奥特曼捷德奥特曼是反派贝利亚奥特曼的儿子,同时也是赛罗奥特曼的伙伴,在地球上化身名为朝仓陆的少年,与同伴们一同生活,并为了和平而与怪兽战斗,也是捷德奥特曼自身在守护世界的过程中,寻找对自己最重要的事物贝利亚。