LV10算法实现与分析
Las Vegas算法
Las Vegas(拉斯维加斯)算法是一个能够保证输出结果为正确的随机化算法,因为它的正确性,使它成为适用情况下的首选算法。Las Vegas算法模型不允许错误的输出,但是它可以允许程序输出“?”结果,即“不知道结果正不正确”。
Las Vegas算法有两种情况:不允许“?”输出与允许“?”输出。
其中定义为:
A(x):程序输出结果,F(x):理论输出结果,x:输入值
(1) 不允许:
理论结果与程序结果一致的概率为1,即:
Prob(A(x)= F(x)) = 1.
(2) 允许:
出现“?”的概率不得超过总数的一半:
1 Prob(A(x) = F(x)) ≥ 1/2, and
2 Prob(A(x)= “?”) = 1 − Prob(A(x)= F(x)) ≤ 1/2.
LV10算法
算法思想
初始化:定义两个数组RI,RII;每个数组里面有10个长度为n的01串,RI:x1, x2, ...,x10;RII:y1, y2, ...,y10,
第一步:从n*n中随机选出10个素数存到p数组中,p1, p2, . . .,p10,
第二步:将RI中的01字符串转换为数字,然后对素数p取模,将其余数存到s数组中:
si= Number(xi) mod pi
第三步:RII一样计算取模:
qi= Number(yi) mod pi
第四步:如果对于所有的i∈ {1, 2, . . ., 10}, si !=qi,则对于所有的 i ∈ {1, 2, . . ., 10} xi != yi,输出结果为“0”;
若si = qi,则对RI与RII中的xi与yi进行逐比特比较,如果xi=yi,则输出“1”,否则,输出“?”。
Las Vegas* 算法
Las Vegas* 算法是将Las Vegas的第二种带有“?”结果输出的算法改为第一种不带“?”输出的完全正确的结果输出。
理论分析
定义:
A为允许“?”输出的Las Vegas算法,A′为不允许“?”输出的Las Vegas算法。我们将A变为A′,转变过程为当遇见要“?”输出的结果时,即遇见了坏素数,则重新生成素数,对原01序列进行重新求模计算。循环该次过程,直到结果没有“?”输出为止。
那么这个计算过程的计算次数即坏素数个数,循环的深度是多少呢?
我们先用理论进行证明:
令 TimeA(w)为A最坏的一次计算的复杂度,当运行次数至少TimeA(w) 时,A′得到正确结果的概率为1/2,当运行次数至少2TimeA(w) 时,A′得到正确结果的概率为3/4,则当运行次数达到kTimeA(w)时,则A′得到正确结果的概率为: