なんちゃって量子コンピュータを作りたい②

表紙-2
前回

量子コンピュータのざっくりとした説明も終わったところで、
いよいよなんちゃって量子コンピュータの作成です!!

さてどのように作成するかですが、前回の説明を踏まえまして
要するに普通のコンピュータは1から順に計算しているが、
量子コンピュータは量子ビットによって、同時に多数の計算を並列に実施していると見えなくもない!
(専門家がいたら突っ込まれそうですが)

後はどのような計算を使って、疑似的な量子コンピュータを感じられるかですが、
大分前にブログで記載した、素数を計算するBashスクリプトを使いたいと思います。

素数の計算のブログ①
素数の計算のブログ②


この計算をあたらめて、1,000,000まで実施してみます。
スクリプトが以下。

------------------------------------------------
#!/bin/bash

for num in {2..1000000}
do
    is_prime=1
    for ((i=2; i*i<=num; i++))
    do
        if ((num % i == 0))
        then
            is_prime=0
            break
        fi
    done
    if ((is_prime))
    then
        echo $num
    fi
done
------------------------------------------------

実際の計算ですが、3分25秒かかりますね。
前回のブログの時は適当な検証のVPSサーバーを利用していたので、同じスクリプトでも15分かかってますね。

ちなみに今回、実施したのは物理サーバーでスペックは以下です。

CPU:Intel Xeon Silver 4309Y(16スレッド)
メモリ:16GB

サーバースペックによって、10分以上早くなってますね。
同じスクリプトでも、実行環境でこれだけ差が出るのは面白いところです。
※少しはインフラエンジニアらしくしないとね。


サーバースペックはともかく、スクリプトが1から順に計算しているので、調べる数の範囲が大きくなると、処理時間もどんどん増えていきます。
これを1から計算するのではなく、数字を分割して、同時並行で計算結果を出すことで、計算結果がとても短くなるはず。
そうなんちゃって量子コンピュータです!

はい。ただの並列やんけ、とか、どこが量子コンピュータやねん、と言った抗議は受け付けません。
だって、普通のコンピュータを使う以上しょうがないじゃないか…。
だから、なんちゃってって付けてるじゃないか…。


ということで、1,000,000の数字を素数の分布に従って、以下のように分割します。

2~78,000           A
78,001~156,500     B
156,501~238,500    C
238,501~322,000    D
322,001~408,000    E
408,001~496,500    F
496,501~588,000    G
588,001~682,500    H
682,501~780,000    I
780,001~1,000,000  J

先ほどのスクリプトを上記の数字範囲に合わせてA.sh~J.shまで分割作成します。
その分割したスクリプトをまとめて実施し、ファイル出力をまとめるスクリプトを作成します。

------------------------------------------------
#!/bin/bash

OUTPUT_FILE="prime_all.txt"

# 各スクリプトを並列実行
./A.sh > prime_A.txt &
./B.sh > prime_B.txt &
./C.sh > prime_C.txt &
./D.sh > prime_D.txt &
./E.sh > prime_E.txt &
./F.sh > prime_F.txt &
./G.sh > prime_G.txt &
./H.sh > prime_H.txt &
./I.sh > prime_I.txt &
./J.sh > prime_J.txt &

# 全部終わるまで待つ
wait

# 結果を結合
cat prime_A.txt prime_B.txt prime_C.txt prime_D.txt prime_E.txt \
    prime_F.txt prime_G.txt prime_H.txt prime_I.txt prime_J.txt \
    > "$OUTPUT_FILE"
------------------------------------------------

さて、ということで、結果ですが…。
また、次回。なんちゃって量子コンピュータ完結編で。