ChatGPTでハミング符号の復号アルゴリズムをC言語実装してみた

ChatGPTなるものが世間を賑わせています。
(世間ってどこよ?)

自然言語処理のための大規模言語モデルの1つです。
文章生成、対話システム、テキストマイニングなどに活用できるシステム。

ざっくり言うと、
・パソコン上で利用できて
・「普段の会話感覚」で文章を入力すると
・いろいろな文字列を作り出してくれる
そんなサービスです。

例えば

最初のデートで、相手を喜ばせるには、どんな会話したら良いと思う?

と入力すると

最初のデートでは、お互いに興味を持つ話題を見つけたり、相手に好印象を与えることが重要です。以下は、相手を喜ばせる可能性のある会話のトピックの例です。

  1. 趣味や興味を尋ねる
  • どのような趣味や娯楽が好きですか?
  • 最近読んだ本や映画は何ですか?
  • 旅行で行ってみたい場所はありますか?
  1. 仕事や学校について話す
  • 仕事や学校で何をしているのですか?
  • どんなキャリアゴールを持っていますか?
  • 好きな職場環境は何ですか?
  1. 質問に答える
  • 自分自身についてもっと知りたいことはありますか?
  • 最近自分で新しいことを始めたり、挑戦したことはありますか?
  • お互いに好きな食べ物やレストランは何ですか?

ただし、相手が話したいことや、話題に触れるのが適切であるかどうかを常に意識し、相手にリスペクトを示すことが大切です。また、相手が話をしているときは、真剣に聞き、興味を持って聞くことも重要です。

のような文が返ってきます。

 

上の様なふんわりとした対話もできますが、専門的な内容を扱うこともできます。

僕の専門の符号理論には「ハミング符号」と呼ばれる誤り訂正符号があります。

この誤り訂正の仕組みを「ソフトウェア実装」するために、ChatGPTを使ってみましょう。

ハミング符号の復号アルゴリズムをC言語で記述して下さい。

と入力したところ、次の回答がありました。

以下は、ハミング符号の(7, 4)符号化方式の復号アルゴリズムの例です。このアルゴリズムは、エラー訂正が可能な1ビットの誤りを検出でき、1ビットの誤りを訂正することができます。

続いて

#include <stdio.h>

int main() {
int received[7]; // 受信した符号語
int decoded[4]; // 復号した情報語
int error_bit = 0; // エラーがあったビットの位置

printf(“Enter the received codeword (7 bits): “);
for (int i = 0; i < 7; i++) {
scanf(“%d”, &received[i]);
}

// シンドロームを計算する
int syndrome[3] = {0};
syndrome[0] = (received[0] + received[1] + received[3]) % 2;
syndrome[1] = (received[0] + received[2] + received[3]) % 2;
syndrome[2] = (received[1] + received[2] + received[3]) % 2;

// シンドロームからエラーの位置を特定する
error_bit = syndrome[0] + syndrome[1]*2 + syndrome[2]*4;

if (error_bit != 0) {
printf(“Error detected at bit %d\n”, error_bit);
// エラーを訂正する
received[error_bit – 1] = (received[error_bit – 1] + 1) % 2;
printf(“Corrected codeword is: “);
for (int i = 0; i < 7; i++) {
printf(“%d”, received[i]);
}
printf(“\n”);
} else {
printf(“No errors detected\n”);
}

// 復号する
decoded[0] = received[2];
decoded[1] = received[4];
decoded[2] = received[5];
decoded[3] = received[6];

printf(“Decoded message is: “);
for (int i = 0; i < 4; i++) {
printf(“%d”, decoded[i]);
}
printf(“\n”);

return 0;
}

 

実際の入出力の画面キャプチャがこちらです。

 

 

思わず、
 ChatGPTって賢い!!!

と思ってしまったのですが。
よく見ると
 「シンドロームを計算する」以降の4行は、計算が間違っています。
そこで間違いを指摘します。具体的には次の入力をしました。

あなたのプログラムに間違いを発見しました。

syndrome[0]はreceivedの0,1,3の和ではなくて、0,2,4,6の和です。
syndrome[1]はreceivedの0,2,3の和ではなくて、1,2,5,6の和です。
syndrome[1]はreceivedの1,2,3の和ではなくて、3,4,5,6の和です。

これらの3行を修正して下さい。

するとChatGPTからの返事は

申し訳ありません、間違いを修正します。正しいシンドロームの計算方法は以下の通りです:

続いて
 
// シンドロームを計算する
int syndrome[3] = {0};
syndrome[0] = (received[0] + received[2] + received[4] + received[6]) % 2;
syndrome[1] = (received[1] + received[2] + received[5] + received[6]) % 2;
syndrome[2] = (received[3] + received[4] + received[5] + received[6]) % 2;
これは正しい計算です。正解を導き出せたので、私から次の入力をしました。
 
その通りです。素晴らしい。
では、修正版のソースコード全体を出力して下さい。
その結果、ChatGPTからの返事として次のソースコードが出力されました。
 

#include <stdio.h>

int main() {
int received[7]; // 受信した符号語
int decoded[4]; // 復号した情報語
int error_bit = 0; // エラーがあったビットの位置

printf(“Enter the received codeword (7 bits): “);
for (int i = 0; i < 7; i++) {
scanf(“%d”, &received[i]);
}

// シンドロームを計算する
int syndrome[3] = {0};
syndrome[0] = (received[0] + received[2] + received[4] + received[6]) % 2;
syndrome[1] = (received[1] + received[2] + received[5] + received[6]) % 2;
syndrome[2] = (received[3] + received[4] + received[5] + received[6]) % 2;

// シンドロームからエラーの位置を特定する
error_bit = syndrome[0] + syndrome[1]*2 + syndrome[2]*4;

if (error_bit != 0) {
printf(“Error detected at bit %d\n”, error_bit);
// エラーを訂正する
received[error_bit – 1] = (received[error_bit – 1] + 1) % 2;
printf(“Corrected codeword is: “);
for (int i = 0; i < 7; i++) {
printf(“%d”, received[i]);
}
printf(“\n”);
} else {
printf(“No errors detected\n”);
}

// 復号する
decoded[0] = received[2];
decoded[1] = received[4];
decoded[2] = received[5];
decoded[3] = received[6];

printf(“Decoded message is: “);
for (int i = 0; i < 4; i++) {
printf(“%d”, decoded[i]);
}
printf(“\n”);

return 0;
}

バッチリです。

ChatGPTに対する私の印象は
 よく間違えるけど作業の早いアシスタント
です。

とにかく間違えます。
ですから、
利用側に
 正解と不正解を見極められる力
が要求されます。

上手く活用すれば、
自分で考えるよりも早くプログラミングできます。

デートの例もそうですが、
それらしい答えを短時間で導いてくれます。
ただし、あてになるかどうか分かりません。


JOJO第9部~ザ・ジョジョランズ~

ジョジョの奇妙な冒険の第9部が始まりました。

ウルトラジャンプという雑誌の2023年3月号(2023年2月17日発売)に第1話が掲載されています。

何が凄いって、
 舞台がハワイ!!!!

ハワイ在住者の僕にとって、
ジョジョファンの僕にとって、
これは熱いっっつつ!!!

最近滞っていたブログを更新するほど衝撃的な出来事でした。

 


メレ・カリキマカ

もう12月じゃないか。

ってことは、

ハワイの街も。

クリスマス!

商業施設はもちろん、
オフィス街も、
住宅街も、
クリスマスデコレーションが楽しい。

ちょっとしたビルの入り口も、
しっかりデコレーション。

こちらはアラモアナショッピングセンターのツリー。
商業施設は飾りもデカい!

ちなみに、
メリー・クリスマスのことをハワイ語では
メレ・カリキマカって言います。