みなさん、こんにちは。
突然ですが、皆さんは素数好きですか?
私はフィボナッチ数の次に好きです。
私はいつものようにツイッターをぱららーと眺めていました。
そしたら、こんな呟きを拾いました。
「受験番号を素数にすれば合成数を一つ用意すれば十分」
なるほど、つまり発表された数字を自分の受験番号で割ってみて割り切れれば合格ということだ。
かんだ「確かにシンプルだ」
しかし、瞬間的に気付いてしまった。
かんだ「桁、大きくなりすぎじゃね?」
1.素数を探せ!
試しに私の母校の受験データ(こんな事を万が一やるのは高専ぐらいだし)から受験者数を調べ、最悪の場合の桁数を計算することにした。
まず、受験者数は391人
合格者数は241人だった。
つまり、241の素数の合成数を発表することになる。
その前にまず、受験者数分の素数が必要だ。
素数一覧とググれば一瞬で出てくるご時世に自分で計算(正確にはプログラムで計算)する事にした。
素数というのは1かその数字以外で割れなければいいのだ。
つまり、総当たりしてやれば良いのだ!(LV1)
と思い、パタパタとコーディングしたが、あることに気付く。
かんだ「偶数って絶対素数じゃなくね?」
そう、偶数は2で割れるのだ。
絶対に。
ステップの刻みを2にした。(LV2)
そのうち、nが2で割れないってことはn/2以上の数字を確認する必要あるかな…
と思い、n/2以上の計算をやめた。(LV3)
あれ、そう考えると3で割れなかったらn/3以上を(ry
これ以上は沼を感じたのでLV3止まりでした。
ポンコツですみません。
Sub prime_number()
Dim p_num As Long
Dim i As Long
Dim j As Long
Dim max As Long
Dim row1 As Long
Dim o As Double
Dim cul_time
Dim start_ time
Dim end_time
max = 300000
p-num = 1
rowi1
o=1"計算量
starttime = Timer
For i = 1 To max Step 2
For j = 3 To i/3
0=0+1
If i Mod j = 0 Then
p num 0
Exit For
End If
Next j
If P_num=1 Then
Worksheets(1).Cells(rowi, 1).Value2 i
row1 = row1 + 1
End If
P_num = 1
Next i
end time Timer
cultime = end - time - starttime
MsgBox (cul_time & vbCrlf & o)
End Sub
(取り急ぎ雑なコードですが…字下げはおいおい直します)
これで、安心して素数が計算で求められます。
あとは受験者数分の素数のうち、桁数の大きい合格者数分の素数をかければ良いのだ。
2.合成数をつくれ!
かんだ「これは特殊な変数が必要だな…」
ぱっと見でそう感じた。
4桁の素数を約200個かけたらそれが何桁になるか。
大体分かるだろう。
かける素数は分かっている。
その素数をかけて発表する必要があるのだろうか。
そのまま、平文の素数を合格番号として発表してはいけないのか…
葛藤が始まる。
発表するときの数字を一つにしても、合格発表後の各事務手続きにおいて、合成数を毎回素因数分解するとは考えられず、結局オリジナルの素数セットを用いて一致、不一致を判断して処理を進めるのだろう。
万が一オリジナルの素数セットを捨てて合成数を素因数分解して処理を進めるとすると、受験番号1とかでアタックしたら以外と通るかもしれない。
とまぁ、いろいろくだらないことを考えて
かんだ「合成数作るの、工数増えるだけだし無駄じゃね?」
という結論に至ってしまいました。
ユーザー定義変数を作るのがめんどくさいとかじゃないですよ。
いや、理由の9割はそれなんですがね。
一応、計算できりゃいいっしょってことで配列つかって合成数計算するプログラムを考えましたが
かんだ「実装めんどいわ」
今後作るつもりもありません!
ちなみに、受験番号1番は使ってはいけません。受験番号1の人はどんな合成数でも合格判定になってしまいます。つまり、誰よりも早く提出した人が必ず合格してしまいます(私のクラスに受験番号1番がいましたが、彼女は提出期間より前に出したそうです。素直に「あ、受け付けるんだ。」と思いました。)
コメント