예제 #1
0
파일: Integer.cs 프로젝트: Raz1el/Labs
        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;
        }
예제 #2
0
        public FactorRing(Polynomial polynomial, ulong fieldCharacteristic)
        {
            _mod  = polynomial;
            _char = fieldCharacteristic;

            _mod.SetMod(_char);
            _mod.Reduce();

            _cardinality = IntegerMath.Pow(fieldCharacteristic, polynomial.Deg);
        }
예제 #3
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();
                }
            }
        }