ChatGPTに素数を計算するbashスクリプトを書かせてみた②

数学者-1
前回のつづき


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くんを人間様の応用力で有効活用するのがいいのだ