private void InitFromString(string longInteger) { if (string.IsNullOrEmpty(longInteger)) { throw new ArgumentException(); } int digitCount = 0; var result = new Integer(0); var ten = new Integer(10); var digits = new Dictionary <char, Integer>(); for (ulong i = '0'; i <= '9'; i++) { digits.Add(Convert.ToChar(i), new Integer(i - '0')); } foreach (var chr in longInteger.Reverse()) { if (char.IsDigit(chr)) { result = result + digits[chr] * IntegerMath.Pow(ten, digitCount); digitCount++; } } _digitCount = result._digitCount; _digits = result._digits; }
public FactorRing(Polynomial polynomial, ulong fieldCharacteristic) { _mod = polynomial; _char = fieldCharacteristic; _mod.SetMod(_char); _mod.Reduce(); _cardinality = IntegerMath.Pow(fieldCharacteristic, polynomial.Deg); }
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(); } } }