素数小结
素数求解问题:1,给定一个数字,判断某数是否为素数;2,求10000内有多少素数3,已知一个数字是两个素数之积,求这个素数
1,针对判断一个数是否为素数,我们根据定义简单的想到,只要被除了1和本身的数整除就是合数,反之则为素数,1既不是素数也不是合数。学过C语言的人很容易就能写出。
2,其实我们发现,如果A是合数,那么必然满足A=B*C,B<=C,显然B*B<=A
这样我们就把时间复杂度由n变到n^1/2了 。
3,素数筛选法
而我们反着考虑,如果问100内有多少素数,我们这样考虑4,6,8,10,……98,100都可以被2整除,6,9,12,……,96,99都可以被3整除那么我们不妨这样把合数筛选出来。于是有代码如下:
时间复杂度为O(N*loglog(N))
4,线性素数筛
这是一个复杂度大于O(N)的算法,我们考虑是否可以继续降低复杂度,我们有如下理论铺垫,假设A是一个合数,那么有如下:
A=B*C,B是整除A的最小素数,C!=1,且有C=D*E,D是整除C的最小素数,E>=1,那么必有B<=D,(因为A=B*D*E,B是整除A的最小素数,那么D作为素数必然比B大或者相等),对于每一个C,我们找到整除A的唯一一个最小的素数B,这样就可以将A筛去并且只筛选一次。我们有一个符号规定list(p)为小于等于p的素数表
2-list(2)={2}-筛去2 整除2的最小素数为2
3-list(3)={2,3}-筛去6,9 整除3的最小素数为3
4-list(4)={2,3}-筛去8 整除4的最小素数为2
5-list(5)={2,3,5}-筛去10,15,25 整除5的最小素数为5
……
在如上实例中最小素数为B,最左边的数我们作为C,那么每次找B的上限也就是D
有代码如下:
时间复杂度为O(N)
注:以上参考自小象学院讲师胡光视频课