Polynôme irréductible sur un corps fini

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous !

J’aimerais implémenter un algorithme en Python dans lequel je dois travailler avec des éléments de Fpk\mathbb{F}_{p^k}. Le problème, c’est qu’après avoir codé les classes pour travailler avec des polynômes modulo d’autres polynômes, je me suis rendu compte qu’il me manquait le modulo avec lequel travailler :-°

Pour F2k\mathbb{F}_{2^k}, on prend Xk+X+1X^k + X + 1 et tout va bien. Mais quid du cas général ? Si je veux travailler avec Fpk\mathbb{F}_{p^k} avec pp relativement grand ? Y a-t-il un algorithme pour cela, ou faut-il faire une bruteforce sur les coefficients des polynômes de degré kk dans Fp\mathbb{F}_{p} ?

Merci d’avance ! :)

Approche simple : prendre un polynôme de degré kk au hasard et regarder s’il est irréductible, répéter tant que ça marche pas

C’est pas très dur de montrer que la proba de tomber sur un polynôme irréductible est 1/2k\ge 1/2k, et y a des tests d’irréductibilité dans Fp\mathbf{F}_p assez simples à coder. Par exemple, PFp[X]P\in \mathbf{F}_p[X] de degré kk est irréductible ssi. PXpkxP\mid X^{p^k}-x et pour tout qq premier divisant kk, pgcd(P,Xpk/q)=1\text{pgcd}(P,X^{p^{k/q}})=1 (théorème dû à Rabin, cf. la page Wikipedia sur la factorisation des polynômes sur des corps finis). Si on utilise que des algos naïfs, en O(k4)O(k^4) t’as une probabilité constante de trouver un polynôme irréductible, mais avec une FFT tu peux déjà avoir du O(k3logk)O(k^3\log k) assez simplement (sans compter les facteurs polylogs en qq).

Après évidemment c’est un problème assez étudié dans la littérature, par exemple cet article semble être ce qui se fait de plus moderne et donne du k1+ok(1)(logq)5+oq(1)k^{1+o_k(1)}(\log q)^{5+o_q(1)} randomisé. Visiblement la question déterministe est également assez intéressante, cf. ce vieux papier d’Adleman et Lenstra qui donne du (klogq)O(1)(k \log q)^{O(1)} sous l’hypothèse de Riemann généralisée.

Note qu’on obtient pas forcément un polynôme primitif avec cette méthode, ce qui j’imagine peut être embêtant pour implémenter les opérations sur le corps (t’as pas forcément accès à une représentation "multiplicative").

+1 -0

Merci pour les liens, je vais regarder ça ! Une probabilité de 12k\frac{1}{2\,k} est en théorie suffisante pour moi pour l’instant, mais je vais jeter un coup d’œil au papier de J.M. COUVEIGNES et R. LERCIER, qui s’il tient ses promesses a l’air très intéressant :p

Note qu’on obtient pas forcément un polynôme primitif avec cette méthode, ce qui j’imagine peut être embêtant pour implémenter les opérations sur le corps (t’as pas forcément accès à une représentation "multiplicative").

Lucas-84

Damned, je n’avais pas cette information :'( Je ne comprends pas pourquoi néanmoins. Un corps fini est entièrement caractérisé par son cardinal de ce que je comprends. Plus exactement, tous les corps de cardinaux pkp^k sont isomorphes entre eux. Dans ce cas, puisque Fp[X]/P\mathbf{F}_p[X]_{/P} est un corps de cardinal pkp^k pour PP un polynôme irréductible de Fp\mathbf{F}_p de degré kk, pourquoi ne puis-je y implémenter la multiplication de manière "naturelle" (c’est-à-dire en définissant le produit de deux polynômes modulo PP comme étant le produit de ces deux polynômes dans Fp\mathbf{F}_p pris modulo PP) et tout de même l’identifier à Fpk\mathbf{F}_{p^k} ?

Si, tu peux faire ça et c’est d’ailleurs comme ça que l’on construit la multiplication. Je suis assez rouillé en informatique, mais j’imagine que ça peut poser des problèmes si tu as plusieurs constructions de Fpk\mathbf F_{p^k}, une du type FpkFp[X]/P\mathbf F_{p^k} \sim \mathbf F_p[X]/P et une du type FpkFp[X]/Q\mathbf F_{p^k} \sim \mathbf F_p[X]/Q avec P,QP, Q irréductibles de degré kk sur Fp\mathbf F_p, il ne me semble pas évident d’exhiber un isomorphisme entre tes deux constructions.

Tu as donc intérêt à avec une construction unique que tu utilises tout le long de ton programme.

Oui, pardon, c’est juste une histoire de complexité. Avec ta représentation, un élément de Fpk\mathbf{F}_{p^k} ça prend klogpk\log p bits de mémoire, additionner c’est kk opérations de Fp\mathbf{F}_p et multiplier ça dépend, mais ça va être en gros au moins du klogkk\log k (k2k^2 si tu fais ça naïvement).

Je crois que ce que les gens font généralement, c’est au lieu de dire qu’un élément de Fpk\mathbf{F}_{p^k} c’est un polynôme de degré <k< k, tu dis que c’est un truc de la forme XiX^i, en supposant que le polynôme XX est un générateur du groupe multiplicatif du corps Fp[X]/P\mathbf{F}_p[X]/PPP c’est ton polynôme irréductible (condition qui est réalisée quand PP est primitif, justement). Tu représentes l’élément 00 par 00, 11 par pk1p^k-1 et XiX^i par ii pour 1i<pk11\le i< p^k-1. Ça prend toujours klogpk\log p bits en mémoire, mais multiplier/diviser devient super rapide (c’est en gros une seule addition dans Z/(pk1)Z\mathbb{Z}/(p^k-1)\mathbb{Z}). Additionner/soustraire c’est un peu relou, mais en écrivant Xi+Xj=Xi(1+Xji)X^i+X^j=X^i(1+X^{j-i}) tu vois que si t’as assez de place pour stocker ton corps en mémoire, il suffit juste de précalculer la représentation multiplicative de tous les Xi+1X^i+1. Si t’as ça, additionner/soustraire c’est aussi 2 ou 3 opérations de Z/(pk1)Z\mathbb{Z}/(p^k-1)\mathbb{Z}.

Pour le coup c’est facile de compter le nombre de polynômes primitifs unitaires de degré kk : il y en a ϕ(pk1)\phi(p^k-1), donc la proba de tomber dessus c’est ϕ(pk1)/kpk\phi(p^k-1)/kp^k. Bon et avec les mains, si on utilise la borne inf sur ϕ\phi de Wikipedia, apcr on a :

ϕ(pk1)kpk1k(C(logk+loglogp)+1)\frac{\phi(p^k-1)}{kp^k}\ge \frac{1}{k(C(\log k+\log\log p)+1)}

Donc en gros tout à l’heure notre proba était de l’ordre de 1/k1/k, maintenant de l’ordre de 1/klogk1/k \log k, donc il faudra juste un facteur logk\log k en plus pour ré-obtenir une probabilité constante d’avoir un polynôme primitif (ce qui est plus fort qu’irréductible).

Mais effectivement, ce que tu dis marche tout à fait (et il y a même des cas où c’est plus intéressant de faire comme tu dis).

mais je vais jeter un coup d’œil au papier de J.M. COUVEIGNES et R. LERCIER, qui s’il tient ses promesses a l’air très intéressant

Bonne chance, il a pas l’air facile ^^

+1 -0

D’acc je vois, c’est carrément intéressant pour le coup (dans les deux sens du terme) !

En revanche, je comprends l’intérêt si l’on se contente d’un groupe multiplicatif (multiplication aisée, inverse trouvable facilement, …), mais si l’on veut ajouter l’addition, on n’a pas d’autre choix que de stocker l’entièreté du corps en mémoire non ? Sinon, comment obtenir la représentation multiplicative des Xi+1X^i + 1 ? Ou plus exactement, sans parler de stocker tout le corps, il faut tout de même le parcourir dans le pire des cas en entier pour trouver la représentation des Xi+1X^i + 1 non ? J’entends par là calculer XiX^i modulo PP pour tout 1ipk11\leqslant i\leqslant p^{k}-1 modulo PP jusqu’à trouver toutes les représentations des 1+Xj1 + X^j. Avec ça, on pourrait tout de même avoir une addition terme à terme en gardant la représentation multiplicative (c’est déjà ça :p ).

Dans ce cas, cela serait utile lorsque pkp^k est "raisonnable" (inférieur à 2642^{64} pour tous les calculer) mais il faudrait mieux utiliser des éléments de Fp[X]/P\mathbb{F}_p[X]_{/P} dans le cas contraire. C’est bien cela ?

+0 -0

Oui c’est ça, je pense que t’as tout compris. Après on rentre très vite dans des questions d’implémentation, donc on peut débattre que telle ou telle méthode est meilleure pendant des heures (la taille du corps par rapport au nombre d’opérations que tu comptes faire, si tu veux construire une surcouche de primitives arithmétiques par-dessus, etc.). BTW, apparemment ce qu’on a appelé représentation multiplicative a un nom : la représentation en logarithme de Zech.

Un autre truc qu’on a pas abordé, c’est qu’on peut aussi essayer de chercher en priorité des polynômes irréductibles "sparse" (avec peu de coefficients non nuls) pour que les opérations avec la représentation additive soient rapides (notamment le modulo PP dans la multiplication). Par exemple, ici ils construisent des opérations de corps super rapides dans le cas particulier des optimal extension fields, qui sont les corps de cardinal pkp^kpp est un nombre premier "pseudo-Mersenne" et il existe un polynôme irréductible de la forme XkxFp[X]X^k-x\in \mathbf{F}_p[X] (là c’est un cas très favorable : on a un truc super sparse, avec seulement deux coefficients non nuls).

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte