Advertisement
dmkozyrev

nod_polynoms

Apr 19th, 2015
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.05 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);
  10.  
  11. int main()
  12. {
  13.         vector < i64 > a{1,0,0,0,1,1,1,1,1};
  14.         vector < i64 > b{1,0,1,0,1,1,0,1};
  15.         vector < i64 > q, r;
  16.         auto answer = nod(a, b, 2);
  17.         printv(a);
  18.         printv(b);
  19.         printv(answer);
  20. }
  21.  
  22. vector<i64> nod (vector<i64> a, vector<i64> b, i64 n){
  23. //находит НОД двух многочленов в кольце вычетов по модулю n
  24. //чтобы выключить дополнение с кольцом вычетов нужно передать ноль вместо n
  25.         vector<i64> q, r;
  26.         deconv(a, b, q, r, n);
  27.         do {
  28.                 a = b;
  29.                 b = r;
  30.                 deconv (a, b, q, r, n);
  31.         } while (r.front() != 0);
  32.         return b;
  33. }
  34.  
  35. void to_ring(i64 & x, i64 n){
  36. //загоняет х в диапазон 0..n-1
  37.         if ( n != 0 ){
  38.         while (x>n) x -= n;
  39.         while (x<0) x+= n;
  40.         }
  41. }
  42.  
  43. int deconv(vector < i64 > &a, vector < i64 > &b, vector < i64 > &q, vector < i64 > &r, i64 n)
  44. // делит многочлен на многочлен
  45. {
  46.         q.clear();
  47.         r = a;
  48.         i64 limit = r.size() - b.size() + 1;
  49.         for (i64 j = 0; j < limit; ++j)
  50.         {
  51.                 q.push_back(r[j] / b.front());
  52.                 to_ring(q.back(), n);
  53.                 for (i64 i = 0; i < b.size(); ++i){
  54.                         r[i + j] -= q.back() * b[i];
  55.                         to_ring(r[i+j], n);
  56.                 }
  57.         }
  58.         i64 i;
  59.         for (i=0; (i<r.size()-1) &&( r[i] == 0);++i);
  60.         r.erase (r.begin(), r.begin()+i);
  61.         return 0;
  62. }
  63.  
  64. void printv(vector < i64 > &v)
  65. //выводит вектор на экран
  66. {
  67.   for (auto & i:v)
  68.         cout << i << " ";
  69.     cout << endl;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement