您的位置:首页 > 编程语言 > C#

C#实现的Rabin-Miller检测素数算法,可检测一个数是否为素数(质数)

2009-08-28 16:09 411 查看
首先说下Rabin-Miller检测素数的算法,

算法描述网上很多,由于经过多次转载所以都有错误存在,下面是我综合多个修改后得到的

//Rabin-Miller
//这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。

//首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得p=1+(2^b)m。

//(1) 选择一个小于p的随机数a,且大于2。
//(2) 设j=0且z=a^m mod p
//(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
//(4) 如果j>0且z=1, 那麽p不是素数
//(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
//(6) 如果j=b 且z<>p-1,不是素数

//数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。
//实际上,对大多数随机数,几乎99.99%肯定a是证据。

/*Rabin-Miller*/
public static Boolean  RabinMiller(int p)
{
//首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得p=1+(2^b)m,即 m = (p-1)/(2^b),且m是奇数
int b = 0, m = p - 1; //根据p=1+(2^b)m公式,b=0时m=p-1,这个作为初始值来计算出奇数的m;
while (m % 2 == 0)
{
//m每除一次2,b就要加一次,根据p=1+(2^b)m公式,最后可以得出奇数的m
m /= 2;
b++;
}

//(1) 选择一个小于p的随机数a,且大于2。
Random random = new Random();
int a = random.Next(3, p - 1);

//(2) 设j=0且z=a^m mod p
int j = 0;
int z = (int)Math.Pow(a, m) % p;

//(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
if (z == 1 || z == (p - 1))
{
return true;
}

//(4) 如果j>0且z=1, 那麽p不是素数
//(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
//(6) 如果j=b 且z<>p-1,不是素数
while (++j <= b)
{
if (z == p - 1)
{
return true;
}
z = (int)Math.Pow(z, 2) % p;
}
return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: