题目
Given a big integer number, you are required to find out whether it's a prime number.
Input
The first line contains the number of test cases T (1 <= T <= 20 ), then the following T lines each contains an integer number N (2 <= N < 2 54).
Output
For each test case, if N is a prime number, output a line containing the word "Prime", otherwise, output a line containing the smallest prime factor of N.
Sample Input
2
5
10
Sample Output
Prime
2
题意:
判断一个大整数是否是素数.
思路:
miller素数判断 & pollar_rho大数分解:
Miller-Rabin素数测试基于费马小定理:假如n是素数且gcd(a,n)=1,那么a^(n-1)≡1(mod n).如果a^(n-1)≡1(mod n)(a为任意小于n的正整数),则可近似认为n为素数,取多个底进行试验,次数越多,n为素数的概率越大。
定义卡迈克尔数:一个合数n,若对于所有满足gcd(b,n)=1的正整数b都有b^(n-1)≡1(mod n)成立,则称之为卡迈克尔数.
为了排除卡迈克尔数导致Miller-Rabin测试出现错误,我们引进二次探测定理:如果p是素数且0<x<p,则方程x^2%p=1的解为x=1或x=p-1.这个比较难以理解,
Pollard_rho算法的大致流程是 先判断当前数是否是素数(Miller_rabin)了,如果是则直接返回。如果不是素数的话,试图找到当前数的一个因子(可以不是质因子)。然后递归对该因子和约去这个因子的另一个因子进行分解。
那么自然的疑问就是,怎么找到当前数n的一个因子?当然不是一个一个慢慢试验,而是一种神奇的想法。其实这个找因子的过程我理解的不是非常透彻,感觉还是有一点儿试的意味,但不是盲目的枚举,而是一种随机化算法。我们假设要找的因子为p,他是随机取一个x1,由x1构造x2,使得{p可以整除x1-x2 && x1-x2不能整除n}则p=gcd(x1-x2,n),结果可能是1也可能不是1。如果不是1就找寻成功了一个因子,返回因子;如果是1就寻找失败,那么我们就要不断调整x2,具体的办法通常是x2=x2*x2+c(c是自己定的)直到出现x2出现了循环==x1了表示x1选取失败重新选取x1重复上述过程
代码:
1 |
|