为什么判断质数可以用平方根优化
Cortius_D_LaSith
·
2023-11-11 14:30:44
·
个人记录
bool isprime(int x){
if(x<2)return 0;
for(i=2;i*i<=x;++i){
if(x%i==0)return 0;
}
return 1;
}
这是一个判断x是否为质数的函数,循环的条件是i*i<=x,也就是i小于等于x的平方根。
那么为什么判断质数可以用平方根优化呢
比如19是一个质数,从2到18寻找它的因子。
$i=2$:2不能被19整除,$\lfloor{\frac{19}{2}}\rfloor=8$,这样就能判断2和8都不是19的因子;
$i=3$:3不能被19整除,$\lfloor{\frac{19}{3}}\rfloor=6$,这样就能判断3和6都不是19的因子;
$i=4$:4不能被19整除,$\lfloor{\frac{19}{4}}\rfloor=4$,这样就能判断4不是19的因子;
$i=5$:5不能被19整除,$\lfloor{\frac{19}{5}}\rfloor=3$,在前面的循环中已经判断出3不是19的因子了。
$i=6$:6不能被19整除,$\lfloor{\frac{19}{6}}\rfloor=3$,在前面的循环中已经判断出3不是19的因子了。
$i=7$:7不能被19整除,$\lfloor{\frac{19}{7}}\rfloor=2$,在前面的循环中已经判断出2不是19的因子了。
$i=8$:8不能被19整除,$\lfloor{\frac{19}{8}}\rfloor=2$,在前面的循环中已经判断出2不是19的因子了。
$i=9$:9不能被19整除,$\lfloor{\frac{19}{9}}\rfloor=2$,在前面的循环中已经判断出2不是19的因子了。
$\lfloor\sqrt{19}\rfloor=4
对于所有小于等于4的数字x,如果x不是19的因子,则\lfloor\frac{19}{x}\rfloor也不是19的因子。
对于所有比4大的数字x,\lfloor\frac{19}{x}\rfloor的值都小于4,假设在i\in(4,19)中存在19的因子x,那么其充要条件是存在i\in(1,4]使得\lfloor\frac{19}{i}\rfloor=x并且i是19的因子。而在此之前所有小于等于4的数字都已经证明不是19的因子(也就是我们已经证伪了这个充要条件),所以
在i\in(4,19)中不存在19的因子x。
综上所述,对于一个大于1的正整数x,如果i\in(1,\lfloor\sqrt x\rfloor]不存在x的因子,则i\in(\lfloor\sqrt x\rfloor,x)也不存在x的因子。
因此,判断一个数字是不是质数,只要判断到它平方根之前是否有数字是它的因子即可。