Advertisement
maxim_shlyahtin

kroneker

Dec 19th, 2023 (edited)
505
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.44 KB | None | 0 0
  1. #include <iostream>
  2. #include <set>
  3. #include <vector>
  4. #include <utility>
  5. #include <iterator>
  6. #include <limits>
  7. #include <typeinfo>
  8. #include <functional>
  9. #include <iostream>
  10. #include <numeric>
  11. #include <cmath>
  12. #include <variant>
  13. #include <ranges>
  14. #include <vector>
  15. #include <list>
  16. #include <string>
  17. #include <vector>
  18. #include "src/Polynomial.cpp"
  19. #include <iomanip>
  20. #include <iostream>
  21. #include <string>
  22. #include <string_view>
  23. #include <type_traits>
  24. #define INT_SIZE 128
  25. #define INFINTY std::numeric_limits<int>::max()
  26.  
  27. using basis_coefficients = std::vector<std::pair<float, float>>;
  28. using basis_polynomials = std::vector<std::vector<float>>;
  29. using coefs = std::vector<float>;
  30. using binomial_coefs = std::pair<float, float>;
  31. using namespace std;
  32.  
  33.  
  34. variant<bool, basis_polynomials> get_coefficients(float _pl, coefs _xi)
  35. {  
  36.     if(_xi.size() != set(_xi.begin(), _xi.end()).size())
  37.         return false;
  38.     float n = _xi.size();
  39.     // for(int i = 0; i < _xi.size(); ++i){
  40.     //     cout << _xi[i] << ' ';
  41.     // }
  42.     // cout << '\n';
  43.     basis_polynomials coefficients(n, coefs(2));
  44.     for (float i = 0; i < n; ++i)
  45.     {
  46.         if (i == _pl)
  47.         {  
  48.             coefficients[i][0] = INFINTY;
  49.             coefficients[i][1] = INFINTY;
  50.         }
  51.         else
  52.         {  
  53.             if(_xi[_pl] - _xi[i] == 0){
  54.                 for(int j = 0; j < _xi.size(); ++j){
  55.                     cout << _xi[j] << ' ';
  56.                 }
  57.                 cout << '\n';
  58.             }
  59.             coefficients[i][0] = 1 / (_xi[_pl] - _xi[i]);
  60.             coefficients[i][1] = -_xi[i] / (_xi[_pl] - _xi[i]);
  61.         }
  62.     }
  63.     basis_polynomials filtered_coefficients(n - 1, coefs(2));
  64.     float j = 0;
  65.     for (float i = 0; i < n; ++i)
  66.     {
  67.         if (coefficients[i][0] != INFINTY)
  68.         {
  69.             filtered_coefficients[j][0] = coefficients[i][1];
  70.             filtered_coefficients[j][1] = coefficients[i][0];
  71.             j++;
  72.         }
  73.     }
  74.     return filtered_coefficients;
  75. }
  76.  
  77. // coefs polynomialTimesPolynomial(coefs x, coefs y)
  78. // {
  79. //     float n = x.size() + y.size() - 1;
  80. //     coefs result(n, float(0));
  81. //     for (float i = 0; i < x.size(); ++i)
  82. //     {
  83. //         for (float j = 0; j < y.size(); ++j)
  84. //         {
  85. //             result[i + j] += x[i] * y[j];
  86. //         }
  87. //     }
  88. //     return result;
  89. // }
  90.  
  91. // coefs calculateBasisLagrangePolynomial(basis_polynomials filtered_coefs)
  92. // {
  93. //     float n = filtered_coefs.size();
  94. //     coefs result(n + 1, float(0));
  95. //     coefs tmp;
  96. //     if (n == 1)
  97. //         tmp = filtered_coefs[0];
  98. //     else
  99. //         tmp = polynomialTimesPolynomial(filtered_coefs[0], filtered_coefs[1]);
  100. //     for (float i = 0; i < tmp.size(); ++i)
  101. //         result[i] = tmp[i];
  102. //     for (float i = 2; i < filtered_coefs.size(); ++i)
  103. //     {
  104. //         coefs tmp = polynomialTimesPolynomial(result, filtered_coefs[i]);
  105. //         for (float j = 0; j < tmp.size(); ++j)
  106. //             result[j] = tmp[j];
  107. //     }
  108. //     return result;
  109. // }
  110.  
  111. // basis_polynomials calculateAllBasisLagrangePolynomial(coefs x)
  112. // {
  113. //     float n = x.size();
  114. //     basis_polynomials result;
  115. //     for (float pl = 0; pl < n; ++pl)
  116. //         result.push_back(calculateBasisLagrangePolynomial(get_coefficients(pl, x)));
  117. //     return result;
  118. // }
  119.  
  120. variant<bool, basis_polynomials> get_polynomial_l(coefs _xi)
  121. {  
  122.     variant<bool, vector<vector<int>>> ans;
  123.     int n = _xi.size();
  124.     basis_polynomials pli(n, coefs(n));
  125.     for (float pl = 0; pl < n; ++pl)
  126.     {  
  127.         variant<bool, basis_polynomials> check = get_coefficients(pl, _xi);
  128.         if(holds_alternative<bool>(check))
  129.             return false;
  130.         basis_polynomials coefficients = get<basis_polynomials>(check);
  131.         for (float i = 1; i < n - 1; ++i)
  132.         {
  133.             if (i == 1)
  134.             {
  135.                 pli[pl][0] = coefficients[i - 1][0] * coefficients[i][0];
  136.                 pli[pl][1] = coefficients[i - 1][1] * coefficients[i][0] + coefficients[i][1] * coefficients[i - 1][0];
  137.                 pli[pl][2] = coefficients[i - 1][1] * coefficients[i][1];
  138.             }
  139.             else
  140.             {
  141.                 coefs clone_pli(n, float(0));
  142.                 for (float val = 0; val < n; ++val)
  143.                     clone_pli[val] = pli[pl][val];
  144.                 coefs zeros_pli(n, float(0));
  145.                 float product_1;
  146.                 float product_2;
  147.                 for (float j = 0; j < n - 1; j++)
  148.                 {
  149.                     product_1 = clone_pli[j] * coefficients[i][0];
  150.                     product_2 = clone_pli[j] * coefficients[i][1];
  151.                     zeros_pli[j] += product_1;
  152.                     zeros_pli[j + 1] += product_2;
  153.                 }
  154.                 for (float val = 0; val < n; ++val)
  155.                     pli[pl][val] = zeros_pli[val];
  156.             }
  157.         }
  158.     }
  159.     cout << pli.size() << '\n';
  160.     for(int i = 0; i < pli.size(); ++i){
  161.         for(int j = 0; j < pli[i].size(); ++j){
  162.             cout << pli[i][j] << ", ";
  163.         }
  164.         cout << " | ";
  165.     }
  166.     cout << "-> ";
  167.     // vector<vector<int>> res;
  168.     // int check = pli[0].size();
  169.     // for(size_t i = 0; i < pli.size(); ++i){
  170.     //     vector<int> tmp_vec;
  171.     //     for(size_t j = 0; j < pli[i].size(); ++j){
  172.             // float integerPart;
  173.             // float fractionalPart = modf(pli[i][j], &integerPart);
  174.     //         if(fractionalPart == 0.0){
  175.     //             // cout << "int " <<integerPart << '\n';
  176.     //             int tmp = static_cast<int>(integerPart);
  177.     //             // res[i][j] = tmp;
  178.     //             tmp_vec.push_back(tmp);
  179.     //         }
  180.     //         if(tmp_vec.size() == check){
  181.     //             return false;
  182.     //         }
  183.     //     }
  184.     // }
  185.     // for(int i = 0; i < res.size(); ++i){
  186.     //     for(int j = 0; j < res[i].size(); ++j){
  187.     //         cout << res[i][j] << ' ';
  188.     //     }
  189.     //     cout << '\n';
  190.     // }
  191.     // if(res.size() == 0)
  192.     //     return false;
  193.     return pli;
  194. }
  195.  
  196. using int_coefs = vector<vector<int>>;
  197. variant<bool, Polynomial<int>> get_polynomial(coefs xi, coefs _yi)
  198. {  
  199.     variant<bool, Polynomial<int>> ans;
  200.     float n = xi.size();
  201.     basis_polynomials polynomial_l;
  202.     bool bres;
  203.     variant<bool, basis_polynomials> check = get_polynomial_l(xi);
  204.     if(holds_alternative<bool>(check)){
  205.         bres = get<bool>(check);
  206.         return false;
  207.     }
  208.     polynomial_l = get<basis_polynomials>(check);
  209.     for (float i = 0; i < n; ++i)
  210.     {
  211.         for (float j = 0; j < n; ++j)
  212.             polynomial_l[i][j] *= _yi[i];
  213.     }
  214.     vector<float> Lagrange(n, float(0));
  215.     for (float i = 0; i < n; ++i)
  216.     {
  217.         for (float j = 0; j < n; ++j)
  218.             Lagrange[i] += polynomial_l[j][i];
  219.     }
  220.     for(int i = 0; i < Lagrange.size(); ++i){
  221.         cout << Lagrange[i] << ' ';
  222.     }
  223.     cout << '\n';
  224.     vector<int> res;
  225.     for(size_t i = 0; i < Lagrange.size(); ++i){
  226.         float integerPart;
  227.         float fractionalPart = modf(Lagrange[i], &integerPart);
  228.         if(fractionalPart == 0.0){
  229.             res.push_back(static_cast<int>(Lagrange[i]));
  230.         } else{
  231.             return false;
  232.         }
  233.     }
  234.     // Polynomial<int> res = Polynomial<int>(Lagrange);
  235.     return Polynomial<int> {res};
  236. }
  237.  
  238. bool IsPrime(const int n)
  239. {
  240.     for (int i = 2; i * i <= n; i++)
  241.         if (n % i == 0)
  242.             return false;
  243.     return n > 1;
  244. }
  245.  
  246. set<int> toPrimeNumbers(int num)
  247. {
  248.     num = abs(num);
  249.     set<int> nums;
  250.     if (num == 0)
  251.     {
  252.         return nums;
  253.     }
  254.     if (IsPrime(num))
  255.     {
  256.         nums.insert(num);
  257.         return nums;
  258.     }
  259.     nums.insert(num);
  260.     nums.insert(1);
  261.     for (size_t i = 2; i * i <= num; ++i)
  262.     {
  263.         if (num % i == 0 && IsPrime(i))
  264.         {
  265.             nums.insert(i);
  266.             nums.insert(num / i);
  267.         }
  268.     }
  269.     return nums;
  270. }
  271.  
  272. int gcd_n(const std::vector<int>& values) {
  273.    if (values.empty())
  274.        return -1;
  275.    if (values.size() == 1)
  276.        return values[0];
  277.    int gcd_value = gcd(values[0], values[1]);
  278.    for (int i = 2; i < values.size(); ++i) {
  279.        gcd_value = gcd(gcd_value, values[i]);
  280.    }
  281.    return gcd_value;
  282. }
  283.  
  284. pair<int, Polynomial<int>> ContPrim(Polynomial<int> f) {
  285.     if (f == 0) {
  286.         return make_pair(NULL, NULL);
  287.     } else {
  288.         // Get the coefficients of the polynomial
  289.         vector<int> cl = f.get_coef();
  290.  
  291.         // Compute the greatest common divisor of the coefficients
  292.         int cf = gcd_n(cl);
  293.  
  294.         for(size_t i = 0; i <= f.Degree(); ++i){
  295.             cl[i] /= cf;
  296.         }
  297.  
  298.         f.set_coef(cl);
  299.  
  300.         return make_pair(cf, f);
  301.     }
  302. }
  303.  
  304. set<pair<int, int>> CartesianS(set<int> A, set<int> B)
  305. {
  306.     set<pair<int, int>> AxB;
  307.  
  308.     for (int a : A)
  309.     {
  310.         for (int b : B)
  311.         {
  312.             AxB.insert(make_pair(a, b));
  313.         }
  314.     }
  315.  
  316.     return AxB;
  317. }
  318.  
  319. vector<vector<int>> CartesianSL(set<vector<int>> A, set<vector<int>> B)
  320. {
  321.     vector<vector<int>> AxB;
  322.  
  323.     for (const vector<int> &a : A)
  324.     {
  325.         for (const vector<int> &b : B)
  326.         {
  327.             AxB.push_back(vector<int>(a.begin(), a.end()));
  328.             AxB.back().insert(AxB.back().end(), b.begin(), b.end());
  329.         }
  330.     }
  331.  
  332.     return AxB;
  333. }
  334.  
  335. set<vector<int>> SetOfLists(set<int> A)
  336. {
  337.     set<vector<int>> B;
  338.  
  339.     for (int a : A)
  340.     {
  341.         B.insert({a});
  342.     }
  343.  
  344.     return B;
  345. }
  346.  
  347. set<vector<int>> CartesianLS(vector<set<int>> U)
  348. {
  349.     int n = U.size();
  350.  
  351.     if (n == 0)
  352.     {
  353.         return {};
  354.     }
  355.  
  356.     int N = 1;
  357.     vector<set<vector<int>>> V(n);
  358.     for (int i = 0; i < n; i++)
  359.     {
  360.         N *= U[i].size();
  361.         V[i] = SetOfLists(U[i]);
  362.     }
  363.  
  364.     if (N == 0)
  365.     {
  366.         return {};
  367.     }
  368.  
  369.     set<vector<int>> P = V[0];
  370.     for (int i = 1; i < n; i++)
  371.     {
  372.         set<vector<int>> temp;
  373.         for (const vector<int> &p : P)
  374.         {
  375.             for (const vector<int> &v : V[i])
  376.             {
  377.                 vector<int> new_p = p;
  378.                 new_p.insert(new_p.end(), v.begin(), v.end());
  379.                 temp.insert(new_p);
  380.             }
  381.         }
  382.         P = temp;
  383.     }
  384.  
  385.     return P;
  386. }
  387.  
  388. // vector<int> DIV(vector<int> coefficients) {
  389. //     while (coefficients.back() == 0) {
  390. //         coefficients.pop_back();
  391. //     }
  392. //     return coefficients;
  393. // }
  394.  
  395. // vector<int> QUO(vector<int> dividend, vector<int> divisor) {
  396. //     int div_size = divisor.size();
  397. //     int dif = dividend.size() - div_size + 1;
  398. //     for (int i = 0; i < dif; i++) {
  399. //         int coef = dividend[i] / divisor[0];
  400. //         for (int j = 0; j < div_size; j++) {
  401. //             dividend[i + j] -= coef * divisor[j];
  402. //         }
  403. //     }
  404. //     return DIV(dividend);
  405. // }
  406.  
  407. void printVector(const vector<int> &v)
  408. {
  409.     cout << "[";
  410.     for (int i = 0; i < v.size(); ++i)
  411.     {
  412.         cout << v[i];
  413.         if (i != v.size() - 1)
  414.         {
  415.             cout << ", ";
  416.         }
  417.     }
  418.     cout << "]";
  419. }
  420.  
  421. void printSet(const set<int> &A)
  422. {
  423.     copy(A.begin(), A.end(), ostream_iterator<int>(cout, " "));
  424. }
  425.  
  426. struct Kroneker{
  427.     int cf;
  428.     Polynomial<int> prf;
  429.     bool driven;
  430.     Polynomial<int> x_a;
  431.     Polynomial<int> quo;
  432. };
  433.  
  434. int get_func_val(Polynomial<int> f, int xi){
  435.     int res = f[0];
  436.     for(size_t i = 1; i <= f.Degree(); ++i){
  437.         res += f[i] * pow(xi, i);
  438.     }
  439.     return res;
  440. }
  441.  
  442. struct Kroneker kroneker(Polynomial<int> f){
  443.     int n = f.Degree();
  444.     struct Kroneker ans;
  445.     if(n == 0){
  446.         ans.cf = abs(f[0]);
  447.         return ans;
  448.     }
  449.     pair<int, Polynomial<int>> tmp = ContPrim(f);
  450.     ans.cf = tmp.first;
  451.     ans.prf = tmp.second;
  452.     int m = n / 2;
  453.     vector<int> x(m, 0);
  454.     vector<int> y(m, 0);
  455.     vector<set<int>> DY;
  456.     for(size_t i = 0; i <= m; ++i){
  457.         x[i] = i;
  458.         y[i] = get_func_val(ans.prf, i);
  459.         if(y[i] == 0){
  460.             Polynomial<int> x_a{{-x[i], 1}};
  461.             Polynomial<int> quo = (ans.prf / x_a).first; // возращается пара, возможен нецелочисленное деление
  462.             ans.driven = false;
  463.             ans.x_a = x_a;
  464.             ans.quo = quo;
  465.             return ans;
  466.         }
  467.         DY.push_back(toPrimeNumbers(y[i]));
  468.     }
  469.     set<vector<int>> M = CartesianLS(DY);
  470.     vector<vector<float>> f_values;
  471.     vector<vector<float>> vec_M;
  472.     for(const auto& mu : M){
  473.         vector<float> mu_values;
  474.         vector<float> args;
  475.         for(const auto& mu_elem : mu){
  476.             mu_values.push_back(static_cast<float>(get_func_val(ans.prf, mu_elem)));
  477.             args.push_back(static_cast<float>(mu_elem));
  478.         }
  479.         f_values.push_back(mu_values);
  480.         vec_M.push_back(args);
  481.     }
  482.     for(size_t i = 0; i < vec_M.size(); ++i){
  483.         variant<bool, Polynomial<int>> g = get_polynomial(vec_M[i], f_values[i]);
  484.         if(holds_alternative<Polynomial<int>>(g)){
  485.             // cout << "here" << '\n';
  486.             Polynomial<int> h = get<Polynomial<int>>(g);
  487.             // cout << h << '\n';
  488.             pair<Polynomial<int>, int> tmp_rem = ans.prf / h;
  489.             Polynomial<int> rem = ans.prf % h;
  490.             if(h.Degree() >= 1 && rem[0] == 0 && rem.Degree() == -1 && tmp_rem.second == 1){
  491.                 if(h[h.Degree()] < 0){
  492.                     h *= -1;
  493.                 }
  494.                 ans.driven = false;
  495.                 ans.x_a = h;
  496.                 ans.quo = tmp_rem.first;
  497.                 return ans;
  498.             }
  499.         }
  500.     }
  501.     ans.driven = true;
  502.     return ans;
  503. }
  504.  
  505. int main0()
  506. {
  507.     vector<set<int>> U = {{1, 2}, {3, 4, 5, 7}, {8, 9}}; // Пример списка множеств U
  508.  
  509.     set<vector<int>> result = CartesianLS(U);
  510.     cout << "Cartesian product of U: ";
  511.     for (const vector<int> &list : result)
  512.     {
  513.         printVector(list);
  514.         cout << " ";
  515.     }
  516.     cout << endl;
  517.  
  518.     return 0;
  519. }
  520.  
  521. int main1()
  522. {
  523.     set<int> A = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // Пример множества A
  524.  
  525.     set<vector<int>> result = SetOfLists(A);
  526.     cout << "Set of lists B: ";
  527.     for (const vector<int> &list : result)
  528.     {
  529.         printVector(list);
  530.         cout << " ";
  531.     }
  532.     cout << endl;
  533.  
  534.     return 0;
  535. }
  536.  
  537. int main2()
  538. {
  539.     set<vector<int>> A = {{1}, {2}, {4}};                  // Пример множества A
  540.     set<vector<int>> B = {{1, 1}, {1, 2}, {2, 1}, {2, 2}}; // Пример множества B
  541.  
  542.     vector<vector<int>> result = CartesianSL(A, B);
  543.     cout << "Cartesian product of A and B: ";
  544.     for (const vector<int> &pair : result)
  545.     {
  546.         printVector(pair);
  547.         cout << " ";
  548.     }
  549.     cout << endl;
  550.  
  551.     return 0;
  552. }
  553.  
  554. int main3()
  555. {
  556.     set<int> B = {1, 2, 3}; // Пример множества A
  557.     set<int> A = {4, 5};    // Пример множества B
  558.  
  559.     set<pair<int, int>> result = CartesianS(A, B);
  560.     cout << "Cartesian product of A and B: ";
  561.     for (auto it = result.begin(); it != result.end(); ++it)
  562.     {
  563.         cout << "(" << it->first << ", " << it->second << ") ";
  564.     }
  565.     cout << endl;
  566.  
  567.     return 0;
  568. }
  569.  
  570. int main4()
  571. {
  572.     set<int> A;
  573.     int a = -12;
  574.     printSet(toPrimeNumbers(a));
  575.     return 0;
  576. }
  577.  
  578. int main(){
  579.     Polynomial<int> f({8, 0, 0, 0, 2});
  580.     Kroneker tmp = kroneker(f);
  581.     cout << tmp.cf << '\n';
  582.     cout << tmp.prf << '\n';
  583.     cout << tmp.driven << '\n';
  584.     cout << tmp.x_a << '\n';
  585.     cout << tmp.quo << '\n';
  586.     return 0;
  587. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement