Advertisement
Guest User

Untitled

a guest
Jul 16th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.22 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <functional>
  5. #include <algorithm>
  6.  
  7. template <typename T>
  8. class Monomial {
  9. public:
  10. Monomial(const T& x) : coef(x), deegs(26) {}
  11.  
  12. Monomial(const T& coef_tmp, const std::vector<int>& deegs_tmp) : coef(coef_tmp), deegs(deegs_tmp) {}
  13.  
  14. auto begin() const {
  15. return deegs.begin();
  16. }
  17.  
  18. auto end() const {
  19. return deegs.end();
  20. }
  21.  
  22. auto rbegin() const {
  23. return deegs.rbegin();
  24. }
  25.  
  26. auto rend() const {
  27. return deegs.rend();
  28. }
  29.  
  30. T get_coef() const {
  31. return coef;
  32. }
  33.  
  34. int operator[](size_t i) const {
  35. return deegs[i];
  36.  
  37. }
  38.  
  39. int& operator[](size_t i) {
  40. return deegs[i];
  41.  
  42. }
  43.  
  44. bool is_equal(const Monomial<T>& other) const {
  45. for (size_t i = 0; i < 26; ++i) {
  46. if (deegs[i] != other[i]) {
  47. return 0;
  48. }
  49. }
  50. return 1;
  51. }
  52.  
  53. bool is_div(const Monomial<T>& other) const {
  54. for (size_t i = 0; i < 26; ++i) {
  55. if (deegs[i] < other[i]) {
  56. return false;
  57. }
  58. }
  59. return true;
  60. }
  61.  
  62. Monomial<T>& operator *=(const T& x) {
  63. coef *= x;
  64. return *this;
  65. }
  66.  
  67. Monomial<T> operator *(const T& x) const {
  68. Monomial<T> tmp_m = *this;
  69. return tmp_m *= x;
  70. }
  71.  
  72. Monomial<T>& operator *=(const Monomial<T>& other) {
  73. coef *= other.get_coef();
  74. for (size_t i = 0; i < 26; ++i) {
  75. deegs[i] += other[i];
  76. }
  77. return *this;
  78. }
  79.  
  80. Monomial<T> operator * (const Monomial<T>& other) const {
  81. Monomial<T> tmp_m = *this;
  82. return tmp_m *= other;
  83. }
  84.  
  85. Monomial<T>& operator +=(const Monomial<T>& other) {
  86. // check for equal
  87. coef += other.get_coef();
  88. return *this;
  89. }
  90.  
  91. Monomial<T> operator + (const Monomial<T>& other) const {
  92. Monomial<T> tmp_m;
  93. return tmp_m += other;
  94. }
  95.  
  96. Monomial<T> operator/(const Monomial<T>& other) const {
  97. std::vector<int> tmp_deegs(26);
  98. for (size_t i = 0; i < 26; ++i) {
  99. tmp_deegs[i] = deegs[i] - other[i];
  100. }
  101. return { coef / other.get_coef(), tmp_deegs };
  102. }
  103.  
  104. bool operator==(const Monomial<T>& other) const {
  105. return is_equal(other);
  106. }
  107.  
  108. bool operator!=(const Monomial<T>& other) const {
  109. return !(is_equal(other));
  110. }
  111.  
  112. private:
  113. T coef;
  114. std::vector<int> deegs;
  115. };
  116.  
  117. template <typename T>
  118. class MonomialOrder {
  119. public:
  120. MonomialOrder() {}
  121.  
  122. MonomialOrder(const std::vector<std::function<bool(const Monomial<T>&, const Monomial<T>&)>>& tmp_mon_ord) {
  123. orders = tmp_mon_ord;
  124. }
  125.  
  126. void add_order(const std::function<bool(const Monomial<T>&, const Monomial<T>&)>& func) {
  127. orders.push_back(func);
  128. }
  129.  
  130. std::function<bool(const Monomial<T>&, const Monomial<T>&)> operator[](size_t i) const {
  131. return orders[i];
  132. }
  133.  
  134. std::function<bool(const Monomial<T>&, const Monomial<T>&)>& operator[](size_t i) {
  135. return orders[i];
  136. }
  137.  
  138. bool compair_less(const Monomial<T>& mon1, const Monomial<T>& mon2) const {
  139. for (auto func : orders) {
  140. if (func(mon1, mon2) != func(mon2, mon1)) {
  141. return func(mon1, mon2);
  142. }
  143. }
  144. return 0;
  145. }
  146.  
  147. bool compair_less_or_eq(const Monomial<T>& mon1, const Monomial<T>& mon2) const {
  148. for (auto func : orders) {
  149. if (func(mon1, mon2) != func(mon2, mon1)) {
  150. return func(mon1, mon2);
  151. }
  152. }
  153. return 1;
  154. }
  155.  
  156. private:
  157. std::vector<std::function<bool(const Monomial<T>&, const Monomial<T>&)>> orders;
  158. };
  159.  
  160. template <typename T>
  161. bool lexicograph(const Monomial<T>& mon1, const Monomial<T>& mon2) {
  162. for (size_t i = 0; i < 26; ++i) {
  163. if (mon1[i] != mon2[i]) {
  164. return mon1[i] < mon2[i];
  165. }
  166. }
  167. return 0;
  168. }
  169.  
  170. template <typename T>
  171. class Polynomial {
  172. public:
  173. Polynomial() {}
  174.  
  175. Polynomial(const Monomial<T>& other_mon) {
  176. monoms.push_back(other_mon);
  177. }
  178.  
  179. auto begin() const {
  180. return monoms.begin();
  181. }
  182.  
  183. auto end() const {
  184. return monoms.end();
  185. }
  186.  
  187. auto rbegin() const {
  188. return monoms.rbegin();
  189. }
  190.  
  191. auto rend() const {
  192. return monoms.rend();
  193. }
  194.  
  195. std::vector<Monomial<T>>& get_monoms() {
  196. return monoms;
  197. }
  198.  
  199. size_t size() const {
  200. return monoms.size();
  201. }
  202.  
  203. void dell_0() {
  204. for (size_t i = 0; i < size();) {
  205. if (monoms[i].get_coef() == 0) {
  206. monoms.erase(monoms.begin() + i);
  207. } else {
  208. ++i;
  209. }
  210. }
  211. }
  212.  
  213. void dell_same_monoms_or_add(const Monomial<T>& other) {
  214. for (auto& monom : monoms) {
  215. if (monom.is_equal(other)) {
  216. monom += other;
  217. return;
  218. }
  219. }
  220. monoms.push_back(other);
  221. }
  222.  
  223. Polynomial<T>& operator +=(const Monomial<T>& other) {
  224. bool diff = true;
  225. for (size_t i = 0; i < monoms.size(); ++i) {
  226. if (monoms[i].is_equal(other)) {
  227. monoms[i] += other.get_coef();
  228. diff = false;
  229. }
  230. }
  231. if (diff) {
  232. monoms.push_back(other);
  233. }
  234. dell_0();
  235. return *this;
  236. }
  237.  
  238. Polynomial<T> operator + (const Monomial<T>& other) const {
  239. Polynomial<T> tmp_p = *this;
  240. return tmp_p += other;
  241. }
  242.  
  243. Monomial<T> operator[](size_t i) const {
  244. return monoms[i];
  245. }
  246.  
  247. Monomial<T>& operator[](size_t i) {
  248. return monoms[i];
  249. }
  250.  
  251. Polynomial<T>& operator += (const Polynomial<T>& other) {
  252. for (const auto& mon_from_other : other.monoms) {
  253. *this += mon_from_other;
  254. }
  255. dell_0();
  256. return *this;
  257. }
  258.  
  259. Polynomial<T> operator + (const Polynomial<T>& other) const {
  260. Polynomial<T> tmp_pol = *this;
  261. return tmp_pol += other;
  262. }
  263.  
  264. Polynomial<T>& operator *= (const T& x) {
  265. for (auto& mon : monoms) {
  266. mon *= x;
  267. }
  268. dell_0();
  269. return *this;
  270. }
  271.  
  272. Polynomial<T> operator *(const T& x) const {
  273. Polynomial<T> tmp_p = *this;
  274. return tmp_p *= x;
  275. }
  276.  
  277. Polynomial<T>& operator *= (const Polynomial<T>& other) {
  278. Polynomial<T> tmp_p = *this;
  279. monoms.clear();
  280. for (const auto& mon_from_this : tmp_p.monoms) {
  281. for (const auto& mon_from_other : other.monoms) {
  282. *this += mon_from_this * mon_from_other;
  283. }
  284. }
  285. dell_0();
  286. return *this;
  287. }
  288.  
  289. Polynomial<T> operator *(const Polynomial<T>& other) const {
  290. Polynomial<T> tmp_p = *this;
  291. return tmp_p *= other;
  292. }
  293.  
  294.  
  295. Polynomial<T>& operator -= (const Polynomial<T>& other) {
  296. *this *= -1;
  297. *this += other;
  298. *this *= -1;
  299. dell_0();
  300. return *this;
  301. }
  302.  
  303. Polynomial<T> operator - (const Polynomial<T>& other) const {
  304. Polynomial<T> tmp_p = *this;
  305. return tmp_p -= other;
  306. }
  307.  
  308. Polynomial<T> sort_pol(const MonomialOrder<T>& ord) {
  309. std::sort
  310. (
  311. monoms.begin()
  312. , monoms.end()
  313. , [&ord](Monomial<T> const& mon1, Monomial<T> const& mon2)
  314. {
  315. return ord.compair_less(mon1, mon2);
  316. }
  317. );
  318. return *this;
  319. }
  320.  
  321. size_t size() {
  322. return monoms.size();
  323. }
  324.  
  325. private:
  326. std::vector<Monomial<T>> monoms;
  327. };
  328.  
  329. template <typename T>
  330. class PolynomialOrder {
  331. public:
  332. PolynomialOrder() {}
  333.  
  334. MonomialOrder<T>& get_mon_order() {
  335. return mon_order;
  336. }
  337.  
  338. PolynomialOrder(const std::vector<std::function<bool(const Monomial<T>&, const Monomial<T>&)>>& tmp_mon_ord) {
  339. mon_order = tmp_mon_ord;
  340. }
  341.  
  342. bool compair_less(Polynomial<T>& pol1, Polynomial<T>& pol2) {
  343. pol1.sort_pol(mon_order);
  344. pol2.sort_pol(mon_order);
  345.  
  346. auto it1 = pol1.rbegin();
  347. auto it2 = pol2.rbegin();
  348. while (it1 != pol1.rend() && it2 != pol2.rend()) {
  349. if (*it1 != *it2) {
  350. return mon_order.compair_less(*it1, *it2);
  351. }
  352. ++it1;
  353. ++it2;
  354. }
  355. return pol1.size() < pol2.size();
  356. }
  357.  
  358. private:
  359. MonomialOrder<T> mon_order;
  360. };
  361.  
  362. template <typename T>
  363. class PolynomialSet {
  364. public:
  365. PolynomialSet() {}
  366.  
  367. PolynomialSet(const Polynomial<T>& pol) {
  368. pols.push_back(pol);
  369. }
  370.  
  371. auto begin() {
  372. return pols.begin();
  373. }
  374.  
  375. auto end() {
  376. return pols.end();
  377. }
  378.  
  379. auto begin() const {
  380. return pols.begin();
  381. }
  382.  
  383. auto end() const {
  384. return pols.end();
  385. }
  386.  
  387. size_t size() {
  388. return pols.size();
  389. }
  390.  
  391. Polynomial<T> operator[](size_t i) const {
  392. return pols[i];
  393. }
  394.  
  395. Polynomial<T>& operator[](size_t i) {
  396. return pols[i];
  397. }
  398.  
  399. void operator+=(const Polynomial<T>& pol) {
  400. pols.push_back(pol);
  401. }
  402.  
  403. private:
  404. std::vector<Polynomial<T>> pols;
  405. };
  406.  
  407. template <typename T>
  408. class Algorithm {
  409. public:
  410. Algorithm(const MonomialOrder<T>& order) : ord(order) {}
  411.  
  412. Polynomial<T> reduction(Polynomial<T> g, PolynomialSet<T> syst_f) const {
  413. g.sort_pol(ord);
  414. for (auto& pol : syst_f) {
  415. pol.sort_pol(ord);
  416. }
  417.  
  418. for (size_t i = 0; i < g.size(); ++i) {
  419. Monomial<T> mon_from_g = g[i];
  420. bool can_red = true;
  421. while (can_red) {
  422. can_red = false;
  423. for (const auto& pol_from_s : syst_f) {
  424. //
  425. Monomial<T> mon_L = L(pol_from_s);
  426. //
  427. if (mon_from_g.is_div(mon_L)) {
  428. //
  429. Monomial<T> tmp_c = mon_from_g / mon_L;
  430. Polynomial<T> tmp_p = pol_from_s * tmp_c; // shit is here
  431. //
  432. g -= tmp_p;
  433. g.sort_pol(ord);
  434. if (i >= g.size()) {
  435. can_red = false;
  436. } else {
  437. mon_from_g = g[i];
  438. can_red = true;
  439. }
  440. break;
  441. }
  442. }
  443. }
  444. }
  445. return g.sort_pol(ord);
  446. }
  447.  
  448. PolynomialSet<T> Buchberger(const PolynomialSet<T>& other_syst) const {
  449. PolynomialSet<T> ans_syst = other_syst;
  450. for (size_t i = 0; i < ans_syst.size(); ++i) {
  451. (ans_syst[i]).sort_pol(ord);
  452. }
  453. for (size_t i = 0; i < ans_syst.size(); ++i) {
  454. for (int j = i - 1; j >= 0; --j) {
  455. Polynomial<T> red_s_pol = reduction(S(ans_syst[i], ans_syst[j]), ans_syst);
  456. if (red_s_pol.size() != 0) { // need fixed this to check empty polynomial
  457. ans_syst += red_s_pol;
  458. }
  459. }
  460. }
  461. return ans_syst;
  462. }
  463.  
  464. private:
  465. Monomial<T> L(const Polynomial<T>& p) const {
  466. return p[p.size() - 1];
  467. }
  468.  
  469. std::pair<std::vector<int>, std::vector<int>> deegs_common_division(
  470. const Monomial<T>& m_1,
  471. const Monomial<T>& m_2) const {
  472.  
  473. std::vector<int> tmp_deegs_1(26), tmp_deegs_2(26);
  474. for (size_t i = 0; i < 26; ++i) {
  475. tmp_deegs_1[i] = std::max(m_1[i], m_2[i]) - m_1[i];
  476. tmp_deegs_2[i] = std::max(m_1[i], m_2[i]) - m_2[i];
  477. }
  478. return { tmp_deegs_1, tmp_deegs_2 };
  479. }
  480.  
  481. Polynomial<T> S(const Polynomial<T>& f_1, const Polynomial<T>& f_2) const {
  482. std::pair<std::vector<int>, std::vector<int>> tmp_deegs = deegs_common_division(L(f_1), L(f_2));
  483. Monomial<T> m_1(L(f_2).get_coef(), tmp_deegs.first);
  484. Monomial<T> m_2(L(f_1).get_coef(), tmp_deegs.second);
  485. return (f_1 * m_1 - f_2 * m_2).sort_pol(ord);
  486. }
  487.  
  488. MonomialOrder<T> ord;
  489. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement