2012-03-11 153 views
4

我正在使用密碼學,需要使用一些非常大的數字。我還使用新的英特爾指令進行無需乘法運算,該指令需要m128i數據類型,這是通過加載一個以浮點數據爲參數的函數來完成的。自定義數據類型C

我需要存儲2^1223整數,然後將其平方並存儲該值。

我知道我可以使用GMP庫,但我認爲創建兩個數據類型都可以更快,這兩個數據類型都存儲2^1224和2^2448等值。它會有更少的開銷。我打算使用karatsuba乘以數字,所以我需要在數據類型上執行的唯一操作是增加,因爲我將打破數字以適應m128i。

有人可以指導我的方向,可以幫助我創建我需要的整數大小的材料。

+4

您是否認爲自己編寫的代碼將比已經被高度優化(和調試)的代碼更快? (雖然如果你是出於興趣而做這件事,請繼續照原樣:)) – huon 2012-03-11 11:50:54

回答

4

如果你需要你自己的數據類型(無論是數學等),你需要回到結構和函數。例如:

struct bignum_s { 
    char bignum_data[1024]; 
} 

(很明顯,你想要得到的尺寸正確,這只是一個例子)

大多數人最終typedefing它還有:

typedef struct bignum_s bignum; 

然後創建需要兩個(或任何)指針的數字來做你想做的功能:

/* 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 2015-02-20 15:40:52

+0

改爲指針;謝謝! – 2015-02-23 18:21:21