关于质数的结论+求质数的更快算法(python版本)(2021.3)

------------------------------------结论------------------------------------

全局声明:
1,以下结论都基于除去2、3这两个质数,质数也叫素数
2,结论二是基于结论一得出的
3,结论一是网上证实的,结论二是自己发现的

结论一

质数都分布在6的倍数的两边,即质数都满足6*k+1或者6*k-1

结论一证明:

假设k为大于0的正整数,则所有的数可表示为:

6*k						2,3的倍数,和数
6*k+1					可能是质数
6*k+2					2的倍数,和数
6*k+3					3的倍数,和数
6*k+4					2的倍数,和数
6*k+5					可能是质数,也等价于6*k-1

综上:质数都满足6k+1或者6k-1

结论二

集合		C = 6*k+16*k-1
集合		A = 全体质数
集合		B = C - A

则可得结论

C = A U B
B = A * C

注:B = A * C中的“ * ”是点乘的意思
这里举个例子解释一下:假设集合A={1,2},集合C={3,4},则集合B={3,4,6,8}

结论二证明

先看看这张图,
绿色框都是6的倍数,即6k
红色框里面的数都是都是6
k-1 和 6*k+1,即集合 C
蓝色框是集合C里面的和数,即集合 B
其他没圈的都是全体质数,即集合 A
在这里插入图片描述
把集合C拿出来(200以内)

5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49, 53, 55, 59, 61, 65, 67, 71, 73, 77, 79, 83, 85, 89, 91, 95, 97, 101, 103, 107, 109, 113, 115, 119, 121, 125, 127, 131, 133, 137, 139, 143, 145, 149, 151, 155, 157, 161, 163, 167, 169, 173, 175, 179, 181, 185, 187, 191, 193, 197, 199

把集合A拿出来(200以内)

5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199

把集合B拿出来(200以内)

25, 35, 49, 55, 65, 77, 85, 91, 95, 115, 119, 121, 125, 133, 143, 145, 155, 161, 169, 175, 185, 187

注:不难看出A U B 就是 C

我们看看集合B中的数都是最小被谁除掉的

1    2    3
25 = 5 * 5.0
35 = 5 * 7.0
49 = 7 * 7.0
55 = 5 * 11.0
65 = 5 * 13.0
77 = 7 * 11.0
85 = 5 * 17.0
91 = 7 * 13.0
95 = 5 * 19.0
115 = 5 * 23.0
119 = 7 * 17.0
121 = 11 * 11.0
125 = 5 * 25.0
133 = 7 * 19.0
143 = 11 * 13.0
145 = 5 * 29.0
155 = 5 * 31.0
161 = 7 * 23.0
169 = 13 * 13.0
175 = 5 * 35.0
185 = 5 * 37.0
187 = 11 * 17.0
203 = 7 * 29.0
205 = 5 * 41.0
209 = 11 * 19.0
215 = 5 * 43.0
217 = 7 * 31.0
221 = 13 * 17.0
235 = 5 * 47.0
245 = 5 * 49.0
247 = 13 * 19.0
253 = 11 * 23.0
259 = 7 * 37.0
265 = 5 * 53.0
275 = 5 * 55.0
287 = 7 * 41.0
289 = 17 * 17.0
295 = 5 * 59.0
299 = 13 * 23.0
301 = 7 * 43.0
305 = 5 * 61.0
319 = 11 * 29.0
323 = 17 * 19.0
325 = 5 * 65.0
329 = 7 * 47.0
335 = 5 * 67.0
341 = 11 * 31.0
343 = 7 * 49.0
355 = 5 * 71.0
361 = 19 * 19.0
365 = 5 * 73.0
371 = 7 * 53.0
377 = 13 * 29.0
385 = 5 * 77.0
391 = 17 * 23.0
395 = 5 * 79.0
403 = 13 * 31.0
407 = 11 * 37.0
413 = 7 * 59.0
415 = 5 * 83.0
425 = 5 * 85.0
427 = 7 * 61.0
437 = 19 * 23.0
445 = 5 * 89.0
451 = 11 * 41.0
455 = 5 * 91.0
469 = 7 * 67.0
473 = 11 * 43.0
475 = 5 * 95.0
481 = 13 * 37.0
485 = 5 * 97.0
493 = 17 * 29.0
497 = 7 * 71.0
505 = 5 * 101.0

一、感觉是不是有点乱,不慌,我们把第2列为5的行拿出来

1    2    3
25 = 5 * 5.0
35 = 5 * 7.0
55 = 5 * 11.0
65 = 5 * 13.0
85 = 5 * 17.0
95 = 5 * 19.0
115 = 5 * 23.0
125 = 5 * 25.0
145 = 5 * 29.0
155 = 5 * 31.0
175 = 5 * 35.0
185 = 5 * 37.0
205 = 5 * 41.0
215 = 5 * 43.0
235 = 5 * 47.0
245 = 5 * 49.0
265 = 5 * 53.0
275 = 5 * 55.0
295 = 5 * 59.0
305 = 5 * 61.0
325 = 5 * 65.0
335 = 5 * 67.0
355 = 5 * 71.0
365 = 5 * 73.0
385 = 5 * 77.0
395 = 5 * 79.0
415 = 5 * 83.0
425 = 5 * 85.0
445 = 5 * 89.0
455 = 5 * 91.0
475 = 5 * 95.0
485 = 5 * 97.0
505 = 5 * 101.0

再取出第三列

5.0
7.0
11.0
13.0
17.0
19.0
23.0
25.0			<-
29.0
31.0
35.0			<-
37.0
41.0
43.0
47.0
49.0			<-
53.0
55.0			<-
59.0
61.0
65.0			<-
67.0
71.0
73.0
77.0
79.0
83.0
85.0			<-
89.0
91.0
95.0			<-
97.0
101.0

你会发现除了箭头指向的数,剩下的都是质数,不就是集合A吗?

我们再看看箭头指向的数都是什么

25, 35, 49, 55, 65, 77, 85, 91, 95

等等,这个数列好熟悉,,,,不就是B吗?
(同理,当第2列为7时,第3列依然满足这个规律,这里就不再证明了)
所以说,第3列是

3= A U B = C

二、那我们再看看第2列都是什么数

5, 7, 11, 13, 17, 19

呀,这不就是集合A吗?
所以说

2= A

三、总结,整理一下线索
可得这个结论

B =2*3= A * (A U B) = A * C

综上,结论二正确,即

C = A U B
B = A * C

最后思考

综合结论一和结论二,我们发现了A 和 B C的关系,目前还不会解,也不知道有什么用,但是还是记录下来吧,等之后再解吧,考研要紧【无奈】

以上都是基于电脑运行python代码实现的,代码如下

k = 1
# M*6 就是最大的范围,更改M的值,就可以更改范围
M = 100

ls = [5,]
lst=[]
lsall=[]
ls1 = []
ls2 = []
ls3 = []

def setLs(num):
    if num > int(ls[-1]):
        ls.append(num)
def awm(num):
    for i in ls:
        if i * i > num:
            break
        if(num % i) == 0:
            lsall.append(str(num)+"  =  "+str(i)+" x "+str(num/i))
            ls1.append(num)
            ls2.append(i)
            ls3.append(num/i)
            return 1
    setLs(num)
    return 0

while k<M:
    n=0
    print(str(k)+"行:\t", end='')
    a = 6*k - 1
    b = 6*k + 1
    lst.append(a)
    lst.append(b)
    fa=awm(a)
    if fa==1:
        print("\t" + "*"+str(a)+"*", end='')
    else:
        print("\t" + str(a), end='')
    print("\t\t\t\t"+str(a+1)+"\t\t\t\t",end='')
    fb=awm(b)
    if fb==1:
        print("\t" + "*"+str(b)+"*", end='')
    else:
        print("\t" + str(b), end='')
    print("")
    k+=1

for i in range(0,len(ls1)):
    print(str(ls1[i])+" = "+str(ls2[i])+" * "+str(ls3[i]))
print("---------------------------------------------------")
for i in range(0,len(ls1)):
    if ls2[i]==5:
        print(str(ls1[i])+" = "+str(ls2[i])+" * "+str(ls3[i]))
print("---------------------------------------------------")
for i in range(0,len(ls1)):
    if ls2[i]==5:
        print(ls3[i])

------------------------------------算法------------------------------------

基于结论二,我们可以得到快速求[5 , 6*M]素数的python代码,真的很快

k = 1
M = 1000
ls = [5,]
def setLs(num):
    if num > int(ls[-1]):
        ls.append(num)
def awm(num):
    for i in ls:
        if i * i > num:
            break
        if(num % i) == 0:
            return 0
    setLs(num)
    return 1
while k<M:
    n=0
    a = 6*k - 1
    b = 6*k + 1
    awm(a)
    awm(b)
    k+=1
print(ls)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值