信息论作业中有一道题目要求判断两个生成函数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)的次数。在实现时,可以使用位运算和快速幂技巧来优化算法的效率。