两小时的实验数学

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

一场演讲,一场表演,一场现场实验

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

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

但数学是一个古老的领域。所有“容易”的发现不是都已经有了吗?绝对不是!数学沿着明确的方向发展,不断地增加关于所有东西的定理.许多伟大的数学家(高斯Ramanujan等。)做了实验数学来找出什么是正确的。但总的来说,实验数学并没有得到足够的重视。这意味着还有大量“容易摘的果实”等着你去摘——即使你只有几个小时的时间去摘。

实验#1

我的规则现场实验为了保持新鲜感,我只在开始前几分钟考虑这个话题。但由于这是我第一次在博物馆举办这样的活动,我想我应该有一个对我来说很重要的主题。所以我觉得应该跟元胞自动机- 在多十年之旅中探索的第一个例子是我探索的一种新的科学

虽然它们的设置很好而且容易理解,但细胞自动机基本上是来自计算世界的系统,而不是“数学”系统。但我认为我的第一个实验是研究一些细胞自动机有传统的数学解释吗

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

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

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

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

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

RulePlot [CellularAutomaton [90]]

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

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

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

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

如果我们稍微改变一下数学,会发生什么呢?我们不使用mod 2,而是使用mod 5:

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 [拿[巢式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]]];

这里有一个合适的:

拟合[data, {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[2,100], 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] &, CenterArray[{1, 2}, 400,0], 200]]

一种是有规律和不规则生长的混合物:

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

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

实验#2

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

PadLeft[IntegerDigits[NestList[FromDigits[Reverse[IntegerDigits[#]] + # &, 123, 100]] // ArrayPlot . // ArrayPlot . /

然后我说,“与其颠倒数字,不如把它们向左旋转。”让我们让这个系统更简单,用以2为底而不是以10为底

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

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

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

FindSequenceFunction [%]

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

PadLeft[IntegerDigits[NestList[FromDigits[RotateLeft[IntegerDigits[#, 2], 2] + # &, 1,100], 2]] // ArrayPlot

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

PadLeft[IntegerDigits[NestList[FromDigits[RotateLeft[IntegerDigits[#, 2], 2] + # &, 1,1000], 2]] // ArrayPlot

从1以外的数开始呢?

表[padleft [integerdigits [巢列[fromDigits [roteTeleft [IntegerDigits [#,2],2] +#&,n,100],2]] //数组平面,{n,10}]

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

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

我想也许有固定数目的数字会很有趣,所以我试着对2取余20.,只保留最后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 [integerdigs [巢列[2 fromDigits [roteTeLeft [IntegerDigits [#,2],2] + N&,1,100],2]] // Arrayplot,{N,6}]

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

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

再说一遍,没什么令人兴奋的。但是,为了完整起见,我想我最好做一个实验,看看其他的乘数序列。

Table[Labeled[PadLeft[IntegerDigits[NestList[a FromDigits[RotateLeft[IntegerDigits[#, 2], 2] + 1 &, 1,100], 2]] // ArrayPlot, a], {a, 20}]

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

观众们立刻猜测,质数可能很特别。但这个理论很快被乘数21的例子推翻了。

Table[Labeled[PadLeft[IntegerDigits[NestList[a FromDigits[RotateLeft[IntegerDigits[#, 2], 2] + 1 &, 1,100], 2]] // ArrayPlot, a], {a, 20,24}]

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

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

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

那么一个是如何讲述这是复杂的模式?熵的直方图并不明显照亮:

直方图(熵/ @图像放大)

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

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

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

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

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

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

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

count [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 [padledigs [justlist [fromdigits [totateleft [integertegits [#,2],2] + 1&,1,20],2],2,2}],1]],{a,1000}]]]

一定的结构。但还不清楚到底是什么。

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

现场实验过程

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

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

细胞的历史

每年在我们暑期学校我从做一个现场实验因为我认为现场实验是一种很好的方式,它可以告诉你,如果用正确的方法和正确的工具,发现是多么容易获得。我希望现场实验将是这个过程的重要组成部分教育人们关于计算思维也。

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

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

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

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

但是,做好实验数学所需要的技巧之一,是寻找那些最终能与更大的框架,以及最终与数学传统相关联的事实。就像在任何研究领域一样,它需要经验和直觉——运气也有帮助。

但在实验数学中,这是非常容易开始的:有很多肥沃的领域可以探索,即使是非常基本的数学思想。我们只是碰巧生活在一个让这种探索成为可能的工具最初存在的时代。(当然,我花了很多时间来建造它们……)

实验数学应该如何完成?也许可能有“数学-A-thons”(或“发现-a-ren”),类似于活动,在美国,输出的是数学论文,而不是软件项目。

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

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

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

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


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

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

1评论

  1. 非常感谢你分享你的数学演讲背后的想法。我喜欢这篇文章的一切,并把它作为一个有趣的项目与我的孩子今晚:

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

    迈克劳勒
Baidu