2020.10.30星期五
实验一:算法时间性能的经验分析
验证哥德巴赫猜想。统计其关键语句的执行次数。并绘制规模-执行次数散点图。
(Goldbach Conjecture)猜想:即任一大于2的偶数都可写成两个质数之和。请验证这个对于
较大的偶数都是成立的。
算法:goldbach(n)
描述:算法验证对于小于等于n的偶数,歌德巴赫猜想都是成立的。注意,goldbach(200)并非
验证200可以拆分成两个质数的和,而是验证对于所有≤n的偶数,都可以拆分成两个质数的
和。
输入:整数n
输出:1表示成立;0表示猜想有误
注1:用excel绘制散点图,excel可以打开csv格式的文件。
注2:csv(comma seperated values)是如下格式的文件。如下所示,n是第一列,times是第二
列。你可以用python直接输出该文本文件。例如,400,1221,表示为了验证歌德巴赫猜想对于小
于等于400的偶数都成立,其关键语句执行了1221次。
一、结果如下
n,times
200,413
250,588
300,784
350,996
400,1221
450,1470
500,1727
550,2002
600,2288
650,2588
700,2899
750,3224
800,3556
850,3906
900,4256
950,4630
1000,5005
1050,5392
1100,5792
1150,6192
1200,6613
1250,7038
1300,7464
1350,7914
1400,8364
1450,8816
1500,9291
1550,9766
1600,10241
1650,10740
1700,11240
1750,11740
1800,12257
1850,12782
1900,13307
1950,13838
2000,14388
2050,14938
2100,15488
2150,16054
2200,16629
2250,17204
2300,17779
2350,18376
2400,18976
2450,19576
2500,20176
2550,20800
2600,21425
2650,22050
2700,22675
2750,23322
2800,23972
2850,24622
2900,25272
2950,25938
3000,26613
3050,27288
3100,27963
3150,28644
3200,29344
3250,30044
3300,30744
3350,31444
3400,32161
3450,32886
3500,33611
3550,34336
3600,35061
3650,35810
3700,36560
3750,37310
3800,38060
3850,38812
3900,39587
3950,40362
4000,41137
4050,41912
4100,42688
4150,43488
4200,44288
4250,45088
4300,45888
4350,46688
4400,47509
4450,48334
4500,49159
4550,49984
4600,50809
4650,51646
4700,52496
4750,53346
4800,54196
4850,55046
4900,55896
4950,56770
5000,57645
二、源代码
import numpy as np
import csv
def is_prime(num):
count = 0
if num < 1 or num % 2 == 0:
return count, False
for i in range(2, num, 2):
if i <= np.sqrt(num):
if num % i == 0:
return count, False
count = count + 1
return count, True
def goldbach_conjecture(n):
count = 0
for i in range(2, n):
a_prime = is_prime(i)
b_prime = is_prime(n-i)
count = count + a_prime[0] + b_prime[0]
if a_prime[1] and b_prime[1]:
return [i, n-i], count, True
return None, count, False
file = open('goldbachConjecture.csv', 'w', newline='', encoding='utf-8')
csv_writer = csv.writer(file)
csv_writer.writerow(['n', 'times'])
for i in range(200, 5001, 50):
count = 0
for j in range(2, i+1, 2):
count = count + goldbach_conjecture(j)[1]
csv_writer.writerow([i, count])
三、数据分析: