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

エフ
2025-01-20
2025-01-20

数学者-1
ああ、心を落ち着かせたい。
心を落ち着かせるために素数を数えたい。
Linuxエンジニアとしては素数を出すためにbashのスクリプトを作りたい。
ということで考えてみる。

ええっと素数は1と自分以外でしか割れない数字だから、
とりあえず、100までとして、for文で回して、
対象の数字を自分より大きくなるまでの数字を使って、割って、
余りが0になるものを割り出し、その中で1と自分のものだけになるものが
素数になるからその数字を抽出して
ええっと・・・・・・

うん。できるよ。あと10分ほど考えれば、考えがまとまって、
スクリプトもすぐ作れるよ。


でも、ちょっとChatGPTくんだとどうするのか聞いてみたいなあ。


ChatGPTくん、100までの素数を計算するスクリプトをbashで作れるかね?

GPT
もちろんです!以下は、100までの素数を計算するBashスクリプトの例です。



#!/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


GPT
このスクリプトは、2から100までの各数値について、その数が素数かどうかをチェックし、素数であれば出力します。forループとif文を使って、効率的に素数を判定しています。


は、早い!
う、うん。あれだね。概ね、私が考えた通りだね。


ちなみに説明できるかね?このスクリプトについて


GPT
is_prime=1 は、変数 is_prime を 1 に設定することを意味します。このスクリプトでは、is_prime 変数を使って数値が素数かどうかを判定しています。

具体的には、以下のように動作します:

初期設定: 各数値 num に対して、最初に is_prime を 1(真)に設定します。これは、数値が素数であると仮定するためです。
素数判定: 内部の for ループで、num が他の数値で割り切れるかどうかをチェックします。もし割り切れる場合、is_prime を 0(偽)に設定し、ループを抜けます。
出力: ループが終了した後、is_prime が 1 のままであれば、その数値は素数であると判断され、出力されます。
例えば、数値 5 の場合:

初期設定で is_prime=1。
2 から 4 までの数値で割り切れるかチェックしますが、割り切れないため is_prime は 1 のまま。
したがって、5 は素数として出力されます。


う、うん。なるほどなるほど。


あれ? 

for ((i=2; i*i<=num; i++))

ってどういうことかな?対象の数字まで割り算していくのじゃないのかな?



聞いたら答えてくれそうだが、一応自分で考えてみる。

for ((i=2; i*i<=num; i++))って、対象数字の平方根までの数字ってことになる。


素数を出す上で、対象数字まで全部割り算をする必要はなく、
対象数字を超えない平方根までの数字で割るだけで十分なのか。

確かにそうかもしれない。100を素因数分解したときに、
100の平方根の10以下にしか素因数がないということか・・・・。


な、なるほど。や、やるじゃないか。
私が考えていた方法よりもほんのちょっぴり効率化しているね。
まあまあだね。

でも、これあれだね。ちゃんと動くのかね。
どうせ何かしらのエラーで動かないんじゃないのかね。

ということで実施してみる。


結果

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


はい。一瞬で100までの素数です。
問題ないです。


ぬ、こ、このままではAIに完全敗北してしまう。

な、何かないか、何かないのか。こいつに欠点はないのか。

いや、ある!
このスクリプトには致命的な欠点がある!


つづく