アルゴリズム入門(素数)
素数は、1とその数以外に約数を持たない数のことです。
ある数が素数かどうかを判定するには、約数の個数を調べます。
約数は、その数以下の自然数で割って、割り切れるか調べると求められます。
「10」の約数を見つけるには、1から順に10まで割ってみればいいのです。
10 ÷ 1 = 10 あまり 0 → 割り切れる
10 ÷ 2 = 5 あまり 0 → 割り切れる
10 ÷ 3 = 3 あまり 1 → 割り切れない
10 ÷ 4 = 2 あまり 2 → 割り切れない
10 ÷ 5 = 2 あまり 0 → 割り切れる
10 ÷ 6 = 1 あまり 4 → 割り切れない
10 ÷ 7 = 1 あまり 3 → 割り切れない
10 ÷ 8 = 1 あまり 2 → 割り切れない
10 ÷ 9 = 1 あまり → 割り切れない
10 ÷ 10 = 1 あまり 0 → 割り切れる
1,2,5,10で割り切れたため、約数はこの4つです。
ただし、10が素数であるか判定する場合には、1以外で割り切れる整数が見つかった時点で探索を終了出来ます。
10であれば2で割り切れることが分かれば、5で割り切れることも明らかです。
実際には、その数の平方根まで探せば十分です。
#!/usr/bin/awk -f function is_prime(n, i){ if(n <= 1){ return 0; }else{ for(i = 2; i <= sqrt(n); i++){ if(n % i == 0){ return 0; } } return 1; } } BEGIN{ for(i = 0; i <= 199; i++){ if(is_prime(i)){ printf "%d ",i; } } }
awk -f is_prime1.awk 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 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
素数を求める方法として「エラトステネスのふるい」があります。
これは、指定された範囲の中から2で割り切れる数、3で割り切れる数、・・・と割り切れる数を順に除外する方法です。
#!/usr/bin/awk -f BEGIN{ n = ARGV[1]; for(i = 2; i <= n; i++){ data[i] = i; for(j = 2; j <= n; j++){ if(data[i] % j == 0 && data[i] != j){ data[i] = 0; } } } for(k = 2; k <= n; k++){ if(data[k]){ printf "%d ",data[k]; } } }
awk -f eratosthenes.awk 200 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 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199