matlab判断矩阵不可约,用Matlab计算二元域GF(2)上的不可约多项式
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) 上的多項式具有形式
p(x)=anxn+an?1xn?1+?+a1x+a0
其中,
ai∈GF(2),0≤i≤n .
定義:一個次數大于等于 1 的多項式稱為 不可約多的,如果它不能被分解為兩個次數大于等于 1 的多項式的乘積.
顯然,在二元域 GF(2) 上,一次多項式 p(x)=x+a0 是不可約多項式;次數大于 1 并且常數項 a0=0 的多項式均為可約多項式(因為有一次因式 x),從而次數大于 1 的多項式是不可約多項式的必要條件是常數項 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 多項式
p(x)=anxn+an?1xn?1+?+a1x+a0
可以表示為一個
GF(2) 上的
n+1 維向量
P=(an,an?1,…,a1,a0)∈GFn+1(2)
因此,多項式環
GF(2)[x] 和
GF(2) 上的無窮維向量空間
GF∞(2) 之間存在“1-1”對應關系.
更進一步,任意一個 GF(2) 上的向量可以轉化為一個非負整數:
(an,an?1,…,a1,a0)→∑i=0nai2i
顯然,這也是一個“1-1”對應關系. 從而,二元域
GF(2) 上的一個多項式
p(x)=anxn+an?1xn?1+?+a1x+a0 與一個非負整數
∑ni=0ai2i 相對應,我們得到“1-1”對應關系:
GF(2)[x]→Z?
p(x)=∑i=0naixi?p(2)=∑i=0nai2i
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:在函數中,GF(2) 上的多項式用其對應的正整數來表示.
注2:所有不可約多項式都保存在數組 IrrPolys 中. 可用命令 IrrPolys(sum(Nums(1:k-1))+1:sum(Nums(1:k))) 列出所有次數為 k 的不可約多項式.
注3: GF(2) 的 n 次不可約多項式的個數為
N(n)=1n∑d|nμ(d)2n/d
其中
μ 為Moebius函數,定義為
μ(m)=???1(?1)k0如果m=1如果m=p1p2?pk,其中p1,p2,…,pk為互不相同的素數其它
例:計算所有 GF(2) 上次數不超過 5 次的不可約多項式,并列出所有 4 次不可約多項式.
>> [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
總結
以上是生活随笔為你收集整理的matlab判断矩阵不可约,用Matlab计算二元域GF(2)上的不可约多项式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【一、vxWorks6.9】
- 下一篇: python机器学习 | SVM算法介绍