12

私は暗号化を使用しており、非常に大きな数を使用する必要があります。また、浮動小数点データを引数として取り込む関数をロードすることで実行されるm128iデータ型を必要とするキャリーレス乗算用の新しいIntel命令を使用しています。

2 ^ 1223整数を格納してから、それを2乗して、その値も格納する必要があります。

GMPライブラリを使用できることはわかっていますが、2^1224と2^2448のような値を格納する2つのデータ型を作成する方が速いと思います。オーバーヘッドが少なくなります。カラツバを使用して数値を乗算するため、データ型に対して実行する必要がある操作は、m128iに合わせて数値を分割するため、加算のみです。

誰かが私に必要な整数のサイズを作成するのを助けることができる材料に向かう方向に私を導くことができますか?

4

1 に答える 1

10

独自のデータ型が必要な場合 (数学用かどうかに関係なく)、構造体と関数にフォールバックする必要があります。例えば:

struct bignum_s {
    char bignum_data[1024];
}

(明らかに、サイズを正しくしたいのですが、これは単なる例です)

ほとんどの人はそれを型定義することになります:

typedef struct bignum_s bignum;

次に、数値への 2 つ (または何でも) のポインターを使用して、必要な処理を行う関数を作成します。

/* takes two bignums and ORs them together, putting the result back into a */
void
bignum_or(bignum *a, bignum *b) {
    int i;
    for(i = 0; i < sizeof(a->bignum_data); i++) {
        a->bignum_data[i] |= b->bignum_data[i];
    }
}

必要になる可能性のあるほとんどすべての関数を最終的に定義することを本当に望んでいます。これには、メモリ割り当て関数 ( bignum_new)、メモリ解放関数 ( bignum_free)、および初期化ルーチン ( bignum_init) が含まれることがよくあります。それらが今は必要ない場合でも、前もって実行しておくことで、後でコードを拡張および開発する必要があるときに備えることができます。

于 2012-03-11T15:10:42.130 に答える