一个立方等于多少平方米(一立方石头等于多少吨)-9游会

儿童节刚刚过去。这一期,我们来聊聊童年记忆中的魔方。

或许这是一个略显愚蠢的问题:为什么一个好的魔方总能恢复原状?其实这是一个简单而深刻的问题。

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

魔方——这么多,那么少!u|f|r魔方——这么多,那么少!d|b|l

例如我们对魔方进行操作:,那么我们只需要再进行如下操作即可:u|f|r例如,如果我们操作魔方:,那么我们只需要做以下事情:

相反的操作,即前层逆时针旋转四分之一圈,对于其他符号也是一样的。然而,根据魔方术语,它通常用小写字母表示,即。

群论中称之为“逆”,是因为它们组合的结果是“单位元”,即魔方会回到初始状态:

群的复合运算满足“结合律”,因此很容易证明上述等式成立:

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

可见魔方确实是真正的“有限群”!

为什么有限?因为是“置换群”的“子群”,所以置换群是有限群,它的子群是由它的元素的子集组成的更小的群,所以它的子群也一定是有限群。

所谓置换群,就魔方而言,是指魔方的所有状态形成一个有限集。从一个状态到另一个状态的转换是这个组的元素。一个魔方有6个面,每个面分成9个小块,所以有54个小块。这些小方块的颜色共同构成了魔方的当前状态。如果这54块可以任意互换,那么形成的组记为。但是,由于其特殊的内部结构,魔方不可能是随机的。真实情况是一个子群,我们称之为魔方群。

这组状态的实际数目已经由数学家给出。这是一个巨大的数字:

大约是目前地球人口的平方。

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

答:20步!

这个结果叫做神数。类似于平面图四色定理的证明(给没有飞地的地图着色使邻国颜色不同,只用四种颜色就够了),也是用计算机暴力证明的。

这么多,这么少!

这是什么意思?说明魔方的状态是高度相关的,所有的状态都被压缩在一个直径为20的高维球体中。

魔方——这么多,那么少!通常魔方示意图都附有说明书,说明书中介绍了还原魔方的公式。在应用这些公式时,我们似乎不需要关注每一个面片的状态,往往会“糊里糊涂”地还原魔方,知其然而不知其所以然。而且还原步骤的数量往往超过20步,也就是说这些公式有一些“弯路”。

我们如何理解魔方的归约公式?

我们可以用图论来表示魔方组:每个状态记录为一个节点。如果有一个变换,可以从这个状态得到另一个状态,那么这两个节点一定是通过一条边连接起来的,这样我们就得到一个关于魔方状态的网络。在这个网络中,新手寻找最佳路线是不切实际的,归约公式帮助我们进入一个特定的轨迹。这条赛道就像一个时钟表盘,赛道上的每个状态就像表盘上的刻度。魔方的初始状态是这个表盘上的12点,只要我们按照顺时针(逆时针)方向走,就一定会通过我们的目标。

魔方——这么多,那么少!示意图:红点是魔方的初始状态,类似于魔方组中的表盘结构的子组。我们称之为“循环群”,它是一个有限循环群。

魔方还原公式本身的结构也很耐人寻味,比如

在群论中,我们称之为“共轭”。在还原魔方的时候,我们经常会遇到这样的困境:我们想制作和交换,但是两者直接交换会有影响,但是我们又不想做改动…这个时候,我们就要利用和消除影响。类似于共轭原理,我们也会用“换向器”,看起来像。我们在定义群的时候,只提到了结合律,没有提到交换律。这是因为存在大量的非交换群,比如矩阵群。群中没有交换子这种东西,因为

在某种意义上,交换子群(由交换子生成的群)提供了群的交换性。群中可交换的元素越多,交换子就越少,交换子群就越小。

魔方详情请参考群论via魔方(链接:http://geometer . org/rubik/group . pdf)。另外提供了一个在线魔方程序(链接:https://iamthecu.be),非常漂亮有趣。

下面是我写的2阶魔方的平面展开图,结果会通过给定的运算自动计算出来。

魔方——这么多,那么少!代码描述:

####2阶魔方#矩阵中心对称o <- function(a){ t = a[1,1] a[1,1] = a[2,2] a[2,2] = t t = a[1,2] a[1,2] = a[2,1] a[2,1] = t a}#矩阵元素逆时针旋转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] = t a}#矩阵元素顺时针旋转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] = t a}#魔方的六个面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] = a aup[3:4,1:2] = a aup[1:2,5:6] = b aup[5:6,5:6] = b aup[3:4,3:4] = c aup[3:4,7:8] = c aup}cube = list(a,a,b,b,c,c)cube[[7]] = xup(a,a,b,b,c,c)#b朝上的十字架展开图(a –> b),输入输出皆为列表 abup <- function(aup) { bup = list() bup[[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 = list() aup[[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 = list() cup[[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 = list() aup[[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))

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文链接:https://www.andon8.com/14059.html

网站地图