信息论作业中有一道题目要求判断两个生成函数g1(x)和g2(x)构成的(2,1,m)卷积码是否为恶性卷积码。解题的关键是判断两多项式g1(x)和g2(x)是否有非常数的公因式。一种办法是:在GF(2)域上求两多项式的最大公因式。若最大公因式不是常数,则两多项式构成的卷积码是恶性卷积码。

在matlab的help文件里查了下,没有找到现成的GF(2)域求两多项式最大公因式的函数,于是自己动手写了一个。代码附在下面。

被注释掉的代码是第一个版本。当时不知道有个现成的gfdeconv函数可以直接在GF(2)计算多项式除法,因此写得笨笨的。知道以后就改写现在的样子。不过值得注意的是,与一般的翻卷积函数不同,gfdeconv函数把向量看做升幂排列的多项式。

clear ;

% GF(2) 域中求两多项式的最大公因式

% 注意多项式是降幂排列的还是升幂排列的

% b(x) = x^2, a(x) = x^3 + x^2 + 1

% 降幂排列表示

% b = [1 0 0];

% a = [1 0 1 1];

% 升幂排列表示

b = [ 0 0 1 ];

a = [ 1 1 0 1 ];

while ( sum ( b ) > 0 )

t = b ;

% 注意! conv deconb 函数认为多项式按降幂排列

%     [q,r] =deconv(a,b);

%     b =mod(r,2);

%     ind =find(b,1,'first');

%     b =b(ind:end);

% gfconv gfdeconv 等函数认为多项式按升幂排列

% 例如 [0 0 1] 代表 x^2

[ quot , remd ] = gfdeconv ( a , b );

b = remd ;

a = t ;

信息论作业中有一道题目要求判断两个生成函数g1(x)和g2(x)构成的(2,1,m)卷积码是否为恶性卷积码。解题的关键是判断两多项式g1(x)和g2(x)是否有非常数的公因式。一种办法是:在GF(2)域上求两多项式的最大公因式。若最大公因式不是常数,则两多项式构成的卷积码是恶性卷积码。在matlab的help文件里查了下,没有找到现成的GF(2)域求两多项式最大公因式的函数,于是自己动手写了一
给出论文出处:https://wenku.baidu.com/view/da6d8d85b9d528ea81c77922.html 里面生成 GF (2)上任意阶本原 多项式 的算法花了一天才理解,觉得应该写下来,方便自己,也方便别人! 记n次 多项式 ,所谓 GF (2)上的 多项式 ,即; 前面都好理解,直接说论文中寻找n阶本原 多项式 的算法。考虑的是形如的 多项式 ,论文中假定,且;首先,这里懵逼了好一会,既然之前均为1,怎么还会有使得,后来才明白,当 多项式 的自变量是时,的加法与乘法就变成了上的加法与乘法,不了解上加法与
多项式 GF (2)内的 最大 公因式 可以使用扩展欧几里得算法(Extended Euclidean Algorithm)。具体步骤如下: 1. 将 多项式 记为f(x)和g(x),其中f(x)的次数大于g(x)。 2. 对于 GF (2)中的 多项式 ,加法变成了异或运算,即1+1=0,0+1=1,0+0=0,1+0=1。 3. 初始化 多项式 的系数矩阵: a(x) = 1 0 0 … 0 b(x) = 0 1 0 … 0 4. 初始化r0(x) = f(x)和r1(x) = g(x)。 5. 对于i=1,2,…n,执行以下操作,其中n为f(x)的次数: a. 使用扩展欧几里得算法来找到r_i(x)和r_(i-1)(x)的 最大 公因式 d_i(x),以及关于d_i(x)的贝祖等式的解s_i(x)和t_i(x): (1) d_i(x) = gcd(r_i(x), r_(i-1)(x)) (2) d_i(x) = s_i(x) * r_i(x) + t_i(x) * r_(i-1)(x) b. 如果d_i(x)是常数 多项式 (即等于1或0),则停止运算。 c. 更新系数矩阵a(x)和b(x): (1) temp(x) = a(x) - s_i(x) * b(x) (2) a(x) = b(x) (3) b(x) = temp(x) 6. 最后得到的b(x)就是f(x)和g(x)在 GF (2)内的 最大 公因式 。 这个算法的时间复杂度是O(n^3),其中n为f(x)的次数。在实现时,可以使用位运算和快速幂技巧来优化算法的效率。