如何让学习Wolfram Language更有趣(上)。

Wolfram

为了尝试让学习Mathematica变得更有趣,多年来,我通过示例的方式引入该编程语言。我已将这些示例收集在随附的笔记本中。如果有类似的方法,请告知我。此外,由于这项工作已完成很久,其中部分内容可能已过时;但我认为该方法仍然有价值,并希望其他人能够采纳它。

 

 

NO.1

引言

如何让学习Wolfram Language更有趣(上)。

 

没有人能通过看电视上的网球比赛来学会打一场像样的网球。同样,我们认为,没有人能仅通过通读一本关于Mathematica编程的书来学会Mathematica编程。要想取得成功,需要在Mathematica编程基础方面不断练习,尤其是使用Mathematica解决问题。我们坚信,学生应该从一开始就接触问题求解。本书正是据此组织的。我们在每一节开始时先提出一个待解决的问题,然后只介绍足够用的Mathematica语言来解决当前问题。接着,我们展示如何改进所给出的编程方案。然后再进入下一个问题,依此类推。通过这种方式,我们能够以一种引人入胜的方式,提供对Mathematica编程语言的扎实入门。我们始终鼓励学生思考可以用已学技术解决的类似问题。同时,当学生遇到自己需要解决的问题时,他们也会有成功解决方案的具体实例作为支持和鼓励。

 

 

NO.2

Josephus问题 

如何让学习Wolfram Language更有趣(上)。

 

在本次首次探究中,您将开始学习Mathematica语言,同时了解一些有趣的数学知识。我们首先引入一个数学问题——Josephus问题,然后展示Mathematica如何表示并解决该问题。接着,通过使用我们已经开发的Mathematica工具收集数据,您将加深对该问题的理解,并看到如何改进我们的第一个解决方案。我们假定您已熟悉Mathematica语言的基本知识。如果还不熟悉,有一些视频可以帮助您入门。

例如,请参见Wolfram视频,网址为:http://www.wolfram.com/broadcast/screencasts/handsonstart/

 

Josephus问题

问题描述

弗拉维奥·约瑟夫斯是公元一世纪的犹太历史学家。他记载了一群40名犹太人躲在洞穴中,他们不愿向罗马人投降,于是选择逐一自杀。他们围成一个圆圈,然后按顺时针方向依次进行,每个活着的人刺死逐渐缩小的圆圈中下一个仍幸存的人,直到仅剩一人存活。幸存者是谁?如果圆圈中有2000人,幸存者又会是谁?

 

如何让学习Wolfram Language更有趣(上)。

解决方案

我们将编写一个非常简短的程序来计算结果。程序的输入将是40个数字的列表:
{1,2,3,…,40}。Mathematica有一种使用函数Range生成此类列表的简洁方式。在新单元格中输入:Range[40]
然后按住Shift键同时按回车键。尝试在该函数中输入除40以外的其他值。

如何让学习Wolfram Language更有趣(上)。

 

我们需要的另一个函数是:RotateLeft。如果在新单元格中输入:?RotateLeft,Mathematica将简要说明该函数的功能;如果鼠标单击继续符号“>>”,浏览器将带您前往Mathematica网站,查看带有示例的更详细解释(这对所有Mathematica函数均适用,我们鼓励读者每遇到一个新函数都这样做)。创建新单元格后,尝试计算 RotateLeft[Range[10], 3] 或 RotateLeft[Range[12], 5]。

如何让学习Wolfram Language更有趣(上)。

 

对于我们的问题,我们只需要 RotateLeft[x](它等同于 RotateLeft[x, 1])。思路是“保存”列表开头的那个人员,通过 RotateLeft 将该人员移到列表末尾;在“旋转”之后,我们删除新的列表头部(即被原列表头部刺死的那个人);这通过函数 Rest 实现。给定一个列表,Rest 函数会删除列表的头部并保留列表的其余部分。在新单元格中尝试执行:Rest[RotateLeft[Range[40]]]。它是否达到了您的预期?我们计划反复使用这种旋转/删除组合,直到只剩下一个人为止。

如何让学习Wolfram Language更有趣(上)。

 

由于我们可能希望在此处使用除40以外的其他数字,为何不用变量替换 ‘Range[40]’ 呢?也就是说,让我们定义一个函数 Rest[RotateLeft[x]],打开一个新单元格并输入:f[x_] := Rest[RotateLeft[x]]。然后使用 Shift+Return 将其输入 Mathematica。

如何让学习Wolfram Language更有趣(上)。

 

首先请注意,定义左侧引入的变量后面必须带有下划线;函数定义中引入的每个变量后都必须跟一个下划线。另请注意使用的是“:=”而不仅仅是“=”。“:=”表示这是一个函数的定义,每当“x_”被替换为可计算的值(例如 Range[40])时,该函数将重新求值。

 

计算 f[Range[40]]。注意第一个被淘汰的是谁。接下来计算 f[f[Range[40]]]。我们已经从四十人的圆圈中淘汰了两人;每次应用 f 时,我们都先旋转,然后删除当前队列中的第一个。

如何让学习Wolfram Language更有趣(上)。

 

现在应该很明显,我们需要将 f 应用于 Range[40] 共三十九次。

 

当然,我们更希望不必“手动”完成这一操作。(想想有2000人的圆圈!)幸运的是,Mathematica 有一个内置函数可以为我们完成这一任务,即函数 Nest。(在新单元格中输入:?Nest 并回车以获取更多信息)。Nest 让我们可以轻松计算诸如 g[g[g[g[a]]]] 这样的表达式。我们只需告诉 Nest 函数是什么(本例中为“g”)、应用于什么(本例中为“a”)以及应用多少次(本例中为“4”次)。因此,我们可以写 Nest[g, a, 4] 来代替 g[g[g[g[a]]]]。试试看。

如何让学习Wolfram Language更有趣(上)。

 

我们需要将函数 f 应用于 Range[40] 共三十九次,因此我们要计算:Nest[f, Range[40], 39]。计算该表达式,看看谁幸存下来!

如何让学习Wolfram Language更有趣(上)。

 

更一般地,我们定义如下函数:survivor[n_] := First[Nest[f, Range[n], n – 1]]。函数“First”用于去掉括号;因此输出不再是“{17}”,而是直接得到“17”。(通常,对列表头部应用 First,会给出列表的第一个元素。)

如何让学习Wolfram Language更有趣(上)。

 

使用这个 survivor 函数做一些探究:随着圆圈中人数增加,它的表现如何?您能在这里找到规律吗?学习如何使用 Table 函数,以便“批量”获取和显示结果。例如,尝试输入:Table[{n, survivor[n]}, {n, 1, 100}]。

如何让学习Wolfram Language更有趣(上)。
如何让学习Wolfram Language更有趣(上)。
如何让学习Wolfram Language更有趣(上)。

 

通过使用Mathematica的TableForm函数可以获得更好的格式,例如:TableForm[Table[{n, survivor[n]}, {n, 1, 100}]]。试试看!

 

您能从这些结果中看出规律吗?如果无法立即识别出规律,对它们“绘图”可能会有所帮助。输入:t = Table[{n, survivor[n]}, {n, 1, 100}];(分号“;”用于抑制输出),然后输入:ListPlot[t]。

如何让学习Wolfram Language更有趣(上)。

 

练习。尝试对幸存者函数的计算方法提出一个猜想;特别是,您能否手动推算出 survivor[2000] 的值是多少。

 

 

NO.3

Josephus

问题的一个更好解法

如何让学习Wolfram Language更有趣(上)。

 

如果你在上一节中研究了不同规模圆圈的Josephus问题数据,你可能已经注意到,在2的幂次处幸存者始终为1,而在两个2的幂次之间,数值按2递增;也就是说,从规模为1的圆圈开始,幸存者依次为:1, 1, 3, 1, 3, 5, 7, 1, 3, 5, 7, 9, 11, 13, 15, 1, … 因此,要得到规模为10的圆圈的幸存者,首先注意到10比8多2(而8对应的幸存者为1);因此幸存者是第3个奇数,即5。由于第n个奇数可以表示为 2(n−1)+12(n−1)+1,我们只需计算 2(10−8)+1=52(10−8)+1=5。一般而言,对于规模为 nn 的圆圈,我们计算 2(n−b)+12(n−b)+1,其中 bb 是不大于 nn 的2的最大幂次。

 

既然我们现在知道了这个规律,就可以编写一个更快的函数,我们将其命名为 survive。

如何让学习Wolfram Language更有趣(上)。

 

首先,我们使用 Module 将“程序”括起来;这用于“局部化”所有变量,以避免与之前定义的对象产生可能的混淆。需要局部使用的变量放在花括号中,并可选择性赋予初始值;我们将唯一变量 b 初始设置为 1,即 {b = 1}。后面跟一个逗号,逗号之后列出程序的各个步骤,步骤之间用分号分隔。最后一条指令决定函数的输出。(输入 ?Module 可获取更多关于 Module 的信息。)我们希望找到不大于 x 的 2 的最大幂次;我们通过从 b = 1 开始,并在其两倍仍不大于 x 时不断加倍来实现;这通过程序中的 While[2b ≤ x, b = 2b] 完成,它检查两倍是否不大于 x,若是,则将 b 替换为其两倍(b = 2b)。当 2b > x 时,这个“循环”停止,程序继续执行下一条也是最后一条指令:2(x – b) + 1,这就是输出。其中 (x – b) 是超出小于 x 的 2 的最大幂次的部分,而 2(x – b) + 1 是对应的奇数。

 

  1. 尝试使用 survive 函数找出 2000 人时的幸存者,并与我们旧的 survivor 函数进行比较。它将比原来的 survivor 函数快得多。事实上,如果你输入 Timing[survive[2000]] 或 Timing[survivor[2000]],使用 Mathematica 的 Timing 函数,你可以确切地知道这些计算在你的计算机上花费的时间。请注意,Timing 函数返回一个包含两个项的列表,第一项是时间,第二项是函数值。

     

练习:利用 Mathematica 函数 Log[2, x] 与 Floor 函数,编写一个不使用 While 循环的快速幸存者函数。

练习。假设我们在绕圈时不是跳过一个人然后移除下一个,而是跳过两个人然后移除下一个。请为此过程编写一个幸存者函数。你能否也为这种情况找到一个更快的 survive 函数?

 

 

NO.4

最佳解法 

如何让学习Wolfram Language更有趣(上)。

 

如何让学习Wolfram Language更有趣(上)。

Josephus问题的一个优雅解法出现在Graham、Knuth和Patashnik合著的《具体数学》(Concrete Mathematics,Addison Wesley,1994)一书中。该解法使用整数的二进制(即以2为底)表示,而非通常的十进制表示。因此,假设 xx 的二进制表示为 bkbk−1bk−2…b2b1b0bkbk−1bk−2…b2b1b0,其中 bk=1bk=1,且每个 bi,0≤i

如何让学习Wolfram Language更有趣(上)。

 

练习:试用这个新函数,并与之前定义的函数进行比较。

 

 

NO.5

3x + 1 问题 

如何让学习Wolfram Language更有趣(上)。

 

引言

在本章中,我们将研究一个看似简单的问题。然而,这个“简单”问题的解至今仍未被整个数学界攻克!该问题被称为“Collatz问题”,以1937年提出它的Luthar Collatz命名,或者更简单地,它被称为“3x + 1问题”。问题如下:从任意正整数开始。如果这个数是偶数,则将其除以2;如果是奇数,则将其乘以3再加1。对所得到的结果重复这一过程,并持续重复,只要尚未到达数字1。例如,从13开始,我们得到序列:13, 40 (3 × 13 + 1), 20 (40 / 2), 10, 5, 16, 8, 4, 2, 1。尝试一些其他数字,并根据结果提出一个猜想。Collatz猜想,无论最初选择哪个数字,序列总会到达1,然后进入循环:1, 4, 2, 1。如前所述,至今无人能够解决这个猜想。也许您将是第一个。

 

3x + 1问题的Mathematica函数

我们的首要任务是使用Mathematica将计算“自动化”。我们将定义一个函数 txpo,即三x加一函数,它将构成我们研究的基础。我们需要Mathematica函数 EvenQ 和 If。EvenQ 测试一个数以确定它是偶数还是奇数;如果是偶数则输出“True”,如果是奇数则输出“False”。If[x, y, z] 如果 x 为 True 则输出 y,否则输出 z。因此我们如下定义我们的函数:

如何让学习Wolfram Language更有趣(上)。

 

我们希望从某个正整数开始,反复应用 txpo。我们在第1章中看到,Mathematica 函数 Nest 可用于实现这一点;实际上,Nest 的一个变体——称为 NestList——在这里更为有用。NestList 不仅给出最终结果,还给出之前的所有结果。因此,如果我们想对数字 23 应用 txpo 30 次,可以输入以下内容。

如何让学习Wolfram Language更有趣(上)。

 

另一方面,如果我们尝试用相同的迭代次数来验证 27 的猜想,则会得到:

如何让学习Wolfram Language更有趣(上)。

 

因此,也许我们运行计算的次数还不够。尝试多运行几次。多少次才算足够?

如何让学习Wolfram Language更有趣(上)。

 

如果我们能让计算一直运行到出现期望的结果,那会很好;当然,这意味着如果期望的结果从未出现,计算将不会终止,或者如果耗时太长,我们可能没有耐心等待。唉!没有什么是完美的。Mathematica确实有一个在施加条件成立时持续运行的Nest函数,称为NestWhileList。这里我们要施加的条件是数字不等于1。在Mathematica中这可以表示为:(# ≠ 1) &。“&”告诉Mathematica将“# ≠ 1”视为一个函数,其中“#”作为变量。这通常提供了一种“即时”定义函数的快捷方式。这一次,我们的求值将是精确的。

如何让学习Wolfram Language更有趣(上)。

 

我们上述计算的成功表明,我们可以如下定义一个函数 g[x]:

如何让学习Wolfram Language更有趣(上)。

 

鼓励读者试验函数 g[x]。

为了验证3x+1 猜想对于不超过 10,000 的所有数都成立,我们可以运行以下计算:

如何让学习Wolfram Language更有趣(上)。

 

回想一下,在 Mathematica 中分号用于分隔计算中的各个步骤,而最后一步才是输出;以“;”结尾表示 Mathematica 将不会产生输出——毕竟我们不想看到 10,000 个结果,只要知道它们都能完成,即最终到达 1 就足够了(在我们计算机上耗时不到 5 秒!)。

 

练习。验证 3x + 1 猜想对于不超过 100,000 的所有数成立。注意,只需检查奇数即可(为什么?)

 

研究一个数到达 1 之前所需的“时间”长度也很有趣。从 27 开始,到达 1 需要 112 步,但如果从 29 开始,只需 19 步,如下计算所示。当然,不难看出到达 1 所需的步数没有上界——只需取越来越大的 2 的幂次即可!

如何让学习Wolfram Language更有趣(上)。

 

尽管如此,我们声称,就其规模而言,27 似乎异常。如果将步数计算除以起始数的大小进行“归一化”,这一点就变得明显了。因此,我们首先如下定义一个函数 h,然后使用 DiscretePlot 来展示这一现象。我们任意选择了范围 [i, 5, 100];请尝试其他选择。此外,我们添加了选项 “PlotRange→All”;否则较高的值会被截断。该图表明,在所指示的范围内,27 确实异常。您也可以轻松探索其他范围。

如何让学习Wolfram Language更有趣(上)。

 

一些类似的问题

现在假设我们将原始问题中的“3x + 1”替换为“3x + 5”,从而改变问题。因此我们必须将 txpo 替换为 txpf,并将 g 替换为 k,其中 txpf 和 k 定义如下:

如何让学习Wolfram Language更有趣(上)。

 

目前尚不确定这个新函数的行为如何。它是否也“走向”一个固定值,且该值是否也是1?

 

练习:根据您的实验,提出一个猜想。

练习:研究 5x+15x+1 和 5x+35x+3 的类似问题。

 

 

NO.6

素数

如何让学习Wolfram Language更有趣(上)。

 

我们将使用Mathematica来研究素数的一些性质。素数是那些恰好有两个除数(即1和它本身)的正整数p。(因此1不是素数。)我们的首要任务是能够列出1到n之间的所有素数。我们通过从区间{1, n}中的数中移除所有2的倍数、所有3的倍数等来实现。

 

寻找素数

Mathematica 有几个用于生成和研究素数的程序。下面我们将考虑其中一些。不过,首先我们将使用古老的“筛法”思想——从正整数列表中先划掉 2 的倍数,再划掉 3 的倍数,依此类推——来编写我们自己的找素数程序。这将使我们能够介绍一些基本的 Mathematica 编程技术和函数。

 

下面这个简短的程序 sieve 使用了 Mathematica 函数 While、Do 和 DeleteCases。我们首先设置 primes 等于列表 {1,2,3,…,n},即 primes = Range[n];同时设置变量 s 初始为 2。然后我们让 Mathematica 用命令 Do[primes[[i]] = 0, {i, 2s, n, s}] 将 2,3,4,… 的倍数替换为 0。其中 [[i]] 是序列的第 i 项,而 {i, 2s, n, s} 指示 Mathematica 对于从 2s 到 n、步长为 s 的 i,将序列 primes 中的第 i 项替换为 0。注意第 i 项就是数字 i 本身,因此我们实际上是在序列中将 i 替换为 0。所以当 s = 2 时,Mathematica 替换 4, 6, 8, …。完成此操作后,s 通过命令 s = s + 1 增加 1,并且如果 s

如何让学习Wolfram Language更有趣(上)。

 

Mathematica 有一个用于测试数是否为素数的内置函数 PrimeQ。请在若干正整数上尝试使用它。

如何让学习Wolfram Language更有趣(上)。

 

我们可以通过将 PrimeQ 与 Select 结合使用,来列出某个区间内的素数。

如何让学习Wolfram Language更有趣(上)。

 

测试整数是否为素数的一种等价方式是使用 Mathematica 函数 Primes 和 Element。因此,要对 19 和 21 重复上述测试,可以使用以下方式。

如何让学习Wolfram Language更有趣(上)。

 

更简洁地说,

如何让学习Wolfram Language更有趣(上)。

 

如何让学习Wolfram Language更有趣(上)。

素数生成二次式

们将编写一个非常简短的程序来计算结果。程序的输入将是40个数字的列表:

{1,2,3,…,40}。Mathematica有一种使用函数Range生成此类列表的简洁方式。在新单元格中输入:Range[40]

然后按住Shift键同时按回车键。尝试在该函数中输入除40以外的其他值。

 

练习。 证明当 0≤n≤390≤n≤39 时,这个二次式能生成40个素数。对于更大的 nn 值呢?提示:你可以通过 (#2+#+41)&/@Range[0,39](#2+#+41)&/@Range[0,39] 轻松生成待测试素性的列表,其中 f/@wf/@w 表示将函数 ff 应用于列表 ww 的每个元素后得到的列表。另一种方法是使用 Table:Table[i^2 + i + 41, {i, 0, 39}] 来生成该列表。

 

接下来我们研究正整数中素数的“密度”。我们考察区间 [1,…,n][1,…,n] 中素数的个数与 nn 的比值。Mathematica 有一个内置函数 PrimePi 用于计算该区间内素数的个数,我们将使用它。例如,要找出小于 1000 的素数个数,

如何让学习Wolfram Language更有趣(上)。

 

或者,我们可以使用 Length[sieve[n])。

如何让学习Wolfram Language更有趣(上)。

 

我们不打算计算该函数的值,而是使用 Plot 命令对其绘图。

如何让学习Wolfram Language更有趣(上)。

 

这个图让19世纪的数学家联想到了1/Log[x].的图形。

 

如何让学习Wolfram Language更有趣(上)。

 

事实上,可以证明当 x→∞x→∞ 时,prdensity[x] 与 1log⁡[x]log[x]1 的比值趋近于1,这一重要结果被称为素数定理。

 

练习 :对越来越大的 x 值计算该比值。

 

 

孪生素数

孪生素数是指相差为2的一对素数;例如,(5,7)是孪生素数,(17,19)也是。我们希望找出小于某个数的所有孪生素数。首先使用上面定义的函数 primelist 列出区间{n,m} 内的所有素数。

然后使用 Select 结合 MemberQ,从 primelist 中选取满足 #+2 也属于 primelist 的元素 #。

如何让学习Wolfram Language更有趣(上)。

 

接下来,我们展示如何从这些列表重新构造孪生素数对。

 

我们希望列出这两个列表中对应元素组成的数对。使用 Mathematica 命令 MapThread。给定两个列表 {a,b,c} 和 {d,e,f} 以及一个函数 h,命令 MapThread[h, {{a,b,c},{d,e,f}}] 将 h 应用于这两个列表的对应元素。

如何让学习Wolfram Language更有趣(上)。

 

这里我们需要函数h[x,y]={x,y}。

如何让学习Wolfram Language更有趣(上)。

 

数学中最著名的未解问题之一是孪生素数猜想,它断言存在无穷多对孪生素数。

 

练习:找一些大的孪生素数对。

练习:将素数之间的“间隔”2替换为其他偶数,并在大区间中找到一些这样的数对。这些数对的“密度”与孪生素数的密度相比似乎如何?

 

梅森素数与完全数

形如 2n−12n−1 的素数称为梅森素数,以17世纪研究它们的法国神父马林·梅森的名字命名。

 

练习: 找出所有小于1000的梅森素数。提示:首先生成小于 210210(=1024=1024)的形如 2n−12n−1 的数;然后从该列表中选出素数。

 

如果一个正整数等于其所有正真因子之和,则称它为完全数。注意,数本身不是它自己的真因子。因此6是完全数,因为 6=3+2+16=3+2+1。同样,28也是完全数,因为 28=14+7+4+2+128=14+7+4+2+1。要找出所有小于1000的完全数,我们可以使用 Mathematica 的测试函数 PerfectNumberQ。此外,Mathematica 函数 PerfectNumber 会给出第 n 个完全数。

如何让学习Wolfram Language更有趣(上)。

 

如果 pp 是梅森素数,则 p(p+1)/2p(p+1)/2 是完全数。这是欧几里得证明的!事实上,欧拉证明了所有偶完全数都具有这种形式。我们可以使用 Mathematica 的 Solve 函数轻松验证这一结果。例如,以下代码验证了欧拉关于 8128 的结果。

如何让学习Wolfram Language更有趣(上)。

 

练习:找一些更大的完全数并验证欧拉的结果。

 

目前尚不清楚是否存在无穷多个完全数,也不清楚是否存在奇完全数。

然而,欧几里得证明了,只要 (2ρ−1)(2ρ−1) 是(梅森)素数,则 2ρ−1(2ρ−1)2ρ−1(2ρ−1) 总是一个偶完全数。

欧拉证明了所有偶完全数都具有这种形式。

 

练习:对前10个完全数验证欧拉的结果。

 

索菲·热尔曼素数

若素数p 满足2p+1 也是素数,则称p 为索菲·热尔曼素数。

 

练习: 找出所有小于 10,000 的索菲·热尔曼素数。

 

整数分解为素数

Mathematica 可以使用命令 FactorInteger 轻松地将整数分解为其素数因子。结果是一个数对列表,其中第一个元素是素数,第二个元素是该素数在分解中应取的幂次。

如何让学习Wolfram Language更有趣(上)。

 

我们也可以使用 FactorInteger 来分解一个数字列表。如果你查询 FactorInteger(?FactorInteger),你会在“范围”下看到,它会逐元素地在线程化方式下处理列表。这允许进行以下计算。然而,如果你需要分解非常大的整数,请准备好等待很长时间!

如何让学习Wolfram Language更有趣(上)。

 

哥德巴赫猜想

数学中一个非常著名的未证明猜想是哥德巴赫猜想,它断言每个大于4的偶数都可以写成两个奇素数之和。我们可以使用 FindInstance 来研究它。因此,要证明这对582成立,我们可以计算以下内容。

如何让学习Wolfram Language更有趣(上)。

 

练习:使用 FindInstance 证明哥德巴赫猜想对于不超过600的偶数成立。

 

对于偶数n≥670,FindInstance 无法返回结果。

 

不过,还有另一种方法可以验证哥德巴赫猜想对不超过某个界限的偶数成立。思路是从一个初始素数段开始,如下所示。

如何让学习Wolfram Language更有趣(上)。

 

然后,我们使用 Tuples[ , +2] 从该列表生成所有二元组列表。

接着,我们使用 Plus 对这些二元组求和,并将其线程化(threading)应用于这些列表。我们使用的命令是

Apply[Plus, Tuples[pr[50], 2], {1}] 或其简写形式 Plus@@@Tuples[pr[50], 2]。(查阅 Apply。)最后,我们在其前面加上 Union 以消除重复项,从而形成最终列表,该列表包含能表示为两个素数之和的所有数。

如何让学习Wolfram Language更有趣(上)。

 

注意,在列表末尾,一些偶数缺失;推测它们会在后续列表中出现。更一般地,我们在下面定义函数 goldbach。

如何让学习Wolfram Language更有趣(上)。

 

练习: 使用函数 goldbach 研究哥德巴赫猜想。特别地,证明 670 满足该猜想。

不必检查特定数字的列表,而是使用 MemberQ[List, a] 来表明 a 是否属于 List。

你能验证哥德巴赫猜想的最大偶数是多少?

 

欧拉乘积公式

1737年,L·欧拉证明了一个涉及无穷和、无穷乘积以及素数的非凡公式。

 

首先我们介绍Mathematica中的求和与求积函数。Sum 和 Product 是每个Mathematica用户都需要知道的函数。要求前100个正整数之和,可以输入:

如何让学习Wolfram Language更有趣(上)。

 

如果我们想要前 nn 个正整数之和,可以输入:

如何让学习Wolfram Language更有趣(上)。

 

因此,得到了这个和式的著名公式。如果我们使用面板中的“基本数学助手”,可以按照如下方式使用标准的 Σ- 符号:

如何让学习Wolfram Language更有趣(上)。

练习。 使用 Mathematica 找出:

如何让学习Wolfram Language更有趣(上)。

的等式。

 

类似地,我们可以使用 Product 或 ∏∏。

 

在 Sum 或 Product 中,上界可以是 Infinity(或 ∞)。因此,

如何让学习Wolfram Language更有趣(上)。

 

最后一个结果是下面定义的黎曼ζ函数的一个特例。

如何让学习Wolfram Language更有趣(上)。

 

最后一个结果是下面定义的黎曼ζ函数的一个特例。

如何让学习Wolfram Language更有趣(上)。

 

我们也可以定义涉及无穷乘积的函数,例如,其中 Prime[i] 是第 i 个素数。

如何让学习Wolfram Language更有趣(上)。

 

练习: 证明上面定义的两个函数 ζ,ηζ,η 在 s=2,…,100s=2,…,100 上相等。提示:使用 Table 和 == 来验证这一点。
这一般性结果,即这两个函数对所有 s>1s>1 相等,由 L. Euler 于1737年给出,被称为黎曼ζ函数的欧拉乘积公式。

评论