首先说下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是证据。