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
//这是个很容易且广泛使用的简单算法,它基于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; }
相关文章推荐
- 利用标志flag,设计一个函数,检测一个数是否为质数(素数)
- sdnu第一场选拔赛--Miller_Rabin算法判断是否为素数
- C#l练习(用方法来实现:①判断一个给定的整数是否为“质数”。②计算1-100之间的所有质数(素数)的和
- Miller-Rabin素数检测算法笔记
- Java实现算法导论中Miller-Rabin随机性素数测试
- 20140915 【 数论 - Miller_Rabin素数测试 】 51nod 1106 . 质数检测
- 【随机算法】Miller-Rabin大素数检测算法(蒙特卡罗方法)
- 判断一个数是否为质数/素数——从普通判断算法到高效判断算法思路
- 算法:从键盘循环输入一个整数,判断是否是素数\质数
- 检测随机数是否为一个素数的C/C++实现
- Miller-Rabin素数检测优化算法及其证明
- Miller-Rabin素数检测算法
- [算法]求质数的算法之Miller-Rabin算法,C语言实现
- 判断一个数是否为质数/素数——从普通判断算法到高效判断算法思路
- 实现一个算法检测字符串是否为唯一字符
- 分享一个C#的Rabin-Miller素性检验算法
- 判断一个数是否为质数/素数——从普通判断算法到高效判断算法思路
- hihoCoder 数论一Miller-Rabin质数检测
- 判断一个数是否为素数Java实现
- C#检测是否已经运行了一个当前的程序【搜藏】