/// <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; }
/// <summary> /// Кодирует полученное сообщение. /// </summary> /// <param name="ourMessage">Кодируемое слово</param> /// <returns>Код</returns> public int[] Encode(int[] ourMessage) { BaseMatrix A = new BaseMatrix(ourMessage); BaseMatrix C = MyStatics.Multiplication(A, generatingMatrix);; return(C.Matrix[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)); }
/// <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); }