2,3,5,7,11,13,19,23,27......这样一个数列,你能找到规律吗?
好吧对于你来说可能有些困难,你大可以放下手中的笔听我慢慢讲述。
我所要讲的,不是素数的分布,但却与素数有着很大的联系。
那就先明确一下目标,它是一个简短的式子:
当然方法不唯一,这里就有一个简单的方法:
这个方法没啥问题,但它又似乎太过简短,我们无法体验到做完难题后的美好感受,没有激动、兴奋和喜悦……而且,我们学不到多少东西。
最重要的是,对于某些人来说,它超纲了——用到了微积分。
但我想分享的是另一个方法,它不需要任何前置知识,我将其称之为“基础”,但“基础”并不意味着简单,相反,你需要一个绝顶聪明的大脑。
那就不再铺垫,直接开始吧!
有π就有圆。那么建立起一个坐标系,并画上一个半径为R的圆,而我想让你做到,是找出圆内所有的整数坐标点的个数。
你可能会在连续半径下寻找规律,但似乎毫无规律。那么抓住线索——整数坐标点。比如(2,3)这个点,你算得它离原点的距离为,根号下的数是整数。普遍地看整个坐标系,任何一个整数坐标点到原点的距离为,N为非负整数。利用这个线索,我们可以找到半径为的圆的圆周经过的整数坐标点的个数,设其为P(N),即定义函数P(N)表示半径为的圆的圆周上整数坐标点的个数。
如图,上图的圆经过了12个点,它的半径为,所以P(25)=12。
这样做的原因是为了对圆内的点进行分类,从而简化问题。
注:这里为了更直观,只化了过了整数坐标点的圆,实际上还有一些不经过的,如半径为的圆,它的圆周不会经过任何整数坐标点,所以P(3)=0。
对比两张图,那么就表示为半径为的圆内所有的整数坐标点的个数,就这么一圈一圈的相加……
接下来就是求P(N)这个函数了。
先来看一个简单的例子,P(5)=?其实这挺简单的。
共8中方式(对应8个坐标),所以P(5)=8。
但这么长一串的式子太繁杂,不如将它表示为5=(2+i)(2-i),其中i为虚数单位,。
这样做,不单只是简化,而是有一定原因的,在知道原因之前,你应该晓得:扩充数域,总会给我们意想不到的惊喜!!!
如果你还不了解复数,这里会给出一个简单的说明(当然你也可以跳过):
一个数乘上-1会得到它的相反数,在数轴上就是绕原点旋转180度,而,乘上两个i得到了-1旋转了180度,那么乘一个i就表示绕原点旋转90度,我们就开辟出了新的坐标系统。
其中横轴为实轴,纵轴为虚轴,这个平面就叫做复平面,形如a+bi的数就是复数。
回归正题,5=(2+i)(2-i)只给出了2+i和2-i两个点,不是一共有8个点吗?其它6个呢?
其实还有5=(-2+i)(-2-i)=(1+2i)()1-2i)=(-1+2i)(-1-2i)
仔细观察你会发现这些式子都是原来的一个式子乘上-1,i,-i后的结果,而且这也很容易通过图像理解。为方便表达,我把最开始得到的式子称为一对“共轭基数”(共轭对指a+bi和a-bi,而这种数特别的地方在于“基”这个字,它乘-1,i,-i后就是其它共轭对了,它创造了这些数,所以叫做“基数”),而其中不能再分解的数被称为“高斯素数”。5等于两个共轭基数相乘,分别乘了1,-1,i,-i得到了4对共轭对,那么它就有8个分解出来的高斯素数,而刚好在这里这些高斯素数就是它所经过的整数坐标点的个数。
所以P(5)=2*4=8 2表示共轭基数的个数,4是因为它乘了1,-1,i,-i(多次强调,你会了吗?)
再来看P(25),
它由4个高斯素数相乘得来,能分配出(3+4i),(3-4i),5三个基数,因此P(25)=3*4=12。再由上面图像检查是对的。
再看到P(125),
,你得到了这两种不重复的分配方式,并得到了四个基数即两对共轭基数。所以P(125)=4*4=16。
到此,规律也十分明显了:。但是并不一定完全有规律,你需要仔细想想,多找几个例子,比如求P(625),寻找更普遍的规律且有依据。实际上,,当n为奇数时,它能分成2n个高斯素数相乘,然后你能找到种不同的分配方式(这是肯定的),那么此时就有n+1个基数,;当n为偶数时,它也能分成2n个高斯素数相乘,可它有个高斯素数分配方式和一个整数分配方式(即),但它竟然也能有n+1个基数,因此在此时依然成立.
实际上不只是5,其它能分解的素数都有这样的规律。比如
等,你会发现这些都是4n+1这个类型的素数,那么除掉4n+1和2n(这是肯定的不是素数),正整数范围内就只剩下4n+3这个类型的素数不能分解了,如3,7,19等。
关于此,我确信已发现了一种美妙的证法,可惜这里空白的地方太小,写不下。所以你可以试着去证明它!!!
再来个例子 ,的每对基数和的每对基数组成了新的一对基数,其中有2对,有1.5对,分别配对就得到对,但其实每对有两种分配方式,比如不仅可以等于还可以等于,因此更准确地说是能分成6对,就有12个基数。
所以,整体来看是(这个数太大,所以不能可视化了)
普遍地对于任何可分解素数p都满足:
再来看一下4n+3型的素数,因为它不能分解,所以P(4n+3)=0,但它的平方就有路走了,比如P(9),,它有一个基数3,所以。
再来个例子P(15)=? ,多出来的这个3导致无法产生共轭对,所以P(15)=0,
但如果再多一个3的话:,所以P(45)=8。
这就要看3的指数是奇数还是偶数了,除了3,其它的4n+3型素数也一样。
最后特别说下最特殊的素数2,它并不是不能分解:,但是,也就是说它只有一个基数。所以。因为2只有一个基数,所以一个数乘了2后并不会改变它经过的整数坐标点的个数。
如图,
到此,我们就搞懂了P(n)这个函数,但它的函数值出现地也太没规律了吧!于是我们需要找到另一种表达方式,就是一个不错的表达方式(是希腊字母,读作/kaɪ/),这个函数定义得十分精妙:,, 是否感到有些眼熟?这不分类嘛!!!把全体正整数带进去会得到……就这么1,0,-1,0地循环,即复平面中1一直乘i后结果的实部。
而且它还是个“积性”函数,意思是,你可以代数进去验证,而且这个挺好证明的,你自己就可以试一下。
很多时候,人们往往无法理解分类的意义,但当你在生活中去应用它的时候,有些无序的东西立马就变得有条理起来,数学也一样。
看P(45)这个例子,在经过上文的训练过后你很容易算得P(45)=8,然后你会神奇地发现:
再利用积性性质打开括号得到:
其中的输入值竟然为P(N)函数输入值的因数!!!而且这规律对于所有的正整数都适用。这也很好理解,就是括号里每一项分别相乘的结果。
那么——
R越大,圆内的整数坐标点越密,约等号两
边越相近。再观察,每一部分都有X(1),每两部分有X(2),每三部分有X(3)……
当R趋于无穷时,两式就可以划等,此时约掉两边的,移个项,就得到了最开始的那个式子了:
跑了好久才跑出来的,电脑都要炸了啊啊!!
补充:上式所算的没有P(0)这一项,而它只有一个原点,相对于圆内无穷多个点就显得微不足道,故省去。
尾声:
我第一次看到这个时也十分震惊,这与作业本上的不同,它是美妙的,也许生活中用不到它,但它却给我带来了最美好的感受。
对于数学,它不应该是追名逐利的工具,我不希望用它来比高下,它从来不在于你做了多少练习题,而在于你对它的深入理解。
我想与他人分享这样的美好感受,这也是我做此科普的初衷。这是我的第一次科普,前后改了三四遍,也花了我大量时间。我尽力地去讲述清楚和简化内容,也用到了通俗的语言呈现在你的面前。就像前面所说的,它不会用到高深的数学知识。
有人说,做这样的难题没有实际意义。可能确实是这样,它没有傅立叶变换之类的数学工具好用,但你却能通过它获得了美好感受,还探讨了素数、复数和π之间的联系。而它们似乎与一个神奇的函数——黎曼ζ函数有一些关联。
这是一个神奇的式子,它由欧拉提出的两个式子组成: 和。
3b1b的创始人Grant曾经做了一个关于滑块碰撞撞出π的科普。
(HTTP://www.bilibili.com/video/BV1nt411p7F9?share_source=copy_web)
他在一次演讲上说道:“一个从事量子力学的科研人员找到我,说他把这(滑块碰撞)应用到量子力学去了!”是的,这令人震惊,有谁能想到数字会在这里出现呢?我想,也许这就是我们研究数学的原因——它总能给我们意想不到的惊喜和艺术的感受!
终于写完了,累死我了!!!其实我很早就想在里世界做科普了,在学校一直在写稿子(大部分时间是在数学课上),又排了一下午的版,做的也还是挺用心的吧。
以下是做可视化的代码,可视化工具:manim
from manimlib.imports import *
class crea(Scene):
def construct(self):
i=5
R=np.sqrt(i)#半径
tex=TexMobject("R=\\sqrt{5}").to_edge(UL)
dot=Dot(color=RED,radius=0.3/R)
circle=Circle(radius=3.5)
grif=NumberPlane(
x_min=-2*R,x_max=2*R,
y_min=-1.5*R,y_max=1.5*R,
).scale(3.5/R)
self.add(circle,grif)
self.play(Write(tex))
for y in range(-int(R)-1,int(R)+2):
for x in range(-int(R)-1,int(R)+2):
if np.sqrt(x*x+y*y)<=R:
dot=dot.copy().move_to(
np.array([x*3.5/R,y*3.5/R,0])
)
self.add(dot)
self.wait()
class allcir(Scene):
def construct(self):
i=25
R=np.sqrt(i)#半径
tex=TexMobject("R=\\sqrt{25}").to_edge(UL)
dot=Dot(color=YELLOW,radius=0.07)
circle=Circle(radius=R,stroke_width=1,color=WHITE).scale(0.7)
new_cir=Circle()
grif=NumberPlane(
x_min=-10,x_max=10,
y_min=-8,y_max=8,
).scale(0.7)
self.add(circle,grif)
self.play(Write(tex))
for y in range(-int(R)-1,int(R)+2):
for x in range(-int(R)-1,int(R)+2):
if np.sqrt(x*x+y*y)<=R:
dot=dot.copy().move_to(
np.array([x*0.7,y*0.7,0])
)
new_cir=circle.copy().scale(
np.sqrt((x*0.7)**2+(y*0.7)**2)/(R*0.7)
)
self.add(dot)
self.add(new_cir)
self.wait()
class outcir(Scene):
def construct(self):
i=25
R=np.sqrt(i)#半径
tex=TexMobject("R=\\sqrt{25}").to_edge(UL)
dot=Dot(color=RED,radius=1/R)
circle=Circle(radius=3.5)
grif=NumberPlane(
x_min=-2*R,x_max=2*R,
y_min=-1.5*R,y_max=1.5*R,
).scale(3.5/R)
self.add(circle,grif)
self.play(Write(tex))
for y in range(-int(R)-1,int(R)+2):
for x in range(-int(R)-1,int(R)+2):
if np.sqrt(x*x+y*y)==R:
dot=dot.copy().move_to(
np.array([x*3.5/R,y*3.5/R,0])
)
self.add(dot)
self.wait()
class numl(Scene):
def construct(self):
t=TexMobject("\\times(-1)")
od=Dot(radius=0.15).move_to(np.array([0,0,0]))
o=TextMobject("O").next_to(od,DOWN)
axis=NumberLine(x_min=-8,x_max=8)
dot1=Dot(radius=0.1,color=RED).shift(LEFT*2)
dot2=Dot(radius=0.1,color=RED).shift(RIGHT*2)
arc=Arc(angle=PI,radius=2,buff=4).add_tip()
t.next_to(arc,UP)
alls=VGroup(axis,dot1,dot2,arc,t,od,o)
alls.shift(DOWN)
self.add(alls)
self.wait(3)
self.play(FadeOut(alls))
cpl=ComplexPlane().add_coordinates()
im=TextMobject("Im").shift(UP*3.5+RIGHT*0.7)
re=TextMobject("Re").shift(RIGHT*6.5+DOWN*0.7)
self.add(cpl,im,re)
self.wait()
最后于 2021-5-2
被皮蒂亚编辑
,原因: 字号