示例#1
0
 public Form4(Form3 previous_form, BinaryString polynomial, int n, int k, int d)
 {
     InitializeComponent();
     d_             = d;
     previous_form_ = previous_form;
     coding_form_   = new CodingForm(polynomial, n, k, this);
     decoding_form_ = new DecodingForm(polynomial, n, k, this);
 }
        public ResultDecodingForm(DecodingForm prev_form, BinaryString polynomial, BinaryString code_word)
        {
            InitializeComponent();

            //Связываем с предыдущей формой
            previous_form_ = prev_form;

            text_box.Text += "Пусть B' - полученное кодовое слово (с ошибками или без), \nB - отправленное " +
                             "кодовое слово\nB = B', если B' не " +
                             "содержит ошибок;\nB = B' + e, иначе (e - вектор ошибок)\n\nДекодируем кодовое " +
                             "слово " + code_word.ToString() + ". Для этого разделим его на " +
                             "образующий многочлен " + polynomial.ToString() + ":\nI' = B' / F = " + code_word.ToString() +
                             " / " + polynomial.ToString() + " = ";
            BinaryString inf_word = code_word / polynomial;

            text_box.Text += inf_word.ToString() + "\n\nОстаток от деления: e = ";
            BinaryString remainder = code_word % polynomial;

            text_box.Text += remainder.ToString();

            if (remainder.weight() == 0)
            {
                text_box.Text += "\nВес остатка равен 0, следовательно, кодовое слово В не содержит ошибок. Значит, " +
                                 "I =  I' = " + inf_word.ToString() + " - искомое информационное слово.";
                return;
            }

            if (remainder.weight() <= (prev_form.d - 1) / 2)
            {
                text_box.Text += "\n\nКоличество исправляемых ошибок: r = " + (prev_form.d - 1) / 2 + "\n\nВес " +
                                 "остатка w(e) = " + remainder.weight() + "\n\nТак как выполняется неравенство w <= r, то мы " +
                                 "можем исправить ошибки в полученном кодовом слове и найти информационное слово следующим " +
                                 "образом:\nI = (B' + e) / F = (" + code_word.ToString() + " + " + remainder.ToString() + ") / " +
                                 polynomial.ToString() + " = ";
                BinaryString B = code_word + remainder;
                text_box.Text += B.ToString() + " / " + polynomial.ToString() + " = ";
                BinaryString I = B / polynomial;
                text_box.Text += I.ToString();
                return;
            }

            text_box.Text += "\nВес остатка: w(e) = " + remainder.weight() + ".\n\nКоличество исправляемых ошибок:" +
                             " r =" + (prev_form.d - 1) / 2 + "\n\nТак как w > r   (1), то для исправления ошибок в полученном кодовом" +
                             " слове необходимо делать циклические сдвиги B' до тех пор, пока условие (1) не нарушится.\n\nПусть " +
                             "Bi - слово, полученное после i циклических сдвигов вправо слова B', ei - остаток от деления Bi на F." +
                             " Выполним сдвиги: ";

            BinaryString cur_b = code_word.RightCyclShift(1);
            int          i;

            for (i = 1; i < code_word.size(); ++i)
            {
                text_box.Text += "\n\nB" + i + " = " + cur_b.ToString() + ", e" + i + " = ";
                BinaryString cur_rem = cur_b % polynomial;
                text_box.Text += cur_rem.ToString() + ", w(e" + i + ") = " + cur_rem.weight();

                if (cur_rem.weight() <= (prev_form.d - 1) / 2)
                {
                    text_box.Text += "\n\nУсловие (1) нарушилось, следовательно, можно исправить ошибки:\nB'" + i +
                                     " = B" + i + " + e" + i + " = " + cur_b.ToString() + " + " + cur_rem.ToString() + " = ";
                    BinaryString res_of_add = cur_b + cur_rem;
                    text_box.Text += res_of_add.ToString() + "\nДля этого необходимо сделать " + i + " циклических " +
                                     "сдвигов влево полученного слова: B = ";
                    BinaryString new_b = res_of_add.LeftCyclShift(i);
                    text_box.Text += new_b.ToString() + "\n\nТеперь мы можем получить информационное слово: I = B / F = " +
                                     new_b.ToString() + " / " + polynomial.ToString() + " = ";
                    BinaryString I = new_b / polynomial;
                    text_box.Text += I.ToString();
                    break;
                }

                cur_b = cur_b.RightCyclShift(1);
            }
            if (i == code_word.size())
            {
                text_box.Text += "\n\nНи один сдвиг слова B' не дал треубемого остатка от деления. Следовательно, " +
                                 "в полученном слове невозможно исправить ошибки.";
            }
        }