两小时的实验数学

新利app怎么样Stephen Wolfram在Momath领先实时实验

一场演讲、一场表演……一场现场实验

“在接下来的一个小时里,我要在数学上有一个新发现。”所以我几天前开始了两个不同的小时数学遭遇现场活动国家数学博物馆(“MoMath”)在纽约市。从那之前我就一直是博物馆的受托人打开2012年,我期待着在那里花几个小时,与从孩子到退休人员的几个折衷观众一起“做一些数学”。

人们通常认为,人们无法实时看到新发现。但是关于计算工具我花了几十年的时间来构建的是,他们让实现想法变得如此之快,以至于将发现作为一种实时表演艺术变得现实。
您可以在Wolfram开放云中自己尝试这些实验

但数学是一个古老的领域。难道不是所有“容易”的发现都已经被发现了吗?绝对不是!数学沿着明确的路线发展,不断增加关于所有东西的定理.许多伟大的数学家(高斯,拉马努詹,等。)我做了实验数学来找出什么是真的。但总的来说,实验数学并没有得到应有的重视。这意味着,即使一个人只有几个小时的时间去采摘,仍然有大量的“低垂果实”有待采摘。

实验#1

我的规则现场实验这是为了保持新鲜,我在开始前几分钟就想到了这个话题。但由于这是我在博物馆的第一次这样的活动,我想我应该有一个对我来说意义重大的主题。所以我决定它应该与元胞自动机- 这是我在多十年之旅中探索的第一个例子一种新的科学

虽然细胞自动机的设置很好,也很容易理解,但它基本上是计算宇宙中的系统,而不是“数学”系统。但我想我第一次做的实验是看看某种细胞自动机有传统的数学解释

在引入元胞自动机(和Wolfram语言),我开始谈论帕斯卡三角形-通过使每个数字为每一步左右相邻数的和而形成。下面是我用来制作Pascal三角形的代码(是的,用" "替换0有点麻烦,但它让一切都更容易阅读):

[#] + RotateRight[#] &, CenterArray[{1}, 21, 0,10]/。0 ->

如果对2做同样的事情,就会得到一个相当清晰的模式:

NestList[Mod[RotateLeft[#] + RotateRight[#],2] &, CenterArray[{1}, 21, 0], 10]/。0 ->

我们可以把它想象成一个细胞自动机这条规则:

规则图[CellularaAutomaton[90]]

下面是运行这个的结果,从一个1开始:

Arrayplot [CellularAutomaton [90,{{{{1},0},50]]]

这是同样的结果,来自“数学”代码:

Arrayplot [巢式[Mod [Rotateleft [#] + Rotayight [#],2]&,CenterArray [{1},101,0],50]]

好吧,如果我们稍微改变一下数学会怎么样?我们使用mod 5代替mod 2:

ArrayPlot[NestList[Mod[RotateLeft[#] + RotateRight[#], 5] &, CenterArray[{1}, 101, 0], 50]

这仍然是一种规律。但我对实验的想法是:探索如果规则涉及数学运算而不是纯加法,会发生什么。

那么乘法呢?我注意到初始条件下所有的0都会变成很多0。所以我想:在做乘法之前,我们先试试加常数。这是我尝试的第一件事:

Arrayplot [巢式[mod [(1 + rotateleft [#])*(2 + RoteAlaright [#]),5]&,CenterArray [{1},101,0],50]]

我很惊讶。我没想到事情会这么复杂。但是,好吧,我想,让我们退一步,尝试一个更简单的规则:让我们使用mod 3而不是mod 5。(Mod 2应该已经被我的详尽的研究“基本细胞自动机”。)

这是我得到的结果:

ArrayPlot[NestList[Mod[(1+RotateLeft[#])*(2+RotateRight[#]),3]&,CenterArray[{1},101,0],50]]

我马上说,“我想知道模式的快速增长。”我猜它可能是对数或平方根。

但在继续之前,我想看看在这样的规则空间中还有什么。为了验证,我运行了mod 2的情况。不出所料,没什么有趣的。

表[ArrayPlot[NestList[Mod[(a+RotateLeft[#])*(b+RotateRight[#]),2]&,CenterArray[{1},101,0],50]],{a,0,1},{b,0,1}]

好的,现在是mod 3的情况:

表[ArrayPlot[NestList[Mod[(a+RotateLeft[#])*(b+RotateRight[#]),3]&,CenterArray[{1},101,0],50]],{a,0,2},{b,0,2}]

一个有趣的小收藏。但现在是时候分析这些模式的增长了。

正如观众中的某人所建议的第一步只是为了每一步旋转列表,使直边垂直:

ArrayPlot[NestList[RotateRight[Mod[(1+RotateLeft[#])*(2+RotateRight[#]),3]]和CenterArray[{1},100,0],50]]

然后我们每隔一步选择一次,以消除水平条纹:

ArrayPlot[Take[NestList[RotateRight[Mod[(1+RotateLeft[#])*(2+RotateRight[#]),3]]和CenterArray[{1},200,0],200],1;;-1;;2]]

如果有疑问,就再跑3000步。嗯,我对平方根或对数的猜测是错误的:这看起来大致是线性的,尽管不规则。

Arrayplot [拍摄[巢式[Rotayight [mod [(1 + rotateLeft [#])*(2 +旋转式[#]),3]]&,CenterArray [{1},3000,0],3000],1 ;;1;;2]]

令我失望的是,这是如此灰色和难以阅读。不过,尝试颜色并没有帮助;这种模式非常稀疏。

好吧,然后我试图绘制右边的位置。这是我想出的代码:

data = (First[#] - #) &[Flatten[FirstPosition[Reverse[#], 1 | 2] & /@ Take[NestList[RotateRight[Mod[(1 + RotateLeft[#])*(2 + RotateRight[#]), 3] &, CenterArray[{1}, 2000,0], 2000,1], 1;;1;;2]]];

这里有一个合适的例子:

拟合[数据,{1,x},x]

好的,怎样才能得到更好的分析呢?首先,我用差异来观察每一步的生长情况:总是0或2个细胞。然后我寻找增长或不增长的运行。然后,我专门寻找了增长的运行,并观察了连续运行的时间。

run = Length /@ Take[Split[Differences[data]], 1; / /取数据1;;2);

这是什么?因为是在纽约,所以听众中有很多金融界人士,包括坐在前排的一位世界权威的权力法专家。所以很明显的问题是,峰值的大小是否有幂律分布?基于我所掌握的数据得出的结果是不确定的:

直方图[运行]

但是我没有进一步研究这个特殊的规则,而是决定快速研究一下高模量的情况。以下是我在mod 4中得到的结果:

表[Arrayplot [巢式[mod [(a + rotateleft [#])*(b + roteationight [#]),4]&,centrarray [{1},100,0],50],plotlabel  - > {a,b}],{a,0,3},{b,0,3}]

这里有一个看起来很有趣:

ArrayPlot[NestList[Mod[(1 + RotateLeft[#])*(1 + RotateRight[#]), 4] &, CenterArray[{1, 2, 1}, 100,0], 50]]

它最终会有很多不同的可能结构吗?在随机初始条件下进行试验,使其看起来除了重复行为之外,再也不会有其他任何东西了:

ArrayPlot[NestList[Mod[(1+RotateLeft[#])*(1+RotateRight[#]),4]&,RandomInteger[2100],50]]

嗯,到现在我们的时间基本结束了。但这很难阻止。我很快尝试了mod 5的案例,发现了各种有趣的行为:

表[ArrayPlot[NestList[Mod[(a+RotateLeft[#])*(b+RotateRight[#]),5]&,CenterArray[{1,2},100,0],50],PlotLabel->{a,b}],{a,0,4},{b,0,4}]

我只是想看看这些东西。它有一个整体的嵌套模式,但有很多复杂的东西在“后台”进行:

ArrayPlot[NestList[Mod[(3+RotateLeft[#])*(3+RotateRight[#]),5]&中心数组[{1,2},400,0],200]]

一个是规则生长和不规则生长的混合体:

Arrayplot [拍摄[巢式[mod [(2 + rotateleft [#])*(4 +旋转后[#]),5]&,centerArray [{1,2},2000,0],1000],1 ;;1;;2]]

是时候停止了。但我非常满意。实时实验总是有风险的。我们可能会发现什么有趣。但是,我们发现一些非常有趣的东西:基于简单代数公式给出的迭代规则的丰富和复杂的行为。从某种意义上发现,我们发现的是传统数学构造(如代数公式)和纯计算系统之间的桥梁的示例,具有任意计算规则。在一小时内,我们当然没有完成 - 但我们发现了各种各样的研究的种子 - 我们可能会称之为“妈妈蜂窝自动机”。

实验#2

休息之后,是进行实验2的时候了。这次我决定做一些与数字更相关的事情。我开始讲反向加法系统-其中,在每一步中,一个数字与通过反转其数字获得的数字相加。我展示了基数为10的结果,从数字123开始:

PadLeft[IntegerDigits[NestList[FromDigits[Reverse[IntegerDigits[#]]]+#&,123100]]//ArrayPlot

然后我说,“我们不用反转数字,而是将它们向左旋转。让我们用基数2而不是基数10来简化系统。”

这是从1开始获得的数字序列:

NestList[FromDigits[RotateLeft[IntegerDigits[#, 2]], 2] + # &, 1,10]

有人问这是不是一个可识别的序列。FindSequenceFunction没想到:

FindSequenceFunction [%]

问题是,整体的模式是怎样的?下面是100步的结果:

PadLeft[IntegerDigits[NestList[FromDigits[RotateLeft[IntegerDigits[#,2]],2]+#&,1100],2]///ArrayPlot“src=”//www.fiberbeat.com/data/uploads/2017/03/21.png

它看起来非常复杂。做1000步并没有让它看起来更简单:

PadLeft[IntegerDigits[NestList[FromDigits[RotateLeft[IntegerDigits[#,2]],2]+#&,11000],2]///ArrayPlot“src=”//www.fiberbeat.com/data/uploads/2017/03/22.png

从1以外的数开始呢?

表[padleft [integerdigits [巢列[fromDigits [roteTeleft [IntegerDigits [#,2],2] +#&,n,100],2]] // Arrayplot,{N,10}]

都非常相似。我想知道,如果向右旋转,而不是向左旋转,会有什么不同。它真的不:

表[PadLeft[IntegerDigits[NestList[FromDigits[RotateLeft[IntegerDigits[#,2]],2]+#&,n,100],2]//ArrayPlot,{n,10}]

我想也许有一个固定数字会很有趣,所以我试着减少mod 220,只保留最后20位:

表[PadLeft[IntegerDigits[NestList[FromDigits[RotateRight[IntegerDigits[#, 2], 2], 2^20] + # &, n, 100], 2]] // ArrayPlot, {n, 10}]

表[FindTransientRepeat[NestList[Mod[FromDigits[RotateRight[IntegerDigits[#,2]],2+#,2^n]&,1,1000],4,{n,8}] //列

然后我决定为所有2进行完整的过渡图N各种情况。好奇的图片,但没有立即照亮。

Table[Labeled[Graph[# -> Mod[FromDigits[RotateRight[IntegerDigits[#, 2]], 2] + #, 2^n] & /@ Range[2^n]], n], {n, 2,9}]

现在我在想:“还有比数字旋转更简单的系统吗?”我想知道如果每一步都不加原来的数字,而是乘以2,再加一个常数,会发生什么。这并没有立即产生任何有趣的结果:

表[Padleft [IntegerDigits [巢列[2 fromDigits [RoteTeLeft [IntegerDigs [#,2],2] + N&,1,100],2]] // Arrayplot,{N,6}]

然后我想知道如何乘以3:

表[PadLeft[IntegerDigits[NestList[3 FromDigits[RotateLeft[IntegerDigits[#,2]],2]+n&,1100],2]//ArrayPlot,{n,7}]

再说一次,没什么太激动人心的。但为了完整起见,我想我最好做一个实验,看看其他乘法器的序列。

表[标记为[PadLeft[IntegerDigits[NestList[a FromDigits[RotateLeft[IntegerDigits[#,2]],2]+1&,1100],2]//ArrayPlot,a],{a,20}]

类似的行为until-aha !当一个人得到13的倍数时,就会发生一些奇怪而复杂的事情。

观众们马上就猜到了Prime可能很特别。但这一理论很快被乘数21的案例所打破。

表[标记为[PadLeft[IntegerDigits[NestList[a FromDigits[RotateLeft[IntegerDigits[#,2]],2]+1&,1100],2]//ArrayPlot,a],{a,20,24}]

好的,那么接下来就开始寻找导致复杂行为的乘数的特殊之处。但首先我们必须弄清楚如何识别复杂的行为。我想我应该尝试一些新奇的东西:使用机器学习为不同的乘数绘制图像的特征空间图。

这有点有趣,也是机器学习的一个很好的应用,但不是马上就有用。(为了让它更好,你必须更加仔细地考虑要使用的特征提取器。)

imags = table [padleft [integerdigits [巢列[rotegidigs [rotegereft [rotegertegits [#,2],2] + 1&,1,100],2]] //图像,{a,50}];特点是[图片]

那么一个人怎么说复杂的模式?熵的直方图并不明显照亮:

直方图[熵/@imags]

当我写这篇博文时,我想我应该更准确地找到熵分布;即使包括1000个可能的乘数,它似乎仍然没有太大的帮助:

直方图[熵/ @ table [padleft [integerdigits [justlist [rotegigits [rotegeremit [rotegertegits [#,2],2] + 1&,1,100],2]] //图像,{a,1000}]]

坐在前排的一位电信数学专家建议傅里叶变换.我说我不希望:

图像(Abs(傅里叶(ImageData []]]]

是的,做傅里叶变换有更好的方法。但另一个人(碰巧是一位对冲基金的CEO)建议观察每个模式中特定的2×2区块的出现情况。对于乘法器13,会出现很多块:

计数[Flatten[Partition[PadLeft[IntegerDigits[NestList[13 FromDigits[RotateLeft[IntegerDigits[#,2]],2]+1&,1,20],2]],{2,2}],1]]

但对于乘法器5的情况,在模式简单的情况下,大多数块永远不会发生:

计数[Flatten[Partition[PadLeft[IntegerDigits[NestList[5 FromDigits[RotateLeft[IntegerDigits[#,2]],2]+1&,1,20],2]],{2,2}],1]]

因此,这表明我们只需为每个乘数生成一个列表,列出16个可能的块中实际发生的块数:

blks = Table[Length[Union[Flatten[Partition[PadLeft[IntegerDigits[NestList[a FromDigits[RotateLeft[IntegerDigits[#, 2], 2]], {2,2}], {a, 50}]

这里有一个情节:

ListLinePlot(黑色)

16s在哪里?

平坦[位置[BLK,16]]

FindSequenceFunction在这些数字上没有任何运气。绘制更长时间的“块计数”可得出以下结果:

listLineplot [表[长度[union [platten [padleft [colledigits [justlist [fromdigits [rotegeremit [integertegits [##,2],2] + 1&,1,20],2]],{2,2}],1]],{A,1000}]]]

肯定是某种结构。但不清楚是什么。

再一次,我们已经没时间了 - 发现了一种有趣的系统,这是一个有趣的财产,它通常在其行为中复杂,但对于一些特殊情况而言,不是。

现场实验过程

这些年来,我做了许多现场实验——尽管已经有一段时间没有做关于数学的实验了。随着Wolfram语言已经进化了,它变得更容易,很容易做实验,并且在没有时间浪费在毛刺和调试时没有时间。

Wolfram笔记本有他们(默认)保留的漂亮的小功能笔记本历史(参见“单元格”菜单)-显示笔记本中的每个单元格何时已被修改。这里是结果实验#1实验#2. 大多数情况下,它们表现出相当线性的进展,回溯相对较少。(实验#2中出现了一个缺口,这是因为我的网络连接突然停止工作。很方便,观众中有一些网络专家,最终确定从我漂亮的新电脑到投影仪的USB-C连接以某种方式错误协商为以太网连接…)

细胞的历史

每年在我们暑期学校我从做现场实验或者两个,因为我认为现场实验是一个很好的方式来展示如果一个人以正确的方式,使用正确的工具,发现是多么容易。我希望现场实验将成为研究过程中的一个重要部分教育人们关于计算思维也。

使用Wolfram语言,人们可以对各种事情进行实时实验和实时编码。(我们甚至在最后一次尝试做一个原型现场编码比赛Wolfram技术会议;它运行得很好,我们可能会把它发展成一个完整的程序。)

但是,不管它们是否真实存在,计算机实验都是一种非常强大的发现方法——尤其是在数学方面。

当然,很容易生成关于数学的各种随机事实。问题是:一个人如何生成“有趣”的事实?首先,一个事实对我们人类来说是有趣的,它必须与我们关心的事情有关。这些东西可能是技术应用,对现实世界的观察,或者只是历史上被研究过的数学片断费马最后定理,例如)。

我觉得我的书一种新的科学极大地拓宽了人们可能认为“有趣”的“数学类事实”的种类——通过提供一个通用的知识框架(关于计算、复杂性等),这些事实可以适合这些事实。

但是,做一个好的实验数学所需要的部分技能是寻找一些事实,这些事实最终可能与更大的框架有关,最终与数学的传统有关。与任何研究领域一样,这需要经验和直觉,运气也会有所帮助。

但在实验数学中,它非常容易开始:有很多肥沃的领域需要探索,即使有相当基本的数学思想。我们恰好生活在这样一个时代,使这种探索可行的工具首先存在。(当然,我花了很多时间建造它们……)

实验数学应该如何完成?也许可能有“数学 - a-knons”(或“发现-a-thons”),类似于编程马拉松,其中输出是数学论文,而不是软件项目。

超过30年前,我开始了期刊复杂系统- 我的长期目标之一是使其成为实验数学结果的存储库。它肯定发表了很多,但现代学术论文的标准形式没有针对实验数学进行优化。相反,人们可以想象某种“在实验数学中发现”,这更为朝向实验结果的直接报告。

在某些方面,它将恢复早期的科学出版方式,就像19世纪的所有这些论文都报告了奇怪的新动物或物理现象。但今天新的是Wolfram语言尤其是在Notebook文档中,不仅可以报道自己所看到的,还可以提供一个完全可复制的版本,让其他人也可以进行探索。(如果需要大量的计算,将结果存储在云对象.)

我希望最终能够建立一个严谨的实验数学生态系统。在这里,结果可以被发现,以良好的可视化方式清晰地呈现出来,并以一种形式发布,让其他人可以在其基础上进行构建。这已经过去很长时间了,但我认为这将是数学发展的一个重要方向。

对我来说(我希望观众也一样)几天前花几个小时在公开场合制作原型很有趣。


下载完整的笔记本:
课程#1/实验#1»
Session #2/Experiment #2

您可以在Wolfram开放云中自己尝试这些实验

1评论

  1. 非常感谢您分享您的MoMath演讲背后的想法。我喜欢这篇文章的所有内容,并利用它与我的孩子们今晚进行了一个有趣的项目:

    https://mikesmathpage.wordpress.com/2017/03/07/sharing-stephen-wolframs-momath-talk-with-kids/

    迈克劳勒
Baidu