有限域运算

  忙了一周,总算把网络编码的Demo搞定了。
  回想一下,大部分的时间都花在有限域的运算上了。网上找了几个运算类,没一个像样的,算出来
结果也没两个是一样的,汗...主要是三个方面的问题,一是本原多项式P(x),到现在我还是没搞懂这玩意是怎么定出来的,为什么同样是GF(2^8),有人说P(x)=x^8+x^4+x^3+x+1,有人又说是P(x)=x^8+x^4+x^3+x^2+1,而且两种还都可以正常运算(编码后可以正确解码),搞得我相当被动,最后选择的是前者,因为看起来支持的人要多一点,再汗...二是乘法,这也够混乱的,有人按多项式展开,有人直接对普通乘法求模,还有人...实在看不懂怎么算的。好在后来从一段AES加密算法的源码里扒出个用查表法实现的乘法函数,省时又好用。三是除法,这个简直就很少有人提及了,据说除法可以分解成乘法和求逆运算,可半天也没想出怎么分解,最后终于从一篇很老的paper里找到了一点提示,总算是基本把有限域运算这个难题给了结了。
  毕竟我不是搞数学的,有限域只不过是个工具,能用就行,不想也没时间深入研究下去了。不过还是把GF(2^8)运算中用到的几个函数贴上来吧,就当是行善积德了。
  代码主要是正反对数表的构造和乘除法,至于加减,当然就是神奇的异或了。

 

         public   static   int [] alog  =   new   int [ 256 ];
        
public   static   int [] log  =   new   int [ 256 ];
    
    
// 构造GF(2^8)上的对数表和反对数表
     public   void  generateLogTable()  {
        
int i, j;

        alog[
0= 1;
        
for (i = 1; i < 256; i++{
            j 
= (alog[i-1<< 1^ alog[i-1];
            
if ((j & 0x100!= 0)
                j 
^= 0x11B;        //0x11B即本原多项式x^8+x^4+x^3+x+1
            alog[i] = j;
        }


        log[
0= log[1= 0;
        
for (i = 1; i < 255; i++)
            log[alog[i]] 
= i;
    }

    
    
// GF(2^8)上的乘法运算,查表实现
     public   int  mul( int  A,  int  B)  {
        
if (A == 0 || B == 0)
            
return 0;
        
else
            
return alog[(log[A]+log[B])%255];
    }

    
    
// GF(2^8)上的除法运算,查表实现
     public   int  div( int  A,  int  B)  {
        
if (A == 0)
            
return 0;
        
else if (B == 0{
            System.err.println(
"divide by zero exception");
            
return -1;
        }

        
else {
            
if ((log[A]-log[B]) < 0)
                
return alog[(log[A]-log[B]+255)%255];
            
else
                
return alog[(log[A]-log[B])%255];
        }

    }

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值