Ex.1(p20)若将y ← uniform(0, 1) 改为 y ← x, 则上述的算法估计的值是什么?
解:若将y ←uniform(0, 1) 改为 y ←x,此时有 ,则k++,即 ,此时k++,由于此时x ← uniform(0, 1),所以k/n=,则此时4k/n=2。
所以上述算法估计的值为2。
Ex.2(p23) 在机器上用 估计π值,给出不同的n值及精度。
解:由ppt上p21可知,的大小 ,其中k为落入圆内的数目,n为总数,且π=,即需要计算4k/n。
我们先令x ← uniform(0, 1),y ← uniform(0, 1)。
计算的值,如果小于等于1,那么此时k++。
最后计算4k/n的值即可估计此时的π值。
代码的主要部分为:
执行结果为:
结果分析:随着N的取值不断地增加,得到的π值也就越来越精确。
Ex.3(p23) 设a, b, c和d是实数,且a ≤ b, c ≤ d, f:[a, b] → [c, d]是一个连续函数,写一概率算法计算积分:
注意,函数的参数是a, b, c, d, n和f, 其中f用函数指针实现,请选一连续函数做实验,并给出实验结果。
解:的值为y=,y=0,x=a,x=b围成的面积。
根据之前的例子我们可以知道= k(b-a)d/n。
其中k是落在函数y=,x=a,x=b以及y=0所包围区间内的个数。
代码的主要部分为:
运行结果为:
结果分析:
随着N的取值不断地增加,得到的积分值越来越精确。
Ex4(p24). 设ε,δ是(0,1)之间的常数,证明:若I是的正确值,h是由HitorMiss算法返回的值,则当n ≥ I(1-I)/ε2δ时有:
Prob[|h-I| < ε] ≥ 1 –δ
上述的意义告诉我们:Prob[|h-I| ≥ε] ≤δ, 即:当n ≥ I(1-I)/ ε2δ时,算法的计算结果的绝对误差超过ε的概率不超过δ,因此我们根据给定ε和δ可以确定算法迭代的次数
()
解此问题时可用切比雪夫不等式,将I看作是数学期望。
证明:由切比雪夫不等式可知:
P( | X - E(X) | < ε ) ≥ 1 - D(X) / ε²
由题目知,E(X)=I。
且根据题意,我们可知,在HotorMiss算法中,若随机选取n个点,其中k个点在积分范围内,则 。
且k的分布为二项分布B(n,I)(在积分范围内或者不在
积分范围内),则 。
又因为k=x*n,所以D(X)=I(1-I)/n。
再将E(X)和D(X)带入切比雪夫不等式中即可得到
Ex5(p36). 用上述算法,估计整数子集1~n的大小,并分析n对估计值的影响。
解:由题知,集合的大小,通过计算新生成的集合中元素的个数来估计原集合的大小,代码的主体部分如下:
运行结果为(部分):
结果分析为:
我也分析不出啥,可能N的值太小了。
Ex6(p54).分析dlogRH的工作原理,指出该算法相应的u和v。
解:因为x = (y-r) mod (p-1)。
且r = log g,p( mod p) (由公式2),即 -r = log g,p 又因为 y = log g,p c
所以 x = (y-r) mod (p-1) = (log g,p c + log g,p) mod (p-1) = log g,p p
(由公式1)
又因为 c = ba mod p , b=g r mod p
即x = log g,p a*(g r
mod p)*= log g,p a
通过以上分析可以,该算法的u为 ba mod p , v为(y-r) mod (p-1)。
Ex7(p67). 写一Sherwood算法C,与算法A, B, D比较,给出实验结果。
解:Sherwood算法C的思想:
算法C在算法B的基础上做了一些改进,算法B取在val的前个数中找不大于x的最大整数y。
算法C则是在1~n中随机挑选个数,从中找出不大于x的最大整数y。
算法A,B,C,D的具体实现如下图所示:
通过寻找某一个数X,计算A,B,C,D算法在表中查找X所需的访问数组元素的次数来比较算法A,B,C,D的性能。
具体的执行结果如下图所示:
结果分析:
算法C的性能最优呀,还能说什么,总不能说这个算法不好吧。
Ex8(p77).证明:当放置(k+1)th皇后时,若有多个位置是开放的,则算法QueensLV选中其中任一位置的概率相等。
证明:当放置(k+1)th皇后时,假设有n个位置开放,记为S1,S2,…,Sn。
设选择位置Si时的概率为Pi。
如果Si被选中,此时必有uniform(1,…,i)=1,且对于所有的j>i,都有uniform(1,…,j)=0。
且P(uniform(1,…,i)=1) = 1/i。
P(uniform(1,…,j)=0) = (j-1)/j
所以:
Pi = (1/i * i/i+1 * … * n-1/n) = 1/n
即选择位置Si的概率为1/n,所以算法选中其中任意位置的概率相等。
Ex9(p83).写一算法,求n=12~20时最优的StepVegas值。
解:对于每个N,当stepVegas从1取到N,对于每一个stepVegas我们重复计算100次,使用一百次的平均成功率以及平均执行时间来描述此stepVegas的性能。
算法的主要代码如下图所示:
分别取N=12,13,14,…,20,对于每一个N,具体的执行结果如下图所示:
当N=12时,结果如下如所示,从图中我们可以看出此时的最优stepVegas为4:
当N=13时,结果如下如所示,从图中我们可以看出此时的最优stepVegas为4:
当N=14时,结果如下如所示,从图中我们可以看出此时的最优stepVegas为4:
当N=15时,结果如下如所示,从图中我们可以看出此时的最优stepVegas为5:
当N=16时,结果如下如所示,从图中我们可以看出此时的最优stepVegas为6:
当N=17时,结果如下如所示,从图中我们可以看出此时的最优stepVegas为6:
当N=18时,结果如下如所示,从图中我们可以看出此时的最优stepVegas为7:
当N=19时,结果如下如所示,从图中我们可以看出此时的最优stepVegas为7:
当N=20时,结果如下如所示,从图中我们可以看出此时的最优stepVegas为8:
结果分析:
从结果中我们可以看出,当stepVegas取N的一半还小一点时,此时得到最优的stepVegas。
此外,当N很大时,单独的使用回溯法虽然一定能够找到一个合法解,但是此时算法的执行时间较长,如果单独的使用概率算法来寻求一个合法解,此时算法的成功率很低,需要执行很多次才能找到一个合法解。
为了解决这两种算法的弊端,我们采用将回溯法和概率算法结合起来的方式来避免这两种算法的弊端,实验结果也证明了这种结合的方法时高效的。
Ex10(p147).PrintPrimes{ //打印1万以内的素数
print 2,3;
n ←5;
repeat
if RepeatMillRab(n, lgn) then print n;
n ←n+2;
until n=10000;
}
与确定性算法相比较,并给出100~10000以内错误的比例。
解:通过执行Miller Rabin算法来判定一个数是否为合数还是强伪素数或者素数,多次重复执行Miller Rabin算法可以大概率排除强伪素数的可能。
具体的代码如下所示:
当N取不同值时,即可计算出从1~N之间的素数个数。
当N=10000时,此时算法的执行结果如下:
此时全部素数的个数为1229,实际上10000以内的素数个数为1229,故算法的正确率为100%。
结果分析:
多次执行Miller Rabin算法可以判断一个数为强伪素数还是素数。
Welcome !!! 欢迎您的下载,资料仅供参考!。