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

首先说下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。如果jp-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。如果jp-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; }

你可能感兴趣的:(算法,c#,random,测试)