Retour à la barre de navigation
Retour à la barre de navigation
Pour travailler avec des polynômes à coefficients dans ce corps fini, vous pouvez utiliser la représentation symbolique habituelle ou dense expliquée ci-dessus. Par exemple rem(g*x^3+g^5*x^2+g*x,g*x+g^2) ou rem([g,g^5,g,0],[g,g^2]) calcule le reste d'un polynôme de degré 3 par un polynôme de degre 1 à coefficients dans le corps G (donnés par ordre décroissant dans le 2ème cas).
La version actuelle de Xcas ne permet pas de factoriser un polynôme
à coefficients dans un corps de Galois, on peut toutefois
utiliser la fonction factorff de PARI, par exemple
pari("factorff",x^2+a^2,5,a^4+2)
factorise le polynôme x^2+a^2 modulo 5 où a a pour polynôme minimal
a^4+2 (il n'existe pas encore de fonction réalisant de conversion
automatique des GF de Xcas vers les arguments de la fonction
factorff de PARI).
Le résultat est une matrice, dont chaque ligne contient un facteur
et sa puissance. Le facteur est un polynôme en x à coefficients
dans le corps de Galois représenté polynomialement par un Mod
(dont le 2ème argument est le polynôme minimal).
Retour à la barre de navigation
sort de Xcas utilise la fonction sort de
la STL (C++ Standard Template Library). La complexité est garantie
en O(N log(N)). Une recherche sur google de
algorithmes de tri donne d'excellentes références...
Earlier versions of sort used the quicksort algorithm
(C. A. R. Hoare, Comp. J. 5, 1962),
using a pivot chosen by median of three (R. C. Singleton, CACM 12, 1969).
Quicksort has O(N log(N)) average complexity, but quadratic
worst-case complexity. See section 5.2.2 of Knuth for a discussion.
(D. E. Knuth, The Art of Computer Programming. Volume 3: Sorting and
Searching. Addison-Wesley, 1975.) The current implementation of sort,
however, uses the introsort algorithm (D. R. Musser,
"Introspective Sorting and Selection Algorithms",
Software Practice and Experience 27(8):983, 1997.)
whose worst case complexity is O(N log(N)).
Introsort is very similar to median-of-three quicksort, and
is at least as fast as quicksort on average.
En gros, on combine un quicksort avec choix du pivot median parmi 3,
et si le niveau de récursivité est plus grand
que k log(n), on passe par exemple au tri tas.
Une façon plus simple de trier en temps O(N log(N)) consiste à faire un
algorithme récursif (divide and conquer):
si la taille de la liste est 0 ou 1 on la laisse
inchangée, si c'est 2 on modifie l'ordre si nécessaire, sinon
on copie la première moitié que l'on trie (par appel récursif), puis
la deuxième moitié que l'on trie (par appel récursif), puis on
fusionne les deux listes triées par parcours (un index dans chaque
liste, on copie depuis et on avance dans la liste dont l'élément est le
plus petit). Il n'est pas évident de tester les temps de calcul
de ce type d'algorithme avec un langage interprété d'autant qu'on
ne connait pas forcément la facon dont sont implémentés les conteneurs
listes (ainsi en Xcas, une affectation de type l[i]:=
crée une nouvelle copie de la liste l et a donc un temps
d'exécution proportionnel à la taille de la liste, il faut utiliser
=< pour affecter par référence).
En langage compilé, voici une implémentation (tri de
liste d'entiers aléatoires) en C++ fusion
et tas.
Retour à la barre de navigation
Retour à la barre de navigation
La fonction spline calcule des spline naturelle
(cf. la doc). Voici comment Xcas la calcule
sur un exemple de spline cubique naturelle (donc de degré 3), on se
donne 2 listes d'abscisses x0 à xn et d'ordonnées y0 à yn,
et deux liste d'inconnues à déterminer z[0], ..., z[n-1]
(les coefficients dominants des polynômes sur chaque intervalle)
et f la valeur de la dérivée première en x0 (la dérivée
seconde est nulle aux extrémités pour une spline naturelle).
La spline est donnée en x0 par le polynôme
P=z[0]*(x-x0)^3+f*(x-x0) + y0 soit [z[0],0,f,y0]
en représentation liste avec comme origine x0.
On change d'origine, ce qui revient à calculer le développement de
Taylor de P en x1. Il ne faut pas utiliser la fonction taylor
(qui suppose une représentation symbolique des polynômes)
mais la fonction ptayl, par exemple si x0=1 et
x1=4, ptayl([z[0],0,f,y0],3) ou plusieurs applications
de l'algorithme de Horner avec quotient
(cf. menu Exemples->poly->horner.xws, la fonction
hornerl(l,a) renvoie la valeur du polynôme l en a
et le quotient de l par x-a). En répétant Horner avec
le quotient précédent on obtiendra
les coefficient de (x-a) et de (x-a)^2, ici il faut prendre a=x1-x0).
On doit trouver y1 comme valeur si x=x1, ce qui donne une première
condition pour le système linéaire. La régularité de la spline en x1
impose qu'elle a le même développement
de Taylor au-delà de x1, sauf pour le coefficient dominant qui devient
z[1], il suffit donc de changer le premier coefficient dans la liste
représentant le polynôme. On change à nouveau d'origine de x1 à x2
(on applique à nouveau hornerl trois fois mais avec a=x2-x1)
et on obtient une 2ème équation (la valeur en x2 doit être y2).
On continue jusqu'à atteindre xn, où l'on aura comme dans
la boucle, l'équation valeur en xn doit être yn, et en plus l'équation
dérivée seconde nulle (donc le résultat de la 3ème évaluation
de hornerl avec a=xn-xn-1 doit etre nul).
On obtient ainsi un système de n+1 équations en n+1 inconnues
(z[0],..., z[n-1],f),
il ne reste alors qu'à le résoudre avec linsolve.
Références: la doc en ligne de Xcas (Manuel->Algorithmes de calcul formel),
le livre de Demailly,
sur le web, le chapitre 2 du cours d'Analyse numérique
de Ernst Hairer
Exemple (cf. aussi le manuel décrivant
la transformée de Fourier discrète, section Où interviennent ces
sommes), multiplication de polynômes listes
(à coefficients flottants) en temps O(N log(N)).
On ajoute des zéros pour obtenir une liste de taille la puissance de 2
strictement supérieure au degré du produit au deux polynômes, on fait
la fft de chacun puis on multiplie coefficient par coefficient
et on effectue la ifft du résultat, on compare avec le produit
des 2 polynômes. Par exemple
P:=[1,2,1,2,0,0,0,0]; Q:=[1,0,1,2,0,0,0,0] ;
p:=fft(P); q:=fft(Q);
ifft(p .* q);
poly1[1,2,1,2]*poly1[1,0,1,2]
Voir aussi Karatsuba et par FFT sur C et
FFT sur Z/nZ .
Retour à la barre de navigation
Retour à la barre de navigation
Retour à la barre de navigation
Liste des session Xcas
(c) B. Parisse, 2007.
Si vous utilisez des données originales de cette page, je vous
remercie de faire pointer un lien hypertexte vers cette page, afin
que d'autres puissent la trouver plus facilement
en utilisant un moteur de recherche.
Conditions d'utilisation:
La diffusion et l'utilisation des données
de cette page est autorisée dans un but non commercial et vaut
acceptation de ces conditions d'utilisation.
Ces données sont fournies sans garantie aucune,
le détenteur du copyright ne pourra en aucun cas être poursuivi pour
quelque dommage que ce soit suite à l'utilisation des données
ci-dessus, y compris s'il en a été averti.