Advertisement
Guest User

Untitled

a guest
Nov 16th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.22 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <iomanip>
  8.  
  9.  
  10. using namespace std;
  11.  
  12. class PolynomF2 {
  13. public:
  14. static std::vector<int> irr_coeffs;
  15. std::vector<int> coeffs;
  16.  
  17. PolynomF2() {}
  18. PolynomF2(int n) {
  19. std::vector<int> tmp(n);
  20. coeffs = tmp;
  21. }
  22. PolynomF2(const std::vector<int>& p) {
  23. this->coeffs = p;
  24. }
  25. PolynomF2(const PolynomF2& p) :coeffs(p.coeffs) {}
  26. PolynomF2(std::string poly) {
  27. while (poly[poly.length() - 1] == '0')
  28. poly.erase(poly.length() - 1);
  29. std::vector<int> tmp(poly.length());
  30. for (int i = 0; i < poly.size(); i++) {
  31. tmp[poly.size() - i - 1] = (int)(poly[i] - '0');
  32. }
  33. coeffs = tmp;
  34.  
  35. }
  36.  
  37.  
  38. void simplify() {
  39. std::vector<int> divider = irr_coeffs;
  40. std::vector<int> tmp = coeffs;
  41. while (tmp.size() >= divider.size()) {
  42. for (int i = 0; i < divider.size(); i++) {
  43. tmp[i] += divider[i];
  44. tmp[i] %= 2;
  45. }
  46. int index = 0;
  47. while (tmp[index] != 1)
  48. index++;
  49. tmp.erase(tmp.begin(), tmp.begin() + index);
  50. }
  51. coeffs = tmp;
  52. }
  53.  
  54.  
  55.  
  56.  
  57. void setIrrPolynom(std::string poly) {
  58. while (poly[poly.length() - 1] == '0')
  59. poly.erase(poly.length() - 1);
  60.  
  61. std::vector<int> tmp(poly.length());
  62.  
  63. for (int i = 0; i < poly.size(); i++) {
  64. tmp[poly.size() - i - 1] = (int)(poly[i] - '0');
  65. }
  66. irr_coeffs = tmp;
  67. }
  68. PolynomF2 operator+ (const PolynomF2& p) const {
  69. if (p.coeffs.size() == 0 && this->coeffs.size() == 0) {
  70. return PolynomF2();
  71. }
  72. int max = std::max(p.coeffs.size(), this->coeffs.size());
  73. int min = std::min(p.coeffs.size(), this->coeffs.size());
  74. std::vector<int> new_poly(max);
  75. for (int i = max - 1; i > max - min - 1; i--) {
  76. new_poly[i] = (this->coeffs[i] + p.coeffs[i]) % 2;
  77. }
  78. if (p.coeffs.size() == max) {
  79. for (int i = max - min - 1; i >= 0; i--) {
  80. new_poly[i] = p.coeffs[i];
  81. }
  82. }
  83. else {
  84. for (int i = max - min - 1; i >= 0; i--) {
  85. new_poly[i] = this->coeffs[i];
  86. }
  87. }
  88. PolynomF2 newp(new_poly);
  89. newp.simplify();
  90. return newp;
  91. }
  92.  
  93. // first we multiply polynomials, than we find remainder in div by irreducible polynomial
  94. PolynomF2 operator*(const PolynomF2& p) const {
  95.  
  96. int n = p.coeffs.size();
  97. int m = coeffs.size();
  98. std::vector<int> res(n + m);
  99. for (int i = 0; i < n + m; i++) {
  100. res[i] = 0;
  101. }
  102. for (int i = 0; i < n; i++) {
  103. for (int j = 0; j < m; j++) {
  104. res[i + j] ^= p.coeffs[i] + coeffs[j];
  105. }
  106. }
  107. PolynomF2 resp(res);
  108. resp.simplify();
  109. return resp;
  110.  
  111. }
  112.  
  113.  
  114. /*PolynomF2 operator/ (const PolynomF2& p) const {
  115. std::vector<int> divider = p.coeffs;
  116. std::vector<int> tmp = coeffs;
  117. std::vector<int> res(0);
  118. while (tmp.size() >= divider.size()) {
  119. for (int i = 0; i < divider.size(); i++) {
  120. tmp[i] += divider[i];
  121. tmp[i] %= 2;
  122. }
  123. res.push_back(1);
  124. int index = 0;
  125. while (tmp[index] != 1)
  126. index++;
  127. for (int i = 0; i < index; i++) {
  128. res.push_back(0);
  129. }
  130. tmp.erase(tmp.begin(), tmp.begin() + index);
  131. }
  132. return PolynomF2(tmp);
  133. }
  134. */
  135.  
  136. PolynomF2 operator% (const PolynomF2& p) const {
  137. std::vector<int> divider = p.coeffs;
  138. std::vector<int> tmp = coeffs;
  139. while (tmp.size() >= divider.size()) {
  140. for (int i = 0; i < divider.size(); i++) {
  141. tmp[i] += divider[i];
  142. tmp[i] %= 2;
  143. }
  144. int index = 0;
  145. while (tmp[index] != 1)
  146. index++;
  147. tmp.erase(tmp.begin(), tmp.begin() + index);
  148. }
  149. PolynomF2 res(tmp);
  150. res.simplify();
  151. return res;
  152. }
  153.  
  154. PolynomF2 operator/ (const int k) const {
  155.  
  156. PolynomF2 res(*this);
  157. PolynomF2 tmp(*this);
  158.  
  159.  
  160. for (int i = 1; i < k; i++) {
  161. res = res*tmp;
  162. }
  163. res.simplify();
  164. return res;
  165. }
  166.  
  167.  
  168. // find reverse element
  169. PolynomF2 reverseElement() const {
  170. int n = (int)(pow(2, coeffs.size() - 1)) - 2;
  171. PolynomF2 res(*this);
  172. PolynomF2 tmp(*this);
  173.  
  174.  
  175. for (int i = 1; i < n; i++) {
  176. res = res*tmp;
  177. }
  178. res.simplify();
  179. return res;
  180. }
  181.  
  182. friend std::ostream& operator<<(std::ostream& os, const PolynomF2& p) {
  183. if (p.coeffs.size() == 0) {
  184. os << "0";
  185. return os;
  186. }
  187. os << "x^" << p.coeffs.size() - 1;
  188.  
  189. for (int i = 2; i < p.coeffs.size() - 1; i++) {
  190. if (p.coeffs[i] == 1) {
  191. os << " + x^" << p.coeffs.size() - i;
  192. }
  193. }
  194. if (p.coeffs[p.coeffs.size() - 1] == 1) {
  195. os << " + 1";
  196. }
  197.  
  198. return os;
  199. }
  200.  
  201. friend std::istream& operator >> (std::istream& is, PolynomF2& p) {
  202.  
  203. std::string str;
  204. cout << "Input polynom in binary representation" << endl;
  205. is >> str;
  206.  
  207. PolynomF2 res(str);
  208. p = res;
  209. cout << p << endl;
  210.  
  211.  
  212. return is;
  213. }
  214.  
  215.  
  216.  
  217. };
  218.  
  219. int main() {
  220.  
  221.  
  222. std::string poly;
  223. std::string input1;
  224. std::string input2;
  225. PolynomF2 a;
  226.  
  227.  
  228. cout << "enter irreducable polynom" << endl;
  229. cin >> poly;
  230. a.setIrrPolynom(poly);
  231. cout << "enter polynom" << endl;
  232. cin >> a;
  233. PolynomF2 b(0);
  234. cout << "enter operation:(^,+,%,*)" << endl;
  235. char command;
  236. cin >> command;
  237. switch (command)
  238. {
  239. case '^':
  240. int k;
  241. cout << "Enter k:";
  242. cin >> k;
  243. cout << a / k;
  244. break;
  245. case '*':
  246.  
  247. cin >> b;
  248. cout << a*b << endl;
  249. break;
  250. case '%':
  251.  
  252. cin >> b;
  253. cout << a%b << endl;
  254. break;
  255. case '+':
  256.  
  257.  
  258. cin >> b;
  259. cout << a + b << endl;
  260. break;
  261.  
  262. default:
  263. break;
  264. }
  265.  
  266. return 0;
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement