예제 #1
0
        /// <summary>
        /// Создает код на основе полученной матрицы, устонавливая его основные параметры.
        /// </summary>
        /// <param name="generatingMatrix">Порождающая матрица</param>
        /// <param name="line">Система уравнений, порождающая код</param>
        public Code(SolutionsMatrix generatingMatrix, string[] line)
        {
            if (generatingMatrix.Matrix.Count < generatingMatrix.Matrix[0].Length)
            {
                throw new CodeGeneratingException("Система имеет недостаточно решений для генерации кода.");
            }

            this.generatingMatrix = generatingMatrix;
            systemOfEquations     = line;
            allCodeWords          = new BaseMatrix();
            for (int possibleCodeNumber = 0; possibleCodeNumber < Math.Pow(2, K); possibleCodeNumber++)
            {
                int[]      intArrayPossibleCodeNumber = MyStatics.ToBinaryIntArray(possibleCodeNumber, K);
                BaseMatrix vectorPossibleCodeNumber   = new BaseMatrix();
                for (int i = 0; i < K; i++)
                {
                    int[] nextLine = { intArrayPossibleCodeNumber[i] };
                    vectorPossibleCodeNumber.Matrix.Add(nextLine);
                }
                BaseMatrix vectorPossibleCode = MyStatics.Multiplication(vectorPossibleCodeNumber, generatingMatrix);
                allCodeWords.Matrix.Add(vectorPossibleCode.Matrix[0]);
            }

            this.t = (MyStatics.FindMinDistance(AllCodeWords) - 1) / 2;
        }
예제 #2
0
        /// <summary>
        /// Декодирует полученное сообщение, исправляя ошибки.
        /// </summary>
        /// <param name="ourMessage">Декодируемое слово</param>
        /// <returns>Исходное сообщение</returns>
        public int[] Decode(int[] ourMessage)
        {
            int currentDistance = 0, minDistance = N + 1, number = 0;

            // Совершаем проход по всем возможным кодовым словам.
            for (int i = 0; i < allCodeWords.Matrix.Count; i++)
            {
                for (int j = 0; j < allCodeWords.Matrix[i].Length; j++)
                {
                    if (ourMessage[j] != allCodeWords.Matrix[i][j])
                    {
                        currentDistance++;
                    }
                }
                if (currentDistance < minDistance)
                {
                    minDistance = currentDistance;
                    number      = i;
                }
                currentDistance = 0;
                if (minDistance == 0)
                {
                    return(MyStatics.ToBinaryIntArray(number, K));
                }
            }
            if (minDistance > T)
            {
                throw new MistakesNumberException($"Количество ошибок, сделанных в кодовом слове, превышено на {minDistance-T}!");
            }
            return(MyStatics.ToBinaryIntArray(number, K));
        }
예제 #3
0
        /// <summary>
        /// Решает систему уравнений.
        /// </summary>
        /// <param name="equationsSystem">Система уравнений</param>
        /// <returns>Решение системы уравнений</returns>
        public SolutionsMatrix Solve(List <Equation> equationsSystem)
        {
            if (equationsSystem == null)
            {
                throw new NullReferenceException("Система уравнений пуста!");
            }
            if (equationsSystem.Count == 0)
            {
                throw new NullReferenceException("Введите систему уравнений!");
            }

            matrix = new SolutionsMatrix();

            // Перебор всех возможных решений.
            for (int possibleSolution = 0; possibleSolution < Math.Pow(2, equationsSystem[0].GroupSize); possibleSolution++)
            {
                // Представление номера возможного решения в двоичном виде.
                int[] intArrayPossibleSolution = MyStatics.ToBinaryIntArray(possibleSolution, equationsSystem[0].GroupSize);

                // Создание проверочного листа - элемента, помогающего определить принадлежит ли решение множеству решений данной системы.
                checkingList = new СheckList(equationsSystem);

                // Заполнение проверочного листа возможным решением.
                checkingList.FillingTheCheckList(intArrayPossibleSolution);

                /// Сверка значений полученного в результате подстановки решения в проверочный лист и значения,
                /// которое должно быть по условию.
                /// В случае полного совпадения решение, которое подставлялось в проверочный лист?
                /// добавляется в матрицу решений системы уравнений.
                if (checkingList.IsItRightSolution())
                {
                    matrix.Matrix.Add(intArrayPossibleSolution);
                }
            }
            return(matrix);
        }