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' не дал треубемого остатка от деления. Следовательно, " + "в полученном слове невозможно исправить ошибки."; } }