🦁

AIの本領発揮か?すごひ

2023/08/05に公開

C言語でベクトルと置換群の半直積を計算するプログラムを以下に示します。ここでは、ベクトルを整数配列として表現し、置換群を構造体として表現します。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 置換群の構造体
typedef struct {
    int size; // 置換群の要素数
    int *perm; // 置換群の要素を格納する配列
} PermutationGroup;

// ベクトルと置換群の半直積を計算する関数
void halfDirectProduct(int *vector, int vectorSize, PermutationGroup group) {
    int i, j;
    int result[vectorSize]; // 結果を格納する配列

    // 半直積を計算
    for (i = 0; i < group.size; i++) {
        for (j = 0; j < vectorSize; j++) {
            // 置換群の要素に従ってベクトルを変換
            result[j] = vector[group.perm[i] * vector[j] % vectorSize];
        }

        // 結果を表示
        printf("半直積 %d 番目 (置換群の要素: ", i);
        for (j = 0; j < group.size; j++) {
            printf("%d ", group.perm[j]);
        }
        printf("): ");
        for (j = 0; j < vectorSize; j++) {
            printf("%d ", result[j]);
        }
        printf("\n");
    }
}

// 置換群をランダムに生成する関数
PermutationGroup generateRandomPermutation(int size) {
    PermutationGroup group;
    group.size = size;
    group.perm = (int*)malloc(sizeof(int) * group.size);

    // 初期化
    for (int i = 0; i < size; i++) {
        group.perm[i] = i;
    }

    // Fisher-Yates シャッフルアルゴリズムでランダムな順列を生成
    for (int i = size - 1; i > 0; i--) {
        int j = rand() % (i + 1);
        int temp = group.perm[i];
        group.perm[i] = group.perm[j];
        group.perm[j] = temp;
    }

    return group;
}

int main() {
    // ベクトルと置換群の要素数を設定
    int vectorSize = 4;
    int vector[] = {1, 2, 3, 4};

    // ランダムな初期置換群を生成
    srand(time(NULL));
    PermutationGroup initialGroup = generateRandomPermutation(vectorSize);

    // 初期置換群を表示
    printf("初期置換群: ");
    for (int i = 0; i < initialGroup.size; i++) {
        printf("%d ", initialGroup.perm[i]);
    }
    printf("\n");

    // 初期置換群を使って半直積を計算
    halfDirectProduct(vector, vectorSize, initialGroup);

    // x, y 置換群の生成
    PermutationGroup x = generateRandomPermutation(vectorSize);
    PermutationGroup y = generateRandomPermutation(vectorSize);

    // x = xyx^{-1} となるように x を更新
    PermutationGroup xyxInverse = generateRandomPermutation(vectorSize);
    for (int i = 0; i < vectorSize; i++) {
        xyxInverse.perm[i] = y.perm[x.perm[i]];
    }
    for (int i = 0; i < vectorSize; i++) {
        x.perm[i] = xyxInverse.perm[i];
    }

    // x, y 置換群を表示
    printf("x 置換群: ");
    for (int i = 0; i < x.size; i++) {
        printf("%d ", x.perm[i]);
    }
    printf("\n");

    printf("y 置換群: ");
    for (int i = 0; i < y.size; i++) {
        printf("%d ", y.perm[i]);
    }
    printf("\n");

このプログラムでは、ベクトルと置換群の半直積を計算するhalfDirectProduct関数を定義しています。ベクトルと置換群の要素数や要素は任意に変更できるようにしていますので、試したいベクトルや置換群に応じて適切な値を設定してください。計算結果はコンソールに表示されますが、必要に応じて結果を別のデータ構造に保存したり、任意の処理を追加することができます。


これ全部ChatGPTがやってくれました。
仕様は日本語で、かなり厳密に言わないと駄目ですが、この実力からするとただのプログラマーはいなくなるかもしれないです。ということは基礎研究というアルゴリズムがわからない分野の仕事だけが残るわけで、暗号の研究なんかもその中に入ると思います。
例えば、
「整数nとmの最小公倍数を拡張ユークリッドアルゴリズムを使って計算するC言語のプログラムを書いて」
というコマンドを打てば、そのとおりに書いてくれるはずです。

#include <stdio.h>

// ユークリッドの互除法を使って最大公約数を計算する関数
int gcd(int a, int b) {
    if (b == 0) {
        return a;
    } else {
        return gcd(b, a % b);
    }
}

// 拡張ユークリッドのアルゴリズムを使って最小公倍数を計算する関数
int lcm(int n, int m) {
    int gcd_result = gcd(n, m);
    return (n / gcd_result) * m;
}

int main() {
    int n, m;

    printf("整数 n を入力してください:");
    scanf("%d", &n);

    printf("整数 m を入力してください:");
    scanf("%d", &m);

    int result = lcm(n, m);
    printf("n と m の最小公倍数は %d です。\n", result);

    return 0;
}

これがChatGPTの出力です。コマンドが間違っていてもそれを上回る読解力があり、論理的にも矛盾しないコードを書いています。普通ならgcdを使って計算するのは、最大公約数のはずですが、「ユークリッドアルゴリズムを使って」と言ってもそのとおりにコードを出力しています。
これでもうサンプルコードを探して検索しまくる手間が省けるのです!
自分で書けることが重要ですが、楽をするために機械はあるのだ。
昔パソコンというものは、どんな質問にも答えてくれる魔法の箱だと思っていた(恐るべき誤解)ものが今になって実現したような気がします。

Discussion