2012-03-11 18 views
4

私は暗号化に取り組んでおり、いくつかの本当に大きな数字を使用する必要があります。私は浮動小数点データを引数として取り込む関数をロードすることによって行われるm128iデータ型を必要とするキャリーレス乗算のための新しいIntel命令も使用しています。Cのカスタムデータ型

私は2^1223の整数を格納し、それを正方形にしてその値を格納する必要があります。

私はGMPライブラリを使うことができますが、2^1224と2^2448のような値を格納する2つのデータ型を作成する方が速いと思います。それはオーバーヘッドが少なくなります。私はkaratsubaを使用して数値を乗算するので、データ型で実行する必要がある唯一の演算はm128iに合うように数値を壊すためです。

私が必要とする整数のサイズを作成するのに役立つ資料に向けて、誰かが私に指示することができます。

+4

あなた自身がロールしたコードは、すでに非常に高度に最適化された(デバッグされた)コードより速くなると思いますか? (あなたがこれを興味のあるものにしているのであれば、あなたのままにしてください:)) – huon

答えて

4

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

typedef struct bignum_s bignum; 

そして:

struct bignum_s { 
    char bignum_data[1024]; 
} 

(明らかにあなたは、サイズが権利を取得したい、これは単なる一例です)

ほとんどの人が同様にそれをtypedefing終わりますあなたが望むことをするために数字へのポインタを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)が必要です。今必要がなくても、あらかじめコードを実行すると、後でコードを拡張して開発する必要があるときに役立ちます。

+1

注:この例または関数は、値渡しのために破損しています。呼び出し元の「a」は変更されません。 – unwind

+0

がポインタに変更されました。ありがとう! –

関連する問題