Xaositect писал(а):
Можно воспользоваться тем, что
![$GF(p^n) = GF(p)[x]/(f(x))$ $GF(p^n) = GF(p)[x]/(f(x))$](https://dxdy-03.korotkov.co.uk/f/6/c/2/6c26607db7e483500a126f6bec4cf69882.png)
,
![$f(x)$ $f(x)$](https://dxdy-04.korotkov.co.uk/f/7/9/9/7997339883ac20f551e7f35efff0a2b982.png)
- неприводимый многочлен
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
-й степени. Тогда элементы
![$GF(p^n)$ $GF(p^n)$](https://dxdy-04.korotkov.co.uk/f/3/4/2/34273f021ab4ac6f45b6650d23392ef682.png)
можно хранить как набор коэффициентов многочлена. И как глобальную переменную или константу хранить многочлен f.
C
![$GF(2^n)$ $GF(2^n)$](https://dxdy-03.korotkov.co.uk/f/6/c/b/6cb690bdcd630ba29221f9c2115aeb7c82.png)
достаточно просто - элемент поля представляется в виде
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
битов - коэффициентов многочлена и операции можно реализовать через побитовые операции над целыми числами.
Где найти алгоритм построения неприводимого многочлена размерности
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
над полем
![$GF(p)$ $GF(p)$](https://dxdy-02.korotkov.co.uk/f/9/7/8/978d6cf47e27d2559ab8f3700534e82082.png)
?
В классической монографии Р.Лидл, Г.Нидеррайтер. Конечные поля.
Другой вариант - подобрать неприводимый многочлен методом научного тыка.
С учетом того, что неприводимых полиномов много довольно много, а алгоритм Берлекэмпа (проверки на неприводимость) работает очень быстро, этот способ вполне эффективен.
Кстати, у Лидла с Нидеррайтером в приложениях есть таблицы неприводимых полиномов.
Наконец, в некоторых системах компьютерной алгебры, например, в Maple есть готовые библитеки для работы сконечными полями. Задавая конечное поле можно заранее указать, наряду с
![$p$ $p$](https://dxdy-03.korotkov.co.uk/f/2/e/c/2ec6e630f199f589a2402fdf3e0289d582.png)
и
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
, неприводимый полином. А можно этого и не делать. Тогда Maple предложит свой вариант.
-- 19 май 2009, 02:33 --Если действовать методом, который я предложил изначально:
В общем случае можно некоторым образом построить поле, поставить ему в соответствие таблицу сложения и умножения и работать с ними. Но хотелось бы увидеть более простой способ работы с элементами поля.
то какой самый простой алгоритм построения конечного поля (построения 2-х таблиц)?
Учитывая простоту выполнения сложения в любом конечном поле, хранить таблицу сложения - странное решение.
Умножение в представлении с помощью полиномиального базиса (представление с помощью первообразного корня прекрасно годится для умножения, но неудобно для выполнения сложения) тоже выполняется не слишком долго. Но если критично быстродействие, а не память, то, разумеется можно и таблицу построить. Опять таки с помощью уже упомянутых представлений. Или других. Например, матричного.