### 6.33.18 Construction d’un corps de Galois : `GF`

Dans sa forme la plus simple, `GF` a comme arguments un nombre premier p et un entier n>1 ou la puissance d’un nombre premier pn et un argument optionnel qui est le nom de variable choisi pour le générateur du corps (la variable doit être purgée au préalable).
`GF` crée un corps de Galois de caractéristique p et ayant pn éléments, les éléments du corps sont alors 0 et les puissances de 0 à pn−2 du générateur. Le corps lui-même est stocké dans une variable libre (par défaut K, cette variable est affichée par le système, en même temps que le nom du générateur et de la variable libre, par défaut k, servant à représenter les élements du corps comme le quotient ℤ/pℤ[k]/P(k) où P est un polynôme irréductible et primitif).
Par exemple :

- `GF(3,5)` ou `GF(3^5)` crée un corps ayant 35 éléments dont le générateur est `g` (ou `h`, ... si g est affectée). On peut créer un élément du corps en prenant un polynôme en fonction de g, par exemple g10+5g+1.
- `GF(2,8,a)` crée un corps ayant 28 éléments, et utilise la variable `a` pour en désigner le générateur (attention, faire `purge(a)` auparavant si nécessaire).
- La commande `pmin` permet de connaitre le polynôme minimal d’un élément du corps.

On peut ensuite créer des polynômes ou des matrices ayant des coefficients dans le corps, et les manipuler avec les instructions habituelles `+ - * / inv sqrt`, `quo, rem, quorem, diff, factor, gcd. egcd, ...` par exemple :

- `GF(3,5,b); A:=[[1,b],[b,1]]; inv(A)` calcule l’inverse d’une matrice à coefficients dans le corps à 35 éléments
- `GF(5,3,c); p:=x^2-c-1; factor(p)` factorise le polynôme p comme polynôme à coefficients dans le corps à 53 éléments, on en déduit une valeur de racine carrée de c+1.
- `p:=randpoly(x,5,g); q:=diff(p); gcd(p,q)` génere un polynôme à coefficients aléatoires puis calcule sa dérivée et le PGCD ce qui permet de savoir si `p` a des racines multiples.

Il y a encore quelques limitations dues à une implémentation incomplète de certains algorithmes (par exemple factorisation à plusieurs variables lorsque le polynôme n’est pas unitaire).

Dans sa forme la plus complète (mais plus difficile à manipuler et moins lisible), les éléments de ce corps et le corps lui-même sont représentés par `GF(...)` où `...` est une séquence composée de :

- la caractéristique p (px=0),
- le polynôme minimal irréductible (primitif s’il est créé par giac) engendrant un idéal I dans ℤ/pℤ[X], le corps de Galois est alors le quotient de ℤ/pℤ[X] par I,
- le nom de la variable du polynôme, par défaut `x`,
- un polynôme (un reste modulo le polynôme minimal) pour désigner un élément du corps (ces éléments ont une représentation additive) ou `undef` pour désigner tout le corps qui est le quotient des polynômes à coefficients dans Z/pZ par I.

Habituellement on donne un nom au corps crée (par exemple `G:=GF(p,n)`), afin de construire un élément particulier du groupe à partir d’un polynôme de ℤ/pℤ[X], on écrira par exemple `G(x```^```3+x)`. Notez que `G(x)` est un générateur du groupe multiplicatif `G``*` lorsque le polynôme minimal est généré par giac.
On tape :

`G:=GF(2,8)`

On obtient (par exemple) :

`GF(2,k```^```8-k```^```7-k```^```6-k-1,k,undef)`

Le corps G a 28=256 éléments et g=G(k) engendre le groupe multiplicatif de ce corps ({ 1,g,g2,...g254 }).
On tape :

`K(k```^```9)`

On obtient :

`g```^```6+g```^```2+1)`

On tape :

`K(k)```^```255`

On obtient 1. Comme vous pouvez le constater sur les exemples précédents, lorsque l’on travaille avec le même corps, les réponses contiennent des informations redondantes. C’est pourquoi la définition d’un corps peut avoir un troisième argument : le nom du générateur ou une liste contenant deux noms ou trois noms de variable formelle, (le nom de l’indéterminée du polynôme irréductible et le nom du corps de Galois que l’on doit mettre entre quote pour que ces variables ne soient pas évaluées ainsi que le nom du générateur). Cela permet d’obtenir un affichage plus compact des éléments du corps.
On tape :

`G:=GF(2,2,[’w’,’G’]):; G(w```^```2)`

On obtient :

`Done, G(w+1)`

On tape :

`G(w```^```3)`

On obtient :

`G(1)`

Les éléments de `GF(2,2)` sont donc : `0,1,w,w```^```2=w+1`.

On peut enfin indiquer quel polynôme irréductible on souhaite utiliser, en l’indiquant en 2-ième paramètre (au lieu de n), par exemple :

`G:=GF(2,w^8+w^6+w^3+w^2+1,['w','G'])`

Si on donne un polynôme irréductible non primitif, `Xcas` l’indique et propose un remplacement par un polynôme primitif, par exemple :

`G:=GF(2,w^8+w^7+w^5+w+1,['w','G'])`

On obtient :

`G:=GF(2,w^8-w^6-w^3-w^2-1,['w','G'],undef)`