Advertisement
Solingen

z12.2.cpp

Dec 22nd, 2024
17
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.14 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. // Старшая степень полинома
  5. int degree(unsigned int poly)
  6. {
  7.     if (poly == 0) return -1;
  8.     return 31 - __builtin_clz(poly);
  9. }
  10.  
  11. // Деление polyA на polyB (оба ненулевые) над F2, возвращает остаток
  12. unsigned int polyMod(unsigned int A, unsigned int B)
  13. {
  14.     int degA = degree(A);
  15.     int degB = degree(B);
  16.  
  17.     while (degA >= degB && A != 0)
  18.     {
  19.         int shift = degA - degB;
  20.         A ^= (B << shift); // XOR - вычитание
  21.         degA = degree(A);
  22.     }
  23.     return A; // остаток
  24. }
  25.  
  26. // Проверка неприводимости: poly не делится на любой ненулевой полином меньшей степени
  27. bool isIrreducible(unsigned int poly, int n)
  28. {
  29.     if (degree(poly) != n) return false;
  30.     // проверяем делители степени [1..n-1]
  31.     // перебор всех полиномов для степеней поменьше:
  32.     for (int d = 1; d < n; d++)
  33.     {
  34.         unsigned int low = 1u << d;
  35.         unsigned int high = (1u << (d+1)) - 1u;
  36.         for (unsigned int test = low; test <= high; test++)
  37.         {
  38.             // если remainder = 0, значит poly делится
  39.             if (polyMod(poly, test) == 0)
  40.             {
  41.                 return false;
  42.             }
  43.         }
  44.     }
  45.     return true;
  46. }
  47.  
  48. int main()
  49. {
  50.     int n;
  51.     cout << "Введите степень n: ";
  52.     cin >> n;
  53.     unsigned int start = 1u << n;          // 100..0
  54.     unsigned int end   = (1u << (n+1)) - 1u; // 111..1
  55.  
  56.     int countIrr = 0;
  57.     for (unsigned int p = start; p <= end; p++)
  58.     {
  59.         if (isIrreducible(p, n))
  60.         {
  61.             countIrr++;
  62.             // Выведем в двоичном виде
  63.             cout << "Полином: ";
  64.             for (int b = n; b >= 0; b--)
  65.             {
  66.                 cout << ((p >> b) & 1);
  67.             }
  68.             cout << " — неприводим\n";
  69.         }
  70.     }
  71.  
  72.     cout << "Всего неприводимых = " << countIrr << endl;
  73.     return 0;
  74. }
  75.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement