2012年1月2日月曜日

素数リストの作成

EXCEL VBAによる、素数リストの作成コード。

1万以下の素数一覧が欲しかったので作りました。
「1万以下」という範囲を変えたい場合は、コードの最初のConst tmpの値を変えて下さい。
ただし、より広い範囲でリストを作る場合のLong型の限界、配列サイズの限界、実行速度などについては考慮していません。

<プログラムの概要>
・ワークシートのA列に素数のリストを出力します。
・いわゆるエラトステネスの篩(http://goo.gl/Xxqfc)によって素数を判定しています。
・1万以下の素数について、http://www.ysr.net.it-chiba.ac.jp/yashiro/sosu/ のリストと一致することを確認しています。

<コード>
Const tmp = 10000

Sub makePrimeList()

Dim n() As Long '下記(ReDim)参照
Dim p() As Long '素数のリスト
Dim UpperBound As Long '対象範囲
Dim i As Long
Dim j As Long
Dim PrimeCount As Long


UpperBound = tmp

ReDim n(UpperBound, 1)
' フィールド1が自然数、フィールド2が0のものが素数
' 例:n(7,0)=7,n(7,1)=0 : 7は素数
' n(8,0)=8,n(8,1)=1 : 8は素数でない

ReDim p(UpperBound)

For i = 0 To UpperBound
 n(i, 0) = i
 n(i, 1) = 0
Next

'0,1は素数でない
n(0, 1) = 1
n(1, 1) = 1

PrimeCount = 0
For i = 2 To UpperBound
 If n(i, 1) = 0 Then
  PrimeCount = PrimeCount + 1
  p(PrimeCount) = i

  j = i
  Do While j <= UpperBound
   n(j, 1) = 1
   j = j + i
  Loop
 End If

Next

[A:A].ClearContents
For i = 1 To PrimeCount
 Cells(i, 1).Value = p(i)
Next

End Sub

0 件のコメント:

コメントを投稿