Python程序设计——厄拉多塞素数筛选法的应用

一.厄拉多塞素数筛选法

Python程序设计——厄拉多塞素数筛选法的应用_第1张图片

 Python程序设计——厄拉多塞素数筛选法的应用_第2张图片

Python程序设计——厄拉多塞素数筛选法的应用_第3张图片

 Python程序设计——厄拉多塞素数筛选法的应用_第4张图片

 我用我自己的话,来说一说我对它的理解:

它的核心是isPrime数组,这个数组有什么用呢?它用来区分从1到100中,谁是素数,谁是合数。它是怎么区分的呢?它把素数设为True,而把合数设为False。它是用什么方法设置True和False的呢?它从2开始,4、6、8、10......都是2的倍数,所以都是合数,所以都设为False;然后是3,6、9、12......都是3的倍数,所以都是合数,所以都设为False;然后是4,4已经是False,所以看5......

通过这样的方法,就可以区分出素数和合数。

二.厄拉多塞素数筛选法的应用

这道题值得一试,容易出成果,建议大家做一做。

Python程序设计——厄拉多塞素数筛选法的应用_第5张图片

import stdarray
import stdio
import sys
n = int(sys.argv[1])
a = stdarray.create2D(n, n, True)
for i in range(2, n):
    istimes = stdarray.create1D(n+1, True)
    istimes[i] = False
    for j in range(2, n//i+1):
        istimes[i*j] = False
    for j in range(i, n):
        for k in range(i, n):
            if (istimes[j] == False) and (istimes[k] == False):
                a[j][k] = False
for row in a:
    for v in row:
        if v == True:
            stdio.write('* ')
        else:
            stdio.write('  ')
    stdio.writeln()

这里说一句,stdio和stdarray不是系统自带的,而是书的作者编的。所以刚开始是不能用的,如果想用,得去官网下载。

怎么在官网下载呢?首先进入这个网址Introduction to Programming in Python: An Interdisciplinary Approach (princeton.edu)

然后在To get started栏目里找到We also provide I/O libraries for reading and writing text, drawing graphics, and producing sound.点进去I/O libraries,进入这个网址:

Python Programs in the Textbook (princeton.edu)

然后就可以下载stdio-python.zip文件了,下载以后解压,里面有10个python文件,只需要把stdio.py和stdarray.py文件复制上,然后粘贴到.spyder-py3文件夹中,这时temp.py和stdio.py和stdarray.py三个文件都在.spyder-py3文件夹中,并且你还会发现,这三个文件都是平级的(意思是不存在temp.py文件在a文件夹中,然后a文件夹和stdio.py文件和stdarray.py文件在.spyder-py3文件夹中,因为这叫不平级),这下子你在temp.py文件里使用import stdio和import stdarray就不会报错了。

Python程序设计——厄拉多塞素数筛选法的应用_第6张图片

 这道题的关键是什么呢?

这道题的核心,除了istimes数组以外,就是选出i和j互素的a[i][j],它是怎么选出的呢?它用排除法选出的,选出i和j不互素的a[i][j],剩下的就是i和j互素的a[i][j]。那它是怎么选出i和j不互素的a[i][j]的呢?它根据互素的定义:只有共同因子1,比如4和9,3和8,2和7,那么不互素就是有公因子的意思,比如2和4,4和6,6和9,所以我们选出有公因子的i和j就可以。那怎么选呢?我们用istimes数组,先从2开始,2设为False,然后4、6、8、10、12、14......凡是2的倍数,都设为False,这时我们从里面挑数,先挑4和6,不互素吧,然后挑4和8,也不互素吧,不信邪再试一个8和10,还是不互素吧,这说明什么?是不是说明,凡是设为False的俩数,就都是不互素的?嗯,确实是这样。然后循环,用一个新的istimes数组,从2后面的3开始,3设为False,然后6、9、12、15.......凡是3的倍数,都设为False,凡是设为False的俩数,就都是不互素的。然后循环,再用一个新的istimes数组,从3后面的4开始......是不是感觉有点奇妙啦?

我的代码,就是完全按照这个思路走的,大家质疑的,怀疑的,可以自己跑一跑看看哟。

你可能感兴趣的:(Python,算法)