1 二元域 GF(2) 上的不可约多项式
二元域 GF(2)={0,1} 上的运算规则如下:
加法: + | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
乘法: | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
二元域
GF(2)
上的多项式具有形式
其中, ai∈GF(2), 0≤i≤n .
定义:一个次数大于等于 1 的多项式称为 不可约多的,如果它不能被分解为两个次数大于等于
1 的多项式的乘积.
显然,在二元域
GF(2)
上,一次多项式
p(x)=x+a0
是不可约多项式;次数大于
1
并且常数项
检查 GF(2) 上的多项式是否可约:设 p(x)=anxn+an−1xn−1+⋯+a1x+a0 为 n 次多项式.
(a) 若n=1 ,则 p(x) 为不可约多项式.
(b) 若 n>1 ,
(b.1) 若 a0=0 ,则 p(x) 为可约多项式.
(b.2) 若 a1=1 ,则用所有次数 ⌊n2⌋ 的(不可约)多项式 g(x) 除 p(x) . 若存在一个 g(x) 使得 g(x)|p(x) ,则 p(x) 为可约多项式,否则为不可约多项式.
2 二元域 GF(2) 上多项式的表示
多项式在计算机中常用其系数数组来表示. 自然地,二元域
GF(2)
上的一个
n
多项式
可以表示为一个 GF(2) 上的 n+1 维向量
因此,多项式环 GF(2)[x] 和 GF(2) 上的无穷维向量空间 GF∞(2) 之间存在“1-1”对应关系.
更进一步,任意一个
GF(2)
上的向量可以转化为一个非负整数:
显然,这也是一个“1-1”对应关系. 从而,二元域 GF(2) 上的一个多项式 p(x)=anxn+an−1xn−1+⋯+a1x+a0 与一个非负整数 ∑ni=0ai2i 相对应,我们得到“1-1”对应关系:
3 判断 GF(2) 上两个多项式的整除关系
在下面的 Matlab 函数判断 GF(2) 上的一个多项式是否能被另一个多项式整除,其中,多项式表示为由 ‘0’ 和 ‘1’ 组成的字符串的形式. 例如,多项式 f(D)=D3+D+1 表示为 ′1011′ .
function b = isDivisible(f,g)
% 判断二元域 GF(2) 上两个多项式的整除关系
% 若 'f' 可以被 'g' 整除,则返回 1;否则返回 0;
% 输入
% f: 被除式,由 '0' 和 '1' 组成的字符串来表示
% g: 除式,由 '0' 和 '1' 组成的字符串来表示
% 输出
% 若 'g' 整除 'f',则输出 1;否则,输出 0
%
% 如果被除式为 0,则返回 true (1)
if isempty(find(f,'1'))
b = true;
return;
end
% 去除高次的 0 系数
pos = find(f=='1',1);
f = f(pos:length(f));
len_f = length(f);
% 检查除式是否为零
if isempty(find(g=='1'))
error('Error: f is divided by 0')
end
% 去除高次的 0 系数
pos = find(g=='1',1);
g = g(pos:length(g));
len_g = length(g);
% 若被除式的次数小于除式的次数,返回不可整除
b = false;
if len_f < len_g
return;
end
% 除法
for i = 1:len_f-len_g+1
if f(i) == '0'
continue;
end
for j=1:len_g
if f(i+j-1) == g(j)
f(i+j-1) = '0';
else
f(i+j-1) = '1';
end
end
end
% 检查余式是否为 0
b = true;
for i=len_f-len_g+1:len_f
if f(i) == '1'
b = false;
break;
end
end
end
例:判断在 GF(2) 上多项式 x3+x2+x+1 和 x3+1 能否被多项式 x2+1 整除.
>> isDivisible('1111','101')
ans =
1
>> isDivisible('1001','101')
ans =
0
注:在Matlab中,函数 dec2bin 和 bin2dec 分别将一个整数转化为’01’字符数组和将一个’01’字符数组转化为整数. 利用前一个函数,我们可以用整数来表示 GF(2) 上的多项式,并把上面函数的输入类型改为两个整数;后一个函数将在下一节使用.
4 计算 GF(2) 上的不可约多项式
下面的 Matlab 函数计算所有 GF(2) 上次数不超过 n 次的不可约多项式.
function [IrrPolys,Nums] = AllIrrPolys(n)
% 计算二元域 GF(2) 上所有次数不超过 'n' 的不可约多项式
% 输入
% n: 多项式的次数
% 输出
% IrrPolys: 所有次数不超过 'n' 的不可约多项式
% Nums: 各次的不可约多项式的个数
%
Nums = zeros(1,n); % '1' 至 'n' 次不可约多项式的个数
% '1' 次不可约多项式
IrrPolys = [bin2dec('10'),bin2dec('11')];
Nums(1) = 2;
total_num = 2;
% '2' 至 'n' 次不可约多项式
for d = 2:n
cnt = 0;
for k = (2^d+1):2:(2^(d+1)-1)
isDiv = false;
for s = 1:floor(d/2)
off_set = sum(Nums(1:s-1));
for t = 1:Nums(s)
isDiv = isDivisible(dec2bin(k),dec2bin(IrrPolys(off_set+t)));
if isDiv
break;
end
end
if isDiv
break;
end
end
if ~isDiv
total_num = total_num + 1;
IrrPolys(total_num) = k;
cnt = cnt + 1;
end
end
Nums(d) = cnt;
end
end
注1:在函数中,
注2:所有不可约多项式都保存在数组 IrrPolys 中. 可用命令 IrrPolys(sum(Nums(1:k-1))+1:sum(Nums(1:k))) 列出所有次数为 k 的不可约多项式.
注3:
GF(2)
的
n
次不可约多项式的个数为
其中 μ 为Moebius函数,定义为
例:计算所有
GF(2)
上次数不超过
5
次的不可约多项式,并列出所有
>> [IrrPolys,Nums] = AllIrrPolys(5)
IrrPolys =
Columns 1 through 13
2 3 7 11 13 19 25 31 37 41 47 55 59
Column 14
61
Nums =
2 1 2 3 6
>> IrrPolys(sum(Nums(1:4-1))+1:sum(Nums(1:4)))
ans =
19 25 31