public static BinaryString operator %(BinaryString bin_str1, BinaryString bin_str2) { if (bin_str1.cutUnsignificantZeros().size() < bin_str2.cutUnsignificantZeros().size()) { return(bin_str1); } BinaryString dividend = bin_str1.cutUnsignificantZeros(); //Делимое BinaryString divider = bin_str2.cutUnsignificantZeros(); //Делитель while (dividend.size() >= divider.size()) { //Выделяем часть делимого, равную по размеру делителю string temp_str = dividend.ToString().Substring(0, divider.size()); //То, что останется после сложения делителя и части делимого в виде строки string new_dividend = (new BinaryString(temp_str) + divider).cutUnsignificantZeros().ToString(); if (dividend.size() > divider.size()) //Присоединяем оставшийся кусок делимого { new_dividend += dividend.ToString().Substring(divider.size(), dividend.size() - divider.size()); } dividend = new BinaryString(new_dividend); dividend = dividend.cutUnsignificantZeros(); } if (dividend.size() == 0) { dividend = new BinaryString("0"); } return(dividend); }
public GF2(int degree, BinaryString polynomial) { polynomial = polynomial.cutUnsignificantZeros(); //Проверка на соответствие degree степени полинома polinomial if (degree != polynomial.size() - 1) { MessageBox.Show("Степень образующего многочлена не соответствует степени поля Галуа."); Application.Exit(); } degree_ = degree; elements_ = new BinaryString[(int)Math.Pow(2, degree_)]; polynomial_ = polynomial; //Формируем нулевой элемент string temp_str = ""; for (int i = 0; i < degree_; ++i) { temp_str += "0"; } elements_[0] = new BinaryString(temp_str); //Формируем ненулевые элементы поля for (int i = 1; i < elements_.Length; ++i) { elements_[i] = elements_[i - 1]; ++elements_[i]; } }
public bool isPrimitive(BinaryString element) { if (element.cutUnsignificantZeros().ToString() == "1" || element.cutUnsignificantZeros().ToString() == "0") { return(false); } BinaryString el = element % polynomial_; for (int i = 1; i < (int)Math.Pow(2, degree_) - 1; ++i) { if (el.cutUnsignificantZeros().ToString() == "1") { return(false); } el *= element; el %= polynomial_; } return(true); }
public bool isRootOf(BinaryString root, BinaryString equation) { BinaryString result = new BinaryString("0"); for (int i = 0; i <= equation.degree; ++i) { if (equation[equation.degree - i] == '1') { result += galois_field_.Pow(root, i); } } if (result.cutUnsignificantZeros().ToString() == "0") { return(true); } else { return(false); } }