2008-09-22 45 views
4

我有這樣的C代碼在GF(8)做乘法:優化Y = X * X在伽羅瓦域算術

int32_t GaloisMultiply (int32_t a, int32_t b) 
{ 
    int32_t i; 
    int32_t mask = 0x100; 
    int32_t y = 0; 

    for(i=0;i<8;i++) 
    { 
     if(b & mask) 
     { 
      y ^= a; 
     } 
     mask >>= 1; 
     y <<= 1; 
    } 

    if(b & 0x1) 
    { 
     y ^= a; 
    } 

    return(y); 
} 

這或多或少課本實現。

我想知道如果我能斷言a總是b,例如我是否有上述算法的巧妙優化。我做平方而不是乘法。我沒有使用密碼使用btw。我只想利用GF(8)中的x * x將x的位逐位交織爲零的事實。我已經發現GF(8)中的x * x做位交織的事情(偶然),我不能停止嘗試使用它進行比特交織優化。

任何想法?

回答

4

基於表? link

而當你被限制爲x * x時,它是一個稀疏矩陣。

這裏的另一個good paper (and a library)

+0

但是我很抱歉,我不認爲他們正在使用你明確提到的平方效應(比特交織)(或者考慮到這一點是否真的提高了性能)。 – 2008-09-22 20:40:04

+0

基於表格的方法應該快一些,不管你是否正在平方 – 2008-09-22 20:44:16

+0

基於表格的方法是有用的。謝謝。 – 2008-09-22 21:11:18

0

你可以寫一些程序集來做一個稍微好一點的工作。但是,如果這是您應用程序的瓶頸,我會很驚訝。你有沒有做過任何分析?這個功能似乎並不值得優化。

+0

確實是一個瓶頸。如果我在不同的體系結構上運行代碼,那麼硬件中的乘法運算速度會提高30%。 – 2008-09-22 20:27:52

0

這可能不是你所尋找的,但這裏有一個輕微的加速:

通行證只有一個參數,如果他們保證是相同的。

0

它可以幫助編譯了一下,以紀念 「A」 和 「B」 爲const。或者手動展開循環。如果它有幫助,這將是可悲的,但...

順便說一下,這不是專利雷區嗎?

1
int32_t GaloisMultiply(int32_t a) 
{ 
    int32_t y = 0; 
    int32_t b = a & 0x01ff; 

    while (b) 
    { 
    if (b & 1) 
     y ^= a; 

    a <<= 1; 
    b >>= 1; 
    } 
    return y; 
} 

或者,如果你喜歡:

int32_t GaloisMultiply(int32_t a) 
{ 
    int32_t y = 0; 
    for (int32_t b = a & 0x01ff; b; b >>= 1) 
    { 
    if (b & 1) 
     y ^= a; 

    a <<= 1; 
    } 
    return y; 
} 

的原因,這種方法的效率比上面的原代碼主要是因爲循環只有等到在參數所有的「有趣」位執行被消耗而不是盲目地檢查所有(9)位。

雖然基於表格的方法會更快。