2025年3月16日日曜日

三輪眞弘について生成AIに聞いてみた(4):「またりさま」のプログラムの作成(Geminiの場合)

   「またりさま」の状態遷移規則をプロンプトとして説明し、ChatGPTにプログラムを生成させることに成功したことについては既に報告済ですが、この記事では、その結果に基づきGeminiに対して同じ指示をしてプログラムを生成させた結果を報告します。Geminiも意図した動きをするプログラムの生成には成功しています。

 最初に与えたプロンプトは、ChatGPTとのやりとりを踏まえ、ChatGPTが正しいプログラムの生成できるまでに逐次的に与えたプロンプトを整理し、まとめたものですが、「x1とx2の計算結果でx2を更新してからx2とx3の計算をするというように順番に計算」という指示はプログラムに反映されず、配列全体のコピーを作って、全ての変数に対して同時に一気に排他的論理和の計算結果で更新をかける仕様のプログラムが生成されました。

 そこで改めてその点についての指示をプロンプトとして与え、意図通りの処理に変更されたことを確認した後、初期状態に戻ったら停止する処理を追加するプロンプトを与えて、ChatGPTが生成したものと同じ動きをするプログラムを生成させることができました。以下では既に報告済のChatGPTの回答との比較ができるように、生成されたコードだけではなく回答全体を示しますが、実行結果はChatGPTのものと実質的に同一なので、割愛させて頂きます。

(2025.3.16)

*     *     *

プロンプト:

「8個の[0,1]変数x1~x8について、x1とx2、x2とx3,...x8とx1というように 隣り合った変数間で排他的論理和を計算します。 x1とx2の計算結果でx2を更新してからx2とx3の計算をするというように 順番に計算をします。変数の値の変化を表示するプログラムを作って下さい。 計算は63回繰り返します。初期値は[0,0,0,1,0,1,0,1]とします。」

Gemini ()2025.3.13

はい、8個の[0,1]変数に対する排他的論理和の計算と、変数変化の表示プログラムを作成します。

プログラムの概要

  1. 初期値として [0, 0, 0, 1, 0, 1, 0, 1] のリストを作成します。
  2. 63回の繰り返し処理を行います。
  3. 各繰り返しにおいて、隣り合う変数間で排他的論理和を計算し、変数を更新します。
  4. 各繰り返しごとに、変数の状態を表示します。

Pythonコード

def exclusive_or_calculation(initial_values):
    """
    8個の変数に対する排他的論理和の計算と、変数変化の表示を行う関数。

    Args:
      initial_values: 変数の初期値リスト。
    """
    variables = initial_values[:]  # 初期値のコピーを作成
    print("初期値:", variables)

    for i in range(63):
        new_variables = variables[:]  # 変数のコピーを作成
        for j in range(8):
            # 隣り合う変数のインデックスを計算
            next_index = (j + 1) % 8
            # 排他的論理和を計算し、変数を更新
            new_variables[next_index] = variables[j] ^ variables[next_index]
        variables = new_variables
        print(f"ステップ {i + 1}: {variables}")

# 初期値
initial_values = [0, 0, 0, 1, 0, 1, 0, 1]
# 関数を実行
exclusive_or_calculation(initial_values)

コードの説明

  1. exclusive_or_calculation(initial_values) 関数:
    • 引数として初期値のリストを受け取ります。
    • variables リストに初期値のコピーを格納します。
    • 63回の繰り返し処理を行います。
    • 各繰り返しにおいて、new_variables リストに現在の変数のコピーを作成します。
    • 8個の変数に対して、隣り合う変数との排他的論理和を計算し、new_variables を更新します。
    • variables を new_variables で更新します。
    • 各ステップの変数の状態を表示します。
  2. 初期値:
    • initial_values リストに初期値を格納します。
  3. 関数実行:
    • exclusive_or_calculation 関数に初期値を渡して実行します。

このプログラムを実行すると、63ステップにわたる変数の変化が表示されます。

*     *     *

プロンプト:

「x1とx2の排他的論理和でx2を更新してから、x2とx3の計算をします。これを63回繰り返します。」

Gemini (2025.3.13)

はい、了解しました。x1とx2の排他的論理和でx2を更新してから、x2とx3の計算をするという処理を63回繰り返すプログラムを作成します。

Pythonコード

def exclusive_or_calculation_sequential(initial_values):
    """
    8個の変数に対する排他的論理和の計算と、変数変化の表示を行う関数(順番に更新)。

    Args:
      initial_values: 変数の初期値リスト。
    """
    variables = initial_values[:]  # 初期値のコピーを作成
    print("初期値:", variables)

    for i in range(63):
        for j in range(8):
            # 隣り合う変数のインデックスを計算
            next_index = (j + 1) % 8
            # 排他的論理和を計算し、変数を更新
            variables[next_index] = variables[j] ^ variables[next_index]
        print(f"ステップ {i + 1}: {variables}")

# 初期値
initial_values = [0, 0, 0, 1, 0, 1, 0, 1]
# 関数を実行
exclusive_or_calculation_sequential(initial_values)

コードの変更点

  • exclusive_or_calculation_sequential 関数では、new_variables を作成せずに、variables リストを直接更新するように変更しました。
  • これにより、x1とx2の排他的論理和でx2を更新してから、その更新されたx2とx3の計算をするというように、順番に計算が進むようになります。

この修正版のプログラムを実行すると、ご要望の通り、順番に排他的論理和の計算と更新が行われ、63ステップにわたる変数の変化が表示されます。

*     *     *

プロンプト:

「全ての変数が初期状態に戻ったら停止する処理を加えてください。」

Gemini (2025.3.13)

はい、全ての変数が初期状態に戻ったら停止する処理を追加します。

Pythonコード

def exclusive_or_calculation_sequential_with_stop(initial_values):
    """
    8個の変数に対する排他的論理和の計算と、変数変化の表示を行う関数(初期状態に戻ったら停止)。

    Args:
      initial_values: 変数の初期値リスト。
    """
    variables = initial_values[:]  # 初期値のコピーを作成
    print("初期値:", variables)

    for i in range(63):
        original_variables = variables[:]  # 現在の変数の状態を保存
        for j in range(8):
            # 隣り合う変数のインデックスを計算
            next_index = (j + 1) % 8
            # 排他的論理和を計算し、変数を更新
            variables[next_index] = variables[j] ^ variables[next_index]
        print(f"ステップ {i + 1}: {variables}")

        # 初期状態に戻ったかチェック
        if variables == initial_values:
            print("初期状態に戻りました。処理を停止します。")
            break

# 初期値
initial_values = [0, 0, 0, 1, 0, 1, 0, 1]
# 関数を実行
exclusive_or_calculation_sequential_with_stop(initial_values)

コードの変更点

  1. original_variables = variables[:]: 各ステップの開始時に、現在の変数の状態を original_variables に保存します。
  2. if variables == initial_values:: 各ステップの終了時に、現在の変数の状態が初期状態と一致するかどうかをチェックします。
  3. print("初期状態に戻りました。処理を停止します。"): 一致した場合、メッセージを表示して break でループを終了します。

この修正版のプログラムを実行すると、変数が初期状態に戻った時点で処理が停止し、メッセージが表示されます。

0 件のコメント:

コメントを投稿