前回のつづき
ChatGPTくんに素数を計算するスクリプトを書かせてみたところ、
完ぺきな内容で心が折れそう…。
いやしかしこのままでは終われない。
人間様の意地を見せてやる。
ということでChatGPTくんの作ったスクリプトに欠点がないか
考えてみました。
ちなみにChatGPTくんの作ったスクリプトが以下#!/bin/bash
# 1から100までの素数を計算するスクリプト
for num in {2..100}
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
確かにシンプルで問題ない・・・
しかし、100までの数字なら問題はないが、もっと大きい数字だとどうかね
ということで、スクリプトの数字の桁を大きくしつつ、
timeコマンドでその処理時間を比べてみました。
対象の数字:100 処理時間:0m0.009s 素数の数:25
対象の数字:1000 処理時間:0m0.112s 素数の数:168
対象の数字:10000 処理時間:0m1.884s 素数の数:1229
対象の数字:100000 処理時間:0m38.344s 素数の数:9592
対象の数字:1000000 処理時間:15m25.920s 素数の数:78498
サーバーのスペックにもよるかもしれませんが、100万までの計算で15分かかってますね
ちょっと100万はやりすぎだったか
やっぱり桁が大きくなると処理時間が大きくなりますね。
そして桁が大きくなるほど効率化の必要があるはず。
そして、ひらめく!
そもそも2以外の偶数は素数ではないのだから対象から外すべきだ!
それだけで計算する対象が半分になり、処理時間も短縮するはず
というわけでスクリプトを以下のように奇数を対象としたものに変更#!/bin/bash
# 2は素数なので出力
echo 2
# 3から100までで奇数のみに絞って、素数を計算するスクリプト
for ((num=3; num<=100; num+=2))
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
触ったのは2を出力するようにしたことと、
for num in {2..100}
↓
for ((num=3; num<=100; num+=2))
3から2づつ足して(つまり奇数)、100までの数字 を対象としたこと、
そして、実施時間を比べてみる
対象の数字:100 処理時間:0m0.007s 素数の数:25
対象の数字:1000 処理時間:0m0.099s 素数の数:168
対象の数字:10000 処理時間:0m1.770s 素数の数:1229
対象の数字:100000 処理時間:0m37.493s 素数の数:9592
対象の数字:1000000 処理時間:15m11.596s 素数の数:78498
勝った!
人間様に二度と逆らうんじゃない!
一応100万までの計算で20秒ほど早くなった
ていうかほとんど変わない。誤差の範囲です
そもそも元のスクリプトでも偶数は2で割り切れるため、
一瞬で対象から外れるからそもそもそこまで影響を与えてないのかもしれない
いやしかし、誰が何というと短縮化はできている!と思う
やはり柔軟性は人間様のほうが上なのだきっと。
だから今後もChatGPTくんを人間様の応用力で有効活用するのがいいのだ