示例#1
0
        public PolynomialOverFiniteField(Polynomial poly, FactorRing field)
        {
            Size   = 4;
            _field = field;
            _mod   = field.Mod;
            _deg   = poly.Deg;
            for (int i = _deg; i >= 0; i--)
            {
                if (poly[i] == 0 || (poly[i] == null))
                {
                    _deg--;
                }
                else
                {
                    break;
                }
            }



            var length = _deg + 1;

            if (length > Size)
            {
                int pow = (int)Math.Log(length, 2);
                Size = (int)Math.Pow(2, pow);
                if (length > Size)
                {
                    Size *= 2;
                }
                else
                {
                    Size = length;
                }
            }

            _coefficients = new Polynomial[Size];


            for (int i = 0; i <= _deg; i++)
            {
                _coefficients[i] = new Polynomial(new ulong[] { poly[i] % field.Char });
            }
        }
示例#2
0
        public PolynomialOverFiniteField(Polynomial[] arr, FactorRing field)
        {
            Size   = 4;
            _field = field;
            _mod   = field.Mod;
            _deg   = arr.Length - 1;
            for (int i = _deg; i >= 0; i--)
            {
                if (arr[i] == Polynomial.Zero || (arr[i] == null))
                {
                    _deg--;
                }
                else
                {
                    break;
                }
            }



            var length = _deg + 1;

            if (length > Size)
            {
                int pow = (int)Math.Log(length, 2);
                Size = (int)Math.Pow(2, pow);
                if (length > Size)
                {
                    Size *= 2;
                }
                else
                {
                    Size = length;
                }
            }

            _coefficients = new Polynomial[Size];


            for (int i = 0; i <= _deg; i++)
            {
                _coefficients[i] = arr[i] % field.Mod;
            }
        }
示例#3
0
        public GfTable()
        {
            InitializeComponent();

            var polinom   = MultiplicationInFieldGf.Polinom;        //полином
            var fieldChar = MultiplicationInFieldGf.Characteristic; //модуль

            var gf = new FactorRing(polinom, fieldChar);

            Polynomial[,] table = gf.GetTable();

            DataTable dataTable = new DataTable();

            for (int i = 0; i < table.GetLength(1); i++)
            {
                dataTable.Columns.Add("", typeof(Polynomial));
            }
            for (int i = 0; i < table.GetLength(0); i++)
            {
                DataRow dataRow = dataTable.NewRow();
                dataTable.Rows.Add(dataRow);
            }
            DataView dataView;

            using (dataView = new DataView(dataTable))
            {
                for (int i = 0; i < table.GetLength(0); i++)
                {
                    for (int j = 0; j < table.GetLength(1); j++)
                    {
                        dataView[i][j] = table[i, j];
                    }
                }
            }

            DataGrid.ItemsSource = dataTable.DefaultView;
        }
示例#4
0
        public BchCode(int errorsNumber, ulong fieldChar, Polynomial fieldGenerator)
        {
            _fieldChar      = fieldChar;
            _codeLength     = IntegerMath.Pow(fieldChar, fieldGenerator.Deg) - 1;
            _errorsNumber   = errorsNumber;
            _field          = new FactorRing(fieldGenerator, fieldChar);
            _primitiveRoot  = _field.FindPrimitiveRoot();
            _logTable       = new Dictionary <int, Polynomial>();
            _invertLogTable = new Dictionary <Polynomial, int>();
            _logTable.Add(0, Polynomial.One);
            _invertLogTable.Add(Polynomial.One, 0);
            for (int i = 1; (ulong)i < _field.Card - 1; i++)
            {
                var t = _field.Pow(_primitiveRoot, (ulong)i);
                _logTable.Add(i, _field.Pow(_primitiveRoot, (ulong)i));
                _invertLogTable.Add(_logTable[i], i);
            }
            _codeZeros = new Dictionary <Polynomial, int>();
            for (int i = 1; i < 2 * errorsNumber + 1; i++)
            {
                _codeZeros.Add(_logTable[i], i);
            }
            List <Polynomial> minimalPolynomials = new List <Polynomial>();

            _generator = new Polynomial(new ulong[] { 1 });
            foreach (var polynomial in _codeZeros)
            {
                var minPoly = _field.FindMinimalPolynomial(polynomial.Key);
                if (!minimalPolynomials.Contains(minPoly))
                {
                    minimalPolynomials.Add(minPoly);
                    _generator = _generator * minPoly;
                    _generator.SetMod(_fieldChar);
                    _generator.Reduce();
                }
            }
        }