Advertisement
dmkozyrev

deconv

Apr 18th, 2015
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. typedef long long i64;
  4. using namespace std;
  5.  
  6. int deconv(vector < i64 > &a, vector < i64 > &b, vector < i64 > &q, vector < i64 > &r, i64 n);
  7. vector<i64> nod (vector<i64> a, vector<i64> b, i64 n);
  8. void to_ring(i64 & x, i64 n);
  9. void printv(vector < i64 > &v, string str);
  10. void readv(vector <i64> &v, string str){
  11.     cout<<str<<endl<<"Input degree and coefficients of polynom: ";
  12.     int x, n;
  13.     cin>>n;
  14.     for(int i=0; i<=n; ++i){
  15.         cin>>x;
  16.         v.push_back(x);
  17.     }
  18.     cout<<endl;
  19. }
  20.  
  21. int main()
  22. {
  23.     vector < i64 > a, b, q, r;
  24.     //auto answer = nod(a, b, 2);
  25.     cout<< "a(x) = q(x)*b(x) +r(x)"<<endl;
  26.     readv(a, "Input polynom a: ");
  27.     readv(b, "Input polynom b: ");
  28.     deconv(a,b,q,r,4);
  29.     printv(a, "Polynom a: ");
  30.     printv(b, "Polynom b: ");
  31.     printv(q, "Polynom q: ");
  32.     printv(r, "Polynom r: ");
  33. //  printv(answer);
  34. }
  35.  
  36. vector<i64> nod (vector<i64> a, vector<i64> b, i64 n){
  37.     vector<i64> q, r;
  38.     deconv(a, b, q, r, n);
  39.     do {
  40.         a = b;
  41.         b = r;
  42.         deconv (a, b, q, r, n);
  43.     } while (r.front() != 0);
  44.     return b;
  45. }
  46.  
  47. void to_ring(i64 & x, i64 n){
  48.     if ( n != 0 ){
  49.     while (x>n) x -= n;
  50.     while (x<0) x+= n;
  51.     }
  52. }
  53.  
  54. int deconv(vector < i64 > &a, vector < i64 > &b, vector < i64 > &q, vector < i64 > &r, i64 n)
  55. {
  56.     q.clear();
  57.     r = a;
  58.     i64 limit = r.size() - b.size() + 1;
  59.     for (i64 j = 0; j < limit; ++j)
  60.     {
  61.         q.push_back(r[j] / b.front());
  62.         to_ring(q.back(), n);
  63.         for (i64 i = 0; i < b.size(); ++i){
  64.             r[i + j] -= q.back() * b[i];
  65.             to_ring(r[i+j], n);
  66.         }
  67.     }
  68.     i64 i;
  69.     for (i=0; (i<r.size()-1) &&( r[i] == 0);++i);
  70.     r.erase (r.begin(), r.begin()+i);
  71.     return 0;
  72. }
  73.  
  74. void printv(vector < i64 > &v, string str)
  75. {
  76.     cout<<str;
  77.   for (auto & i:v)
  78.         cout << i << " ";
  79.     cout << endl;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement