发现分数的形状

以可视化的数据驱动探索形式为1/n的分数的十进制展开

形式为1/n的分数的可视化集合。作者形象。

数学家的图案一定很漂亮……

g·h·哈迪

看着另一位伟大的Numberphile上周的视频。在这布雷迪采访了马特·亨德森更多关于他对数字的生动想象。在这个特殊的马特谈到了我们如何想象无限的数字非理性的数字,如πφ(黄金比例),使用龟图还有一个很酷的绘图仪。

这让我想起了一些数学th我女儿最近一直在研究分数和它们的小数展开式,马特的一些想法是否能帮助她更好地理解这是怎么回事?至少,我希望一场关于数字的更直观的对话,能够激发人们对支撑数学的美丽模式的更深层次的欣赏……嘿,一个爸爸可以梦想……

无论如何,在这篇文章中,我将描述我如何应用Matt的一些想法开始我自己对数字视觉景观的探索。我决定专注于这种形式的简单分数1 / n这里我要看的是n从1到100。我的目的是描述我所使用的方法,并呈现最终的可视化结果,以及它们最有趣的一些方面,但在大多数情况下,我会让可视化结果自己说话。

TMatt使用的可视化方法是一种直截了当的方法,我在本文的最后提供了一个基本的Python实现的代码片段。方法是这样的:

  • 想象一下,我们正在控制一个小机器人(turtle图形中的“海龟”),它能够在移动时绘制出它所遵循的路径。
  • 为了简单起见,这个机器人总是向前移动一个单位的距离,我们想要显示的数字的数字决定了它的移动方向。
  • 因为有10个可能的数字(0,1,2,…,9),所以有10个可能的方向和数字d的角度转换d * 360/10度。因此数字1将使机器人从当前的方向旋转36度,数字2将使机器人旋转72度,以此类推。
  • 用这种方法,任何数字都可以按照数字中编码的方向指令来表示。这些数字也可以用来为产生的路径上的每个线段分配颜色;有10个数字,就有10种可能的颜色。

下面的动画展示了我们如何使用这种方法来可视化分数1/14(.0714285…)的小数展开的前64位。1/14的小数展开式是无限的,叫做a重复的部分循环小数-数字714285永远重复,但正如我们将看到的,从来没有分数是重复的。每一个连续的数字对应一个新的彩色编码的线段。在这种情况下,前两位数字(00)导致两个水平(蓝色)线段,因为;转角为0。然后是数字7 (7 × 36 = 252)的252度急转,然后是数字1的36度急转,以此类推。

对十进制1/14展开后的前64位产生的可视化动画;每个数字定义了转角,并被分配了一个预定义的颜色。作者形象。

为了便于读者更从容地分析,下面的序列显示了这个动画的各个帧。在每一帧中,起始点由填充标记表示,结束点由未填充标记表示。每一帧也用它对应的数字标记。

动画帧的前64位小数展开1/14。The start-point is indicated by the filled marker and the end-point by the unfilled marker. Line segments are colour-coded according to their corresponding digit in the decimal expansion. Image by author.

现在我们已经掌握了可视化过程,让我们看看将其应用于一些熟悉的分数的结果。

下面是表格中所有部分的网格1 / n的值n从1到100。每个图显示的是小数点展开的前1000位(如果存在的话);简单的无重复这样的分数1/21/4,等没有无限的小数展开,因此只贡献了少量的数字可视化。如上所述,线段已被着色以反映数字和相应的转角,所以每个可视化图形的形状和颜色告诉我们关于小数展开的数字。

对于1/n形式的n从1到100的分数的小数展开的前1000位产生的可视化效果。每个图形都用分数及其部分小数展开来标记。作者形象。

当我第一次看到这些图像时,我被它们在视觉上的有趣和惊人所打动。我并没有期望1/7这样简单的分数能够创造出如此对称的“螺旋桨”,只是看看1/83或1/98所呈现出的复杂本质,它们看起来就像精致的花环。

将1/27的小数展开后的前100位形象化。作者形象。

说句题外话,值得强调的是,所有这些数据可视化已经按比例缩小的易读性,通过确保他们最大化填充可用的框架,但这掩盖了1/27结构的可视化,,从表面上看,看起来像一个简单的直线,表明非重复性的分数。实际上,当我们放大小数展开的前100位时,这个分数有一个更复杂的阶梯状可视化,如上图所示。

O很明显,复杂的结构和旋转对称,在这些可视化中是显而易见的,因为周期性的性质,他们的小数展开。它们重复出现的数字在视觉上共同创造了重复的结构。在数学语言中,这些无限重复的数字序列称为重复的语句reptends而假面龟的长度被称为

四个可视化显示,以突出每个分数的重复数字序列的第一次出现。每个可视化都用括号中的分数、小数展开的一部分和重复序列的长度(重复周期)标记。作者形象。

上面的四种可视化显示了分数1/3、1/14、1/85和1/97的小数点展开中的前1000位,以一种强调可视化中对应于每个分数的重复数字首次出现的部分的方式。

之所以选择这些分数,是因为它们有不同的重复周期。重复的1/3是一个数字“3”(1的周期),这意味着它的可视化是由一个单线段(红色)的重复,以108度角与当前标题,如图所示。

分数1/14有一个6位数的重复(“714285”),也就是一个个体。叶片的结果10桨叶,螺旋桨风格的可视化。注意,对于1/14的6位再现,只有5个线段可见。这是因为它的最后一个数字“5”导致视觉返回到自己(180度转弯),以模糊之前的线段“8”。

时间越长,事情就越复杂。16位1/85的重复对应于它的五边形可视化的一边,而96位1/97的重复创建它的5个角块中的一个。

F从可视化的角度来看,重复序列的长度是度量复杂度的有用方法,因为具有较长的重复序列的分数往往比具有较短重复序列的分数产生更丰富的可视化。为了看到这一点,下面的图按照其表示的长度降序重新排列。此外,他们强调了可视化的部分,这对应于第一次出现的重复。这有助于阐明每个可视化是如何由其重复的组件组成的。

对于n从1到100的值,表示重复(重复周期> 1)分数为1/n的小数展开的前1000位。每个可视化的起点由填充的标记表示,终点由未填充的标记表示。每个可视化显示突出它的第一个重复序列,每个可视化显示的标题显示分数本身,直到它的前10个重复数字,以及它的重复数字序列的长度(重复周期)。与前面一样,每个线段根据对应的再现数字进行颜色编码。作者形象。

通常情况下,模拟对视觉化的作用是直观的。例如,像这样的分数1/71/14它对应于一个主要的叶片’,类似的1/19,它对应一个'手臂的想象。然而,对于像这样的分数1/941/711/62重复的结构远没有那么明显,实际上是以一种更复杂的方式通过可视化编织而成的。

注意最好的分数倒数的质数) - - -1/p p是质数——与p > 5与非素数分数相比,具有更长的再现性和更大的视觉复杂性。我相信这是数字理论家们所熟知的。对于除2和5之外的任何质数p, 1/p的小数展开重复一个能除p-1的周期-但有趣的是,它也反映在视觉效果上,值得进一步探讨。

T这篇文章的目的是为了开始形式的简单分数的视觉探索1 / n,通过使用它们的十进制展开作为一组定向指令来指导可视化过程。我发现,就其揭示的结构的丰富性和规律性而言,结果既引人注目,又引人入胜。

我集中讨论了形象化和重复小数展开的性质之间的关系。具有较长的重复序列的分数与更复杂的形象化联系在一起,但到目前为止,我只触及了表面,有很多值得进一步研究的地方:

  • 为什么大多数的视觉效果也会展示出来5倍10倍旋转对称吗?大概是因为我用了以10为底的数吧?对于更大的值,这种情况会持续吗n或的倍数1 / n吗?在其他数字基础上,视觉化是如何变化的?是否可以从小数展开本身来确定对称性,而不产生视觉效果?
  • 显然,某些分数之间存在很强的关系。例如,基于3、6和7的倍数的分数是相似的,当然,10的倍数(1/n, 1/10n, 1/100n等)将产生几乎相同的视觉效果,除了由于任何额外的平移移动之外。0在小数点后面。我们可以从这些关系中学到什么,以及它们如何影响视觉效果?
  • 当我们把加/减、倍数/除法和分数结合起来时,会怎么样呢?他们的视觉效果是否以可预测的方式变化?
  • 游戏中存在明显不同的可视化等级,例如星星、螺旋桨、五边形和十边形、楼梯等。这是全部的吗?或者对于简单分数还有其他的形象化的方法吗?

我最初的目标是帮助我的女儿更好地理解存在于我们周围数字中的模式,这是如何实现的呢?我们只能说这是一项正在进行中的工作。但从好的方面来看,至少视觉效果是成功的。在我们家,我们现在都有自己最喜欢的分数,看到她的兴趣发展,她试图发现图像中的重复结构,并将它们与十进制展开的数字相匹配,这是值得的。

附录

下面的Python代码片段包含了对给定数字进行一般化可视化的代码。在这个作品中我使用了Matplotlib产生视觉效果和Mpmath对于所需的浮点精度;Python的默认精度是不够的。

def draw_number (ax, n):
为数字n画一个简单的图。

参数:
轴(Matplotlib)用于可视化。
可以想象的数字。
”“”
#将n转换为数字字符串;去掉小数点。
数字= tr (n) .replace('。“,”)
coord =[(0,0)] #起始/起始coord。
heading = 0 #一个'东'的航向。
#遍历每个数字…
以数字表示的数字:
#将数字转换为所需基数的int类型。
n = int(数字)
#使用数字选择一个转角;假设以10为底。
度= n * 360/10

#用新的转弯角度更新当前的航向。
标题+ =度
#当前的x, y坐标
Current_x, current_y = coords[-1]

#计算基于新标题的x和y偏移量。
x_offset = math.cos (math.pi *标题/ 180)
y_offset = sin (math.pi *标题/ 180)

#新的x和y坐标。
New_x, new_y = current_x + x_offset, current_y + y_offset

#绘制从当前到新xy的新直线
ax.plot ([current_x, new_x], [current_y, new_y])
#添加新的xy到cocord列表。
坐标。追加((new_x new_y))

#标记起点和终点
ax.plot (
(坐标[0][0])* 2(坐标[0][1]]* 2,
mark ='o', markersize=8, markeredgeccolor ='k', color='k'

ax.plot (
(坐标[1][0])* 2(坐标[1][1]]* 2,
Marker ='o', markersize=8, markeredgeccolor ='k', color='w'
#返回已经绘制的坐标。
返回坐标

都柏林大学学院计算机科学教授。专注于AI/ML和推荐系统,应用于电子商务、媒体、健康领域。

Baidu
map