------------------------------------结论------------------------------------
全局声明:
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+1或6*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
红色框里面的数都是都是6k-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)