1994年,美国数学家PeterShor做出了一项惊人的工作,他指出,如果使用量子计算机,则因子分解算法的运算量仅为O?L2log?L?loglog?L??。
完全数。所谓完全数是指它的所有因子(除去它本身)之和等于该完全数。例如,6是一个完全数,因为6的因子为1,2,3且1十2十3=6。下一个完全数是28。请读者找出10 000以内的所有完全数,并对它做素因子分解。你能据此猜测完全数的通式吗?完全数与Mersenne素数有何联系?你能由此找到更多的完全数吗?是否存在奇完全数?完全数是否有无穷多个?
除6以外,完全数都有一个奇妙的特性,就是每个完全数可以表为几个连续奇数的奇次数次方之和,如28?1?3。请你对你找出的完全数验证此特性。 孪生素数。所谓孪生素数是指差为2的两相邻素数。孪生素数是否有无穷多个? Bertrand猜测。当n?3时,n与2n?2之间至少存在一个素数。
青一色数的素性。由n个l组成的数l l…1叫做青一色数。当n为何值时,青一色数是素数?如果青一色数是合数,如何将它做素因子分解?
33三、实验方案
3.1 素数的判别与个数
在素数研究中,一个最基本的问题是素数到底有多少个,是否是无穷的。 规定Nn?p1p2?pn?1,当n?1,2,?,20时判断Nn是否是素数,如果不是,那么Nn能不能表示成几个素因子相乘的形式。
调大n至25,观察并得出结论。
再将n调至30,35……,结论是否发生了变化。
根据以上的结果,猜测素数是否有无穷多个,并给出相关的证明。
3.2素数表的构造
给出一个范围,用Eratosthenes筛法和试除法列出该范围内所有的素数。
在两者都能实现我们实验目标的情况下比较Eratosthenes筛法和试除法这两种方法的有效性。
比较同样是列出1000以内的素数,看哪种方法用的时间比较少。
将范围调大,用这两种方法列出10000,100000……以内的素数,再比较它们所用的时间,以此来确定这两种方法的有效性。
3.3素数的判别公式
观察mn?1被n整除所得的余数。
将m的值固定,变化n的值为2,3,……100。 取m=2,观察2n?1被n整除所得的余数; 取m=3,观察3n?1被n整除所得的余数; 取m=4,观察4n?1被n整除所得的余数; ………
如果我们固定的是n的取值,变化m的值,那么我们得出的结果又会怎样? 取n=2,m=2,3,4,……,20,观察m2?1被2整除所得的余数;
取n=3, m=2,3,……,20,观察m3?1被3整除所得的余数; 取n=5, m=2,3,……,20,观察m5?1被5整除所得的余数; ………
得出一般性结论,并加以证明。
观察并考虑Mersenne数与n的关系,得出一般性的结论,加以证明。
3.4生成素数的公式
Fermat数是否都是素数?在程序中增大n的值,很容易知道当n变大到一个特定的值时,Fermat数不再是素数。
既然Fermat数不能作为素数的生成公式,那么能不能寻求一个整系数单变量多项式,使得它能生出所有的素数。
一次多项式显然不行。先考虑二次多项式,例如:f(n)?n2?n?41,
f(n)?n2?79n?1061,f(n)?6n2?6n?311,观察是否无论n如何变化,f(n)都是
素数。若不是,再改变多项式的次数,令f(n)?2n3?2n2?2n?1,
f(n)?n4?2n3?2n2?2n?31,……,观察变量n的次数不断升高,观察得出的结果
有什么不同。
若单变量整系数多项式不能生成所有的素数,那么多变量整系数多项式呢?考虑两个变量的函数f(n,m)?n?m?3 ,将两个变量的多项式的次数变为二次,例如
f(n,m)?n2?m2?4,再改变为三次的,例如f(n,m)?n4?n3?n2?m3?m2?4,逐步
升高多项式的次数,观察以上的f(n,m)是否生成的均是素数,它们之间有什么规律?
若还是无法找出这样的两个变量整系数多项式,再改变多项式的变量的个数和次数。
3.5素数的分布
用?(n)表示不超过n的素数的个数,?(m,n)表示区间[m,n]内素数的个数,再计
,1100)﹑?(10000)以及?(100,200)﹑?(1000,10100)﹑算?(100)﹑?(1000)﹑?(10000?(100000,100100)。从计算结果看,随着范围的扩大,素数是越来越稀还是越来越密?进一步,选取一些更长的区间,做同样的实验。将这些点画在图中,从图中能更清晰的看出素数的分布情况。
换一个角度考虑,从两个相邻素数间距的大小同样也可以看出素数的分布,这时我们还可以发现一些更有趣的规律。先求出1000以内的所有相邻素数的间距,并将点以(pn,dn)的形式画在直角坐标系中,观察图像的特点;增大n的值,再在
另一个图中画出,从这些点的分布可以看出素数的间隔值的某些特征,以及它们的重复次数的多少,我们还发现:在增大n的值的同时,图中的点也会随之变高,也就是说最大间隔值在变化,那么,存在最大间隔值吗?给出结论及相关证明。
3.6 用函数对素数的个数进行拟合
用函数对素数的个数进行拟合。先进行线性拟合,选取2到1000中所有的素数进行拟合,再改变拟合的多项式的次数,比较拟合效果。 将点(n, ?(n))标在平面坐标系中,并且用折线把这些点连接起来,观察?(n)的变化趋势,然后在程序中增大n的值,再观察?(n)的变化趋势,将?(n)的值与其它函数的值进行比较,看能否找出最接近?(n)的值的函数,即计算素数个数的公式,注意此时n应该充分大。
探索实验二 非线性迭代
一、实验背景与实验目的
迭代是数学研究中的一个非常重要的工具,通过函数或向量函数由初始结点生成迭代结点列,也可通过函数或向量函数由初值(向量)生成迭代数列或向量列。 蛛网图也是一个有用的数学工具,可以帮助理解通过一元函数由初值生成的迭代数列的敛散性,也帮助理解平衡点(两平面曲线交点)的稳定性。
本实验在Mathematica平台上首先利用蛛网图和迭代数列研究不动点的类型;其次通过蛛网图和迭代数列研究Logistic映射,探索周期点的性质、认识混沌现象;第三通过迭代数列或向量列求解方程(组)而寻求有效的求解方法;最后,利用结点迭代探索分形的性质。
二、实验材料
2.1迭代序列与不动点
给定实数域上光滑的实值函数f(x)以及初值x0,定义数列
xn?1?f(xn),n?0,1,2,? (2.2.1) {xn}称为f(x)的一个迭代序列。
函数的迭代是数学研究中的一个非常重要的思想工具,利用迭代序列可以研究函数f(x)的不动点。
对函数的迭代过程,我们可以用几何图象来直观地显示它——“蜘蛛网”。运行下列Mathematica程序:
Clear[f]
f[x_] := (25*x - 85)/(x + 3); (实验时需改变函数) Solve[f[x]==x , x] (求出函数的不动点)
g1=Plot[f[x], {x, -10, 20}, PlotStyle -> RGBColor[1, 0, 0], DisplayFunction -> Identity];
g2=Plot[x, {x, -10, 10}, PlotStyle -> RGBColor[0, 1, 0],
DisplayFunction -> Identity]; x0=5.5; r = {};
r0=Graphics[{RGBColor[0, 0, 1], Line[{{x0, 0}, {x0, x0}}]}]; For[i = 1, i <= 100, i++,
r=Append[r, Graphics[{RGBColor[0, 0, 1], Line[{{x0, x0},
{x0, f[x0]}, {f[x0], f[x0]}}] }]]; x0=f[x0] ];
Show[g1, g2, r, r0, PlotRange -> {-1, 20}, (PlotRange控制图形上下范围) DisplayFunction -> $DisplayFunction] x[0]=x0;
x[i_]:=f[x[i-1]]; (定义序列) t=Table[x[i],{i,1,10}]//N ListPlot[t] (散点图)
观察蜘蛛网通过改变初值,你能得出什么结论?
如果只需迭代n次产生相应的序列,用下列Mathematica程序: Iterate[f_,x0_,n_Integer]:=
Module[{ t={},temp= x0},AppendTo[t,temp]; For[i=1,i <= n, i++,temp= f[temp]; AppendTo[t,temp]]; t ]
f[x_]:= (x+ 2/x)/2; Iterate[f,0.7,10]
设f?x?是一个定义在实数域上的实值函数,如果存在u使得f?u??u,则称u为f?x?的不动点。我们用u?u表示这件事。如果所有附近的点在选代过程中都趋向于某个不动点,则该不动点称为吸引点,有时也称该不动点是稳定的。如果所有附近的点在选代过程中都远离它而去,则该不动点称为排斥点,有时也称该不动点是不稳定的。
如果f(u1)?u2,f(u2)?u3,…,f(uk)?u1且ui?uj,j?1,2,?,k,则
u1,u2,?,uk形成一个k循环,u1称为一个k用u1?u2???uk?u1记这个事实。
周期点,u1,u2,?,uk称为一个周期轨道。显然,不动点就是周期为1的周期点。类似于不动点,如果所有附近的点在迭代过程中都趋向于某个周期点,则该周期点称为吸引点;如果所有附近的点在迭代过程中都远离它而去,则该周期点称为排斥点。如果点u最终落于某个循环之中,则称它是一个预周期点。例如,l是f(x)?x2?1的预周期点。
2.2 Logistic映射与混沌
从形如f?x??ax?1?x?的二次函数开始做迭代
xk?1?f?xk? k?0,1,? (2.2.2)
这里,a??0,4?是一个参数。对不同的a系统地观察迭代(2.2.2)的行为。Mathematica程序:
IterGeo[a_, x0_] :=
Module[
{p1, p2, i, pointlist = {}, v= x0, fv= a*x0*(1 - x0)},
p1=Plot[ {a*x*(1 - x), x}, {x, 0, 1}, DisplayFunction -> Identity]; AppendTo[pointlist, {x0, 0}];
For[i = 1, i < 20, i++, AppendTo[pointlist, {v, fv}]; AppendTo[pointlist, {fv, fv}]; v= fv; fv= 4*v*(1 - v)];
p2=ListPlot[pointlist, PlotJoined -> True, DisplayFunction -> Identity];
Show[{p1, p2}, DisplayFunction -> $DisplayFunction] ]
IterGeo[2.6, 0.3]
将区间(0,4]以某个步长?a离散化,对每个离散的a值做迭代(2.2.2),忽略前50个迭代值,而把点?a,x51?,?a,x52?,…,?a,x100?显示在坐标平面上,最后形成的图形称为Feigenbaum图。Mathematica程序:
Clear[f, a, x]; f[a_, x_] := a*x*(1 - x);
x0 = 0.5; r = {}; Do[
For[i = 1, i <= 300, i++, x0 = f[a, x0];
If[i > 100, r = Append[r, {a, x0}]] ],
{a, 3.0, 4.0, 0.01}]; ListPlot[r]
从极限分支点之后,Feigenbaum图显得很杂乱,似乎没有任何规律。实际上,对任何初始值做迭代都会得到同样的结果。这就是所谓的混沌现象。迄今为止,混沌并没有确切的数学定义,但它具有一些基本的特性,如对初值的敏感性以及某种无序性,由此产生类似于随机的现象。
所谓一个迭代对初值是敏感的意思是,无论两个初值如何接近,在迭代过程中它们将渐渐分开。这是任何一个混沌系统都具有的特性之一,这种特性使得混沌系统会产生似乎是随机的、没有规律的现象。在Logistic映射中,取a?4,任取两个初值使得它们之间的差的绝对值不超过0.l,运行下列程序,观察结果后回答问题:在迭代过程中它们逐渐分开吗?如果两个初值之间的差的绝对值不超过0.01,0.001,结果会如何?由此得出,函数f?x??4x?1?x?的迭代对初值是否敏感?其Mathematica程序:
Module[
{pilist = {}, i, temp1=x01, temp2=x02},
For[i=1, i <= n, i++, temp1=4*temp1*(1-temp1); temp2=4*temp2*(1-temp2);
AppendTo[pilist, {i, temp2-temp1}]; ];
ListPlot[pilist, PlotJoined -> True] ]
Sensitivity[50, 0.1, 0.1001]
Sensitivity[n_Integer, x01_, x02_] :=
一个简单的、确定的二次选代可以产生非常复杂的、看似随机的行为。但是,混沌不等于随机。实际上,在混沌区域之内,蕴涵着许多有序的规律。这正验证了哲学上的名言:有序中包含了无序,无序中包含着有序。其Mathematica程序: