Advertisement
Dzham

Untitled

Dec 31st, 2017
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <iterator>
  6.  
  7. using namespace std;
  8.  
  9. template <typename T>
  10. class Polynomial {
  11. private:
  12. vector<T> polynom;
  13. int size_p = 0;
  14. public:
  15. Polynomial(vector<T> pol) {
  16. this->polynom = pol;
  17. this->size_p = pol.size();
  18. this->delete_zeros();
  19. }
  20.  
  21. Polynomial(T object = T()) {
  22. polynom.push_back(object);
  23. this->size_p = 1;
  24. }
  25.  
  26. template<typename Iter = typename vector<T>::iterator>
  27. Polynomial(Iter begin, Iter end) {
  28. Iter it;
  29. size_p = 0;
  30. for (it = begin; it != end; it++) {
  31. polynom.push_back(*it);
  32. size_p++;
  33. }
  34. this->delete_zeros();
  35. }
  36.  
  37. void delete_zeros() {
  38. vector<T> result = polynom;
  39. for (int i = size_p - 1; i > 0; i--) {
  40. if (result[i] == T(0)) {
  41. result.pop_back();
  42. size_p--;
  43. } else {
  44. i = -1;
  45. }
  46. }
  47. polynom = result;
  48. }
  49.  
  50. vector<T> get_polynom() const {
  51. return polynom;
  52. }
  53.  
  54. int get_size() const {
  55. return size_p;
  56. }
  57.  
  58. vector<T> multiply(vector<T> A, vector<T> B) {
  59. int m = A.size();
  60. int n = B.size();
  61. vector<T> prod;
  62. for (int i = 0; i < m + n - 1; i++) {
  63. prod.push_back(T(0));
  64. }
  65. for (int i = 0; i< m; i++) {
  66. for (int j = 0; j < n; j++) {
  67. prod[i + j] += A[i] * B[j];
  68. }
  69. }
  70. return prod;
  71. }
  72.  
  73. bool operator == (Polynomial<T> pol) const {
  74. return polynom == pol.get_polynom();
  75. }
  76.  
  77. bool operator != (Polynomial<T> pol) const {
  78. return polynom != pol.get_polynom();
  79. }
  80.  
  81. void operator += (Polynomial<T> pol) {
  82. vector<T> preres;
  83. preres = polynom;
  84. for (int i = 0; i < size_p; i++) {
  85. preres[i] += pol.get_polynom()[i];
  86. }
  87. for (int i = size_p + 1; i < pol.get_size(); i++) {
  88. preres.push_back(T(0) + pol.get_polynom()[i]);
  89. }
  90. Polynomial<T> result(preres);
  91. result.delete_zeros();
  92. this->polynom = result.get_polynom();
  93. this->size_p = result.get_size();
  94. }
  95.  
  96. void operator += (T pol) {
  97. polynom[0] += pol;
  98. }
  99.  
  100. Polynomial<T> operator - (Polynomial<T> pol) const {
  101. vector<T> preres;
  102. preres = polynom;
  103. for (int i = 0; i < size_p; i++) {
  104. preres[i] -= pol.get_polynom()[i];
  105. }
  106. for (int i = size_p + 1; i < pol.get_size(); i++) {
  107. preres.push_back(T(0) - pol.get_polynom()[i]);
  108. }
  109. return Polynomial<T>(preres);
  110. }
  111.  
  112. Polynomial<T> operator - (T pol) const {
  113. vector<T> res = this->get_polynom();
  114. res[0] -= pol;
  115. return Polynomial<T>(res);
  116. }
  117.  
  118. void operator -= (Polynomial<T> pol) {
  119. Polynomial<T> res = this - pol;
  120. this = res;
  121. }
  122.  
  123. void operator -= (T pol) {
  124. polynom[0] -= pol;
  125. }
  126.  
  127. void operator *= (Polynomial<T> pol) {
  128. size_p = size_p + pol.get_size();
  129. vector<T> result_coeff = multiply(polynom, pol.get_polynom());
  130. polynom = result_coeff;
  131. size_p = result_coeff.size();
  132. this->delete_zeros();
  133. }
  134.  
  135. void operator *= (T pol) {
  136. for (int i = 0; i < size_p; i++) {
  137. polynom[i] *= pol;
  138. }
  139. this->delete_zeros();
  140. }
  141.  
  142. Polynomial<T> operator + (Polynomial<T> pol) const {
  143. Polynomial<T> result = *this;
  144. result += pol;
  145. return result;
  146. }
  147.  
  148. Polynomial<T> operator + (T pol) const {
  149. Polynomial<T> r = *this;
  150. r += pol;
  151. return r;
  152. }
  153.  
  154. Polynomial<T> operator * (Polynomial<T> pol) const {
  155. vector<T> preres = this->get_polynom();
  156. Polynomial<T> result(preres);
  157. result *= pol;
  158. return result;
  159. }
  160.  
  161. Polynomial<T> operator * (T pol) const {
  162. vector<T> preres = this->get_polynom();
  163. for (int i = 0; i < size_p; i++) {
  164. preres[i] *= pol;
  165. }
  166. Polynomial<T> result(preres);
  167. return result;
  168. }
  169.  
  170. T operator [](int id) const {
  171. if (id >= size_p) {
  172. return T(0);
  173. } else {
  174. return polynom[id];
  175. }
  176. }
  177.  
  178. T operator ()(T id) const {
  179. if (id == T(0)) {
  180. return polynom[0];
  181. } else {
  182. T x = T(1);
  183. T result = T(0);
  184. for (int i = 0; i < size_p; i++) {
  185. result += x * polynom[i];
  186. x *= id;
  187. }
  188. return result;
  189. }
  190. }
  191.  
  192. int Degree() const {
  193. if (size_p == 1 && polynom[0] == 0) {
  194. return -1;
  195. } else {
  196. return size_p - 1;
  197. }
  198. }
  199.  
  200. template<typename Iter = typename vector<T>::const_iterator>
  201. Iter begin() const {
  202. return polynom.begin();
  203. }
  204.  
  205. template<typename Iter = typename vector<T>::const_iterator>
  206. Iter end() const {
  207. return polynom.end();
  208. }
  209.  
  210. };
  211.  
  212. template <typename T>
  213. Polynomial<T> operator * (T t, Polynomial<T> pol) {
  214. return pol * t;
  215. }
  216.  
  217. template <typename T>
  218. Polynomial<T> operator - (T t, Polynomial<T> pol) {
  219. return pol - t;
  220. }
  221.  
  222. template <typename T>
  223. Polynomial<T> operator + (T t, Polynomial<T> pol) {
  224. return pol + t;
  225. }
  226.  
  227. class int2 {
  228. private:
  229. int int1;
  230. public:
  231. int2(int i) {
  232. this->int1 = i;
  233. }
  234.  
  235. int2() {
  236. this->int1 = 1;
  237. }
  238.  
  239. bool operator == (const int2& i) const {
  240. return int1 == i.get();
  241. }
  242.  
  243. bool operator != (const int2& i) const {
  244. return int1 != i.get();
  245. }
  246.  
  247. int get() const {
  248. return this->int1;
  249. }
  250.  
  251. int2 operator + (int2 i1) const {
  252. int res = this->int1 + i1.get();
  253. return int2(res);
  254. }
  255.  
  256. void operator += (int2 i1) {
  257. int1 += i1.get();
  258. }
  259.  
  260. int2 operator - (int2 i1) const {
  261. int res = this->int1 - i1.get();
  262. return int2(res);
  263. }
  264.  
  265. void operator -= (int2 i1) {
  266. int1 -= i1.get();
  267. }
  268.  
  269. int2 operator * (int2 i1) const {
  270. int res = this->int1 * i1.get();
  271. return int2(res);
  272. }
  273.  
  274. void operator *= (int2 i1) {
  275. int1 *= i1.get();
  276. }
  277.  
  278. operator int() {
  279. return this->int1;
  280. }
  281.  
  282.  
  283. };
  284.  
  285. void coutVector(vector<int2> re) {
  286. for (int2 i : re) {
  287. cout << i.get() << " ";
  288. }
  289. cout << endl;
  290. }
  291.  
  292. int main() {
  293. /*vector<int2> res = { int2(1), int2(1), int2(1), int2(1) };
  294. vector<int2> res2 = { int2(2), int2(3), int2(4), int2(5) };
  295. vector<int2> res3 = { int2(1), int2(1), int2(1), int2(1) };
  296. Polynomial<int2> p(res);
  297. Polynomial<int2> p1(res2);
  298. Polynomial<int2> p3(res);
  299. coutVector((p - p3).get_polynom());
  300. coutVector((p - p1).get_polynom());
  301. coutVector(p3.get_polynom());*/
  302. /*coutVector((p * p1).get_polynom());
  303. coutVector((p * int2()).get_polynom());
  304. cout << p1(int2(0));*/
  305. vector<int2> result = { int2(1), int2(2), int2(3), int2(4) };
  306. Polynomial<int2> polynom(result);
  307. vector<int2> result2 = { int2(3), int2(4), int2(5), int2(6) };
  308. Polynomial<int2> polynom2(result2);
  309. vector<int2> r = (polynom * polynom2).get_polynom();
  310. coutVector(r);
  311. vector<int2> r1 = (polynom + polynom2).get_polynom();
  312. coutVector(r1);
  313. vector<int2> r2 = (polynom - polynom2).get_polynom();
  314. coutVector(r2);
  315. polynom += polynom2;
  316. coutVector(polynom.get_polynom());
  317. polynom -= polynom2;
  318. coutVector(polynom.get_polynom());
  319. polynom *= polynom2;
  320. coutVector(polynom.get_polynom());
  321. polynom += int2(1);
  322. coutVector(polynom.get_polynom());
  323. polynom -= int2(1);
  324. coutVector(polynom.get_polynom());
  325. polynom *= int2(2);
  326. coutVector(polynom.get_polynom());
  327. coutVector((polynom + int2(2)).get_polynom());
  328. coutVector((polynom - int2(2)).get_polynom());
  329. coutVector((polynom * int2(2)).get_polynom());
  330. coutVector((int2(2) + polynom).get_polynom());
  331. coutVector((int2(2) - polynom).get_polynom());
  332. coutVector((int2(2) * polynom).get_polynom());
  333. cout << (polynom != polynom2);
  334. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement