見出し画像

【ェ】ORANGE pico でエラトステネスの篩

#クリエイターフェス 9日目、テーマは「ェ」である。

エラトステネスの篩

今回は、ORANGE pico でエラトステネスの篩を動かしてみた。
単に動かすだけではなく、実行の様子を可視化するようにした。

アルゴリズム

エラトステネスの篩は、以下の手順 (擬似コード) で指定した数までの非負整数が素数かどうかのテーブルを作成するアルゴリズムである。

n ← 指定した数
isprime ← 0~nの添字が使える配列
isprime[0] ← false
isprime[1] ← false
for i = 2 ... n: // iを2からnまで(両端を含む)1ずつ増やしながらループする
  isprime[i] = true
i ← 2
while i*i <= n:
  j ← i*i
  while j <= n:
    isprime[j] ← false
    j ← j + i
  i ← i + 1

今回の実装では、配列 isprime のかわりにそれぞれの数が素数でないかどうかを表す配列を用い、最初に0に初期化されることを利用して2以降の明示的な初期化を省略した。

プログラム

10 width=10:height=25:cellsize=4:tcolor=rgb(255,255,255):rcolor=rgb(255,255,255):lcolor=rgb(255,255,255)
20 cls:fs$=format$("%%%dd",cellsize):sfs$=format$("%%%dc",cellsize):last=width*height
30 input "アニメーション カンカク [ms] (0:シュドウ) : ",animwait:cursor 0:goto 60
40 if animwait>0 then pause animwait:return
50 if inkey()=0 then goto 50 else return
60 cls:dim notprime(last):notprime(0)=1:notprime(1)=1
70 for i=2 to last
80 gprint (i-1)%width*cellsize*8,(i-1)/width*8,format$(fs$,i),tcolor
90 next
100 gosub 40
110 i=2
120 x=(i-1)%width*cellsize*8:y=(i-1)/width*8
130 line x+8,y,x+cellsize*8-1,y,rcolor:line x+8,y,x+8,y+7,rcolor
140 line x+8,y+7,x+cellsize*8-1,y+7,rcolor:line x+cellsize*8-1,y,x+cellsize*8-1,y+7,rcolor
150 j=i*i
160 notprime(j)=1
170 xj=(j-1)%width*cellsize*8:yj=(j-1)/width*8
180 line xj+8,yj,xj+cellsize*8-1,yj+7,lcolor
190 j=j+i
200 if j<=last goto 160
210 gosub 40
220 gprint x,y,format$(fs$,i),tcolor
230 j=i*i
240 gprint (j-1)%width*cellsize*8,(j-1)/width*8,format$(sfs$,32),tcolor
250 j=j+i
260 if j<=last goto 240
270 gosub 40
280 i=i+1
290 if i*i>last then end
300 if notprime(i) then goto 280
310 goto 120

実行の様子

実行すると、まず画面切り替えの間隔を入力できる。
正の値を入力した場合は指定の時間で自動で切り替わり、0を入力した場合はキー入力で手動で切り替える。

画面切り替えの間隔を入力する画面

間隔を設定すると、2以上の整数が表示される。

アルゴリズム実行開始画面

まずは2を処理する。処理対象を四角でマークし、消す対象を斜線でマークする。

2を処理する画面

2の処理を行った。2より大きい2の倍数が消された。

2を処理した画面

続いて、3の処理を開始する。

3を処理する画面

このまま処理を続けていき、素数のみになるタイミングで処理を終了する。
今回は250までの整数を対象にしているので、250の平方根以下の最大の素数である13までの処理を行う。

処理を完了した画面

改造のヒント

たとえば、以下の変更を行うことが考えられる。
これらは読者への宿題とする。

  • スクロールするなど表示を工夫し、処理範囲を増やす

  • 消す処理の表示を一気に出すのではなく、だんだん出していくようにする

  • カラー画面 (TFT液晶) を使用し、数字を消す際に空白にするのではなく薄い数字の表示にする

  • その他、表示を工夫して見やすくする

ライセンス

今回のプログラムと解説 (「エラトステネスの篩」節の内容) は、CC BY 4.0 でライセンスする。

この記事が気に入ったらサポートをしてみませんか?