本源多项式生成(原创java,可直接引用,由于二维码里面要运用又不想查表,于是自己手动写了个类,自动生成)

1、首先了解本源多项式定义:

 

二、    * 比如我们要求Gf(2)上的m次扩展的本原元n=2^m-1
    * 那么它的充要条件是此多项式(f(x))最高项为m次,f(x)为不可约多项式,f(x)能被x^n+1 整除 (f(x|x^n+1))
    * 那么f(x)不能被x^q+1整除 1<=q<n
    *
    * 得出结论:1。f(x)的最高次项必为m次并且系数为1
    *           2.f(x)为不可约多项式必不被x整除 也就是最后一项必须有一个1
    *           3.如果m=1,f(x)=x+1
    *           4:如果m>1,例如:m=4 这里的系数{0,1} 记 f(x)=x^4+a*x^3+b*x^2+c*x+1 那么它不能被x+1整除
    *           那么当x=1时 f(1)=1+a+b+c+1=a+b+c!=0     也就是说a+b+c 中间为1的个数比为奇数
      *          即比m次小并且不包括0次的系数和比为奇数   (减少迭代次数)
      * 例如:f(x)=1+x+x^2+x^3+x^4  f1(x)=1+x+x^4
      *  它们是否为本源多项式:第一项满足 中间和均为奇数
      *                        第二项 是否能被x^q+1整除 1<=q<n (n=2^4-1=15)
      *                        经过反复计算 f1(x)能被x^5+1 整除 f(x)不能被整除

三、由于研究时间太少,涉及的算法较简单,因此高阶运算较慢,慎用,最好是8阶以下,9阶有点慢了。测试了以下

这是一个九阶的生成示例图:

package com;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

/**
 * Created by 常发均 on 2020/6/5.
 * 本源多项式生成工具类
 */
public class bydxsUtil {
    public String XYCODE;
    public int ZCNUM;
    public List<String> listBydxs=new ArrayList<String>();
    public int KZNUM;//在几次的扩展number  就是m
    public    bydxsUtil(){}
    public    bydxsUtil(int KZNUM){
        this.KZNUM=KZNUM;
        dxssc();
    }
    public void dxssc(){
        if(KZNUM<2){
            return;
        }
        else if(KZNUM==2){
            listBydxs.add("10");
            return;
        }else if(KZNUM==3){
            listBydxs.add("110");
            return;
        }
        /*
        * 最外层循环表示个数  也就是中间个数为 奇数
        * 然后层层递归 直至找到对应多项式

       *  此算法实现原理:1、首先确定 第一项与最后一项 x^m+1

      *                                2、假定中间只有一个x项  如:x^m+x+1 ,x^m+x^2+1 ,x^m+x^3+1... (并指数从小到大,防止重复 )并将这些多项式存入集合中,

                                                          中间有两项:就是上一次的基础上在选择其他与自己不相同的项,当然选择的时候只能选择指数比自己大的项,防止重复 如:x^m+x+1 在它的基础上选择有x^m+x+x^2+1,x^m+x+x^3+1,x^m+x+x^4+1..x^m+x+x^(m-1)+1

                                                         中间有n项:在中间有n-1项的基础上进行选择 例如:x^m+x+..+x^(n-1)+1 选择有

          x^m+x+..+x^(n-1)+x^n+1,     x^m+x+..+x^(n-1)+x^(n+1)+1,‘’‘,       x^m+x+..+x^(n-1)+x^(m-1)+1,       

       *                                                     
        * */
        LinkedHashMap<Integer,ArrayList<ArrayList<Integer>>> lmp=new LinkedHashMap<Integer, ArrayList<ArrayList<Integer>>>();
         String code="";
          for(int num=1;num<KZNUM;num++){
              ArrayList<ArrayList<Integer>> list=new ArrayList<ArrayList<Integer>>();
              if(num==1){
                  for(int i=1;i<KZNUM;i++){
                      ArrayList<Integer> list2=new ArrayList<Integer>();
                      list2.add(i);
                      list.add(list2);
                  }
              }else{
                  ArrayList<ArrayList<Integer>> list2=lmp.get(num-1);
                  for(int i=0;i<list2.size();i++){
                      int a=list2.get(i).get(list2.get(i).size()-1);
                      if(a<KZNUM-1){
                          for(int j=a+1;j<KZNUM;j++){
                              ArrayList<Integer> list3=new ArrayList<Integer>();
                              for(int m=0;m<list2.get(i).size();m++){
                                  list3.add(list2.get(i).get(m));
                              }
                              list3.add(j);
                              list.add(list3);
                          }
                      }
                  }
              }
              lmp.put(num,list);
        }
        for(Integer key:lmp.keySet()){
            if(key%2==1){
                for(int i=0;i<lmp.get(key).size();i++){
                    String str="";
                    for(int j=0;j<=KZNUM;j++){
                       if(j==0||j==KZNUM){
                           str+="1";
                       }else{
                           if(lmp.get(key).get(i).contains(j)){
                               str+="1";
                           }else{
                               str+="0";
                           }
                       }
                    }
                    if(bydxsxy(str)){
                        listBydxs.add(str);
                    }
                }
            }
        }
    }
    /*
    * 本源多项式效验
    * */
    public  boolean bydxsxy(String code){
        boolean flag=false;
        if(code.length()<2){
            return flag;
        }
        if(!code.substring(0,1).equals("1")||!code.substring(code.length()-1,code.length()).equals("1")){
            return flag;
        }
        if(code.length()==2){
            return true;
        }
        String str=code.substring(1,code.length()-1).replaceAll("0","");
        if(str.length()%2==0){
            return flag;
        }
        if(code.length()==3){
            return true;
        }
        int n=(int)Math.pow(2,code.length()-1)-1;
       /*
        * 判断是否能被x^n+1整除 n=2^m-1
        * ys="" 表示整除 否则不整除
        * */
        String  ys=dxscf(getXn1(n),code);
        if(ys.equals("")){
            for(int i=2;i<n;i++){
                if(i==code.length()-1){
                    continue;
                }
           String  xyys=i>code.length()-1?dxscf(getXn1(i),code):dxscf(code,getXn1(i));
                if(xyys.equals("")){
                    ZCNUM=i;
                    return flag;
                }
            }
        }
        else{
            return flag;
        }
        return true;
    }
    /*
    * 左移 使其最高此相同
    * */
    public String zy(String ys,String code){
        String str=code;
        if(ys.length()>code.length()){
            for(int i=0;i<ys.length()-code.length();i++){
                str=str+"0";
            }
        }
        return str;
    }
    /*
    * 获取x^n+1 的String 字符串
    * */
    public String getXn1(int n){
        String str="";
        for(int i=0;i<=n;i++){
            if(i==0||i==n){
                str+="1";
                continue;
            }
            str+="0";
        }
        return str;
    }
    /*
    * 除法的除数以及被除数
    * */
    public String dxscf(String str,String code){
        String ys=str;
        String cs="";
        while(true){
            if(ys.indexOf("1")==-1){
                ys="";
            }else{
                ys=ys.substring(ys.indexOf("1"));
            }
            cs=zy(ys,code);
            String zjzh="";
            if(ys.length()==cs.length()){
                for(int i=1;i<ys.length();i++){
                    int a=Integer.valueOf(ys.substring(i,i+1))+Integer.valueOf(cs.substring(i,i+1));
                    a=a%2;
                    zjzh+=a+"";
                }
                ys=zjzh;
            }else{
                break;
            }
        }
        return ys;
    }
    public static void main(String[] args) {
        bydxsUtil by=new bydxsUtil(9);
        System.out.println("=="+by.listBydxs.size());
        for(int i=0;i<by.listBydxs.size();i++){
            String str="";
            for(int j=0;j<by.listBydxs.get(i).length()-1;j++){
                if(by.listBydxs.get(i).substring(j,j+1).equals("1")){
                    str+="x^"+(by.listBydxs.get(i).length()-j-1)+"+";
                }
            }
            str+="1";
            System.out.println(str);
        }
    }
    }

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值