今回も強引にpythonのリストを使います。
「エラトステネスの篩(ふるい)」で素数を求めてみます。
まず、偶数で素数は2しかありませんので、引数で指定した数を上限とした3からの奇数のみリストにします。
takk@deb83:~$ cat -n test.py takk@deb83:~$
実行してみます。
takk@deb83:~$ python test.py 8 [3, 5, 7] takk@deb83:~$ python test.py 9 [3, 5, 7, 9] takk@deb83:~$ python test.py 10 [3, 5, 7, 9] takk@deb83:~$ python test.py 11 [3, 5, 7, 9, 11] takk@deb83:~$
次にrestの先頭の数の倍数を、restから取り除くためのふるいリストsieveを作ります。
1 import sys
2
3 maxnum = int(sys.argv[1])
4 rest=[x*2+1 for x in range(1,(maxnum+1)/2)]
5
6 a=rest.pop(0)
7 sieve=[x*a for x in range(1,maxnum/a+1)]
8
9 print rest
10 print sieve
takk@deb83:~$ python test.py 15 [5, 7, 9, 11, 13, 15] [3, 6, 9, 12, 15] takk@deb83:~$
そして、restからsieveを引くと(set(rest) – set(sieve))
[5, 7, 11, 13]が求まるということです。
ソースはこうなりました。
takk@deb83:~$ cat -n erastothenes.py
1 import sys
2
3 maxnum = int(sys.argv[1])
4 rest=[x*2+1 for x in range(1,(maxnum+1)/2)]
5
6 prime=[2]
7
8 while 1:
9 if len(rest)==0:
10 break
11
12 a=sorted(rest).pop(0)
13 sieve=[x*a for x in range(1,maxnum/a+1)]
14 rest = set(rest) - set(sieve)
15 prime.append(a)
16
17 print prime
100までの素数を求めます。
takk@deb83:~$ python eratosthenes.py 100 | fold -s40 [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] takk@deb83:~$



コメント