📄 galoisfieldpolynomial.cpp
字号:
{ poly.resize(0,GaloisFieldElement(gf,0)); } return *this; } const GaloisFieldElement& GaloisFieldPolynomial::operator[](const unsigned int& term) const { assert(term < poly.size()); return poly[term]; } GaloisFieldElement& GaloisFieldPolynomial::operator[](const unsigned int& term) { assert(term < poly.size()); return poly[term]; } GaloisFieldElement GaloisFieldPolynomial::operator()(const GaloisFieldElement& value) { GaloisFieldElement result(gf,0); if (poly.size() > 0) { result = poly[poly.size() - 1]; for(size_t i = poly.size() - 2; ((int)i) >= 0; i--) { result = poly[i] + (result * value); } } return result; } const GaloisFieldElement GaloisFieldPolynomial::operator()(const GaloisFieldElement& value) const { GaloisFieldElement result(gf,0); if (poly.size() > 0) { result = poly[poly.size() - 1]; for(size_t i = poly.size() - 2; static_cast<int>(i) >= 0; i--) { result = poly[i] + (result * value); } } return result; } GaloisFieldElement GaloisFieldPolynomial::operator()(GFSymbol value) { return (*this)(GaloisFieldElement(gf,value)); } const GaloisFieldElement GaloisFieldPolynomial::operator()(GFSymbol value) const { return (*this)(GaloisFieldElement(gf,value)); } bool GaloisFieldPolynomial::operator==(const GaloisFieldPolynomial& polynomial) const { if (gf == polynomial.gf) { if (poly.size() != polynomial.poly.size()) return false; else { for (unsigned int i = 0; i < poly.size(); i++) { if (poly[i] != polynomial.poly[i]) return false; } return true; } } else return false; } bool GaloisFieldPolynomial::operator!=(const GaloisFieldPolynomial& polynomial) const { return !(*this == polynomial); } GaloisFieldPolynomial GaloisFieldPolynomial::derivative() { if ((*this).poly.size() > 1) { GaloisFieldPolynomial deriv(gf,deg()); for (unsigned int i = 0; i < poly.size() - 1; i++) { if (((i + 1) & 1) == 1) deriv.poly[i] = poly[i + 1]; else deriv.poly[i] = 0; } simplify(deriv); return deriv; } return GaloisFieldPolynomial(gf,0); } void GaloisFieldPolynomial::simplify() { simplify(*this); } void GaloisFieldPolynomial::simplify(GaloisFieldPolynomial& polynomial) { if (poly.size() > 0) { size_t last = polynomial.poly.size() - 1; while((last >= 0) && (polynomial.poly.size() > 0)) { if (polynomial.poly[last] == 0) polynomial.poly.pop_back(); else break; last = polynomial.poly.size() - 1; } } } GaloisFieldPolynomial operator+(const GaloisFieldPolynomial& a, const GaloisFieldPolynomial& b) { GaloisFieldPolynomial result = a; result += b; return result; } GaloisFieldPolynomial operator + (const GaloisFieldPolynomial& a, const GaloisFieldElement& b) { GaloisFieldPolynomial result = a; result += b; return result; } GaloisFieldPolynomial operator + (const GaloisFieldElement& a, const GaloisFieldPolynomial& b) { GaloisFieldPolynomial result = b; result += a; return result; } GaloisFieldPolynomial operator + (const GaloisFieldPolynomial& a, const GFSymbol& b) { return a + GaloisFieldElement(a.field(),b); } GaloisFieldPolynomial operator + (const GFSymbol& a, const GaloisFieldPolynomial& b) { return b + GaloisFieldElement(b.field(),a); } GaloisFieldPolynomial operator - (const GaloisFieldPolynomial& a, const GaloisFieldPolynomial& b) { GaloisFieldPolynomial result = a; result -= b; return result; } GaloisFieldPolynomial operator - (const GaloisFieldPolynomial& a, const GaloisFieldElement& b) { GaloisFieldPolynomial result = a; result -= b; return result; } GaloisFieldPolynomial operator - (const GaloisFieldElement& a, const GaloisFieldPolynomial& b) { GaloisFieldPolynomial result = b; result -= a; return result; } GaloisFieldPolynomial operator - (const GaloisFieldPolynomial& a, const GFSymbol& b) { return a - GaloisFieldElement(a.field(),b); } GaloisFieldPolynomial operator - (const GFSymbol& a, const GaloisFieldPolynomial& b) { return b - GaloisFieldElement(b.field(),a); } GaloisFieldPolynomial operator * (const GaloisFieldPolynomial& a, const GaloisFieldPolynomial& b) { GaloisFieldPolynomial result = a; result *= b; return result; } GaloisFieldPolynomial operator * (const GaloisFieldElement& a, const GaloisFieldPolynomial& b) { GaloisFieldPolynomial result = b; result *= a; return result; } GaloisFieldPolynomial operator * (const GaloisFieldPolynomial& a, const GaloisFieldElement& b) { GaloisFieldPolynomial result = a; result *= b; return result; } GaloisFieldPolynomial operator / (const GaloisFieldPolynomial& a, const GaloisFieldPolynomial& b) { GaloisFieldPolynomial result = a; result /= b; return result; } GaloisFieldPolynomial operator / (const GaloisFieldPolynomial& a, const GaloisFieldElement& b) { GaloisFieldPolynomial result = a; result /= b; return result; } GaloisFieldPolynomial operator % (const GaloisFieldPolynomial& a, const GaloisFieldPolynomial& b) { GaloisFieldPolynomial result = a; result %= b; return result; } GaloisFieldPolynomial operator % (const GaloisFieldPolynomial& a, const unsigned int& power) { GaloisFieldPolynomial result = a; result %= power; return result; } GaloisFieldPolynomial operator ^ (const GaloisFieldPolynomial& a, const int& n) { GaloisFieldPolynomial result = a; result ^= n; return result; } GaloisFieldPolynomial operator<<(const GaloisFieldPolynomial& a, const unsigned int& n) { GaloisFieldPolynomial result = a; result <<= n; return result; } GaloisFieldPolynomial operator>>(const GaloisFieldPolynomial& a, const unsigned int& n) { GaloisFieldPolynomial result = a; result >>= n; return result; } GaloisFieldPolynomial gcd(const GaloisFieldPolynomial& a, const GaloisFieldPolynomial& b) { if ((*a.field()) == (*b.field())) { if ((!a.valid()) && (!b.valid())) return GaloisFieldPolynomial(); if (!a.valid()) return b; if (!b.valid()) return a; GaloisFieldPolynomial x = a % b; GaloisFieldPolynomial y = b; GaloisFieldPolynomial z = x; while ((z = y % x).valid()) { y = x; x = z; } return x; } else return GaloisFieldPolynomial(); } std::ostream& operator << (std::ostream& os, const GaloisFieldPolynomial& polynomial) { if (polynomial.deg() >= 0) {/* for (unsigned int i = 0; i < polynomial.poly.size(); i++) { os << polynomial.poly[i].index() << ((i != (polynomial.deg())) ? " " : ""); } std::cout << " poly form: ";*/ for (unsigned int i = 0; i < polynomial.poly.size(); i++) { os << polynomial.poly[i].poly() << " " << "x^" << i << ((i != (polynomial.deg())) ? " + " : ""); } } return os; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -