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 }); } }
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; } }
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; }
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(); } } }