用Matlab计算二元域GF(2)上的不可约多项式
来源:互联网 发布:谌洪果 知无知 编辑:程序博客网 时间:2024/05/29 19:57
1 二元域 GF(2) 上的不可约多项式
二元域
二元域
其中,
定义:一个次数大于等于
1 的多项式称为 不可约多的,如果它不能被分解为两个次数大于等于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) 上多项式的表示
多项式在计算机中常用其系数数组来表示. 自然地,二元域
可以表示为一个
因此,多项式环
更进一步,任意一个
显然,这也是一个“1-1”对应关系. 从而,二元域
3 判断 GF(2) 上两个多项式的整除关系
在下面的 Matlab 函数判断
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 endend% 检查余式是否为 0b = true;for i=len_f-len_g+1:len_f if f(i) == '1' b = false; break; endendend
例:判断在
>> isDivisible('1111','101')ans = 1>> isDivisible('1001','101')ans = 0
注:在Matlab中,函数 dec2bin 和 bin2dec 分别将一个整数转化为’01’字符数组和将一个’01’字符数组转化为整数. 利用前一个函数,我们可以用整数来表示
4 计算 GF(2) 上的不可约多项式
下面的 Matlab 函数计算所有
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;endend
注1:在函数中,
注2:所有不可约多项式都保存在数组 IrrPolys 中. 可用命令 IrrPolys(sum(Nums(1:k-1))+1:sum(Nums(1:k))) 列出所有次数为 k 的不可约多项式.
注3:
其中
例:计算所有
>> [IrrPolys,Nums] = AllIrrPolys(5)IrrPolys = Columns 1 through 13 2 3 7 11 13 19 25 31 37 41 47 55 59 Column 1461Nums = 2 1 2 3 6>> IrrPolys(sum(Nums(1:4-1))+1:sum(Nums(1:4)))ans =19 25 31
- 用Matlab计算二元域GF(2)上的不可约多项式
- MATLAB求出不可约多项式(实现二进制加法、除法)
- GF(2)域求两多项式的最大公因式
- GF[2^n]下的多项式除法
- GF[2^n]下的多项式乘法
- 求次数不大于5的不可约多项式
- 一元、二元多项式计算函数
- matlab计算PN序列的本原多项式
- 用matlab符号计算求解二元函数极值
- 二元多项式
- 二元多项式
- 二元多项式
- 二元多项式
- 二元多项式
- 二元多项式
- 二元多项式
- 二元多项式
- 二元多项式
- shell程序设计(二)
- Codeforces Round #342 (Div. 2) 总结
- swift 报错
- ubuntu 安装dnw 适用于6410和2410
- Redis入门很简单之五【Jedis和Spring的整合】
- 用Matlab计算二元域GF(2)上的不可约多项式
- 序
- Markdown编辑器一览
- 【慕课笔记】U4 多态 第2节 多态中的引用类型转换
- Redis入门很简单之六【Jedis常见操作】
- 动手写第一个Windows程序
- HDU 3591 (多重背包)
- Redis入门很简单之七【使用Jedis实现客户端Sharding】
- Redis入门很简单之八【Spring Data Redis初探】