Alors que je me promenais sur la page consacrée à sa classe de MPSI, je suis tombé sur un petit document de PB présentant brièvement le langage Python pour faire des calculs sur ordinateur… Ça m’a rappelé (avec émotion je dois avouer) mes débuts en programmation, lorsque je faisais des programmes php pour calculer la suite de Fibonnaci, factoriser un nombre, etc.
Je voulais donc profiter de ce message pour vous présenter un fabuleux système de calcul formel, PARI/GP, qui est principalement utilisé en théorie des nombres mais qui contient beaucoup de fonctions utiles en mathématiques. De plus, il est libre et distribué selon les termes de la licence publique générale GNU. Il est développé par des français de l’université de Bordeaux I.
PARI/GP est avant tout destiné aux théoriciens des nombres, mais peut-être utilisé avec profit dans d’autres cas (algèbre linéaire, arithmétique, etc.). Il est composé de deux parties :
- PARI : bibliothèque écrite en C, mais qui peut-être appelée d’un langage haut niveau (Python, C++, Perl, etc.)
- gp : interface en ligne de commande permettant l’accès aux fonctions de PARI. Le langage utilisé ressemble à du C.
Les calculs sont effectués en précision arbitraire. Il est également très utilisé en cryptologie (vérification qu’un nombre est premier via l’algorithme AKS, calculs sur les courbes elliptiques, algorithme LLL, etc.). En revanche, ses capacités d’intégration et de dérivation sont moins efficaces que des logiciels de calcul formel comme Xcas, Maple ou Mathematica. Il a également une fonction « graphique » qui me semble limitée (mais j’avoue ne pas avoir regardé si il y avait une possibilité d’interaction avec gnuplot ou autre.).
Mieux que de faire encore de nombreux discours, voici quelques exemples d’utilisation. Dans votre terminal, tapez gp pour accéder à l’interface GP pour PARI.
« Hello World » en PARI/GP
Dans tous les langages de programmation, on commence par une telle application, donc je ne déroge pas à la règle:
print("Hello World")
Aucune difficulté, aucun commentaire.
Une boucle en PARI/GP
Montrons la syntaxe d’une boucle for :
for(i=0, 5, print(i))
Ceci affiche les entiers de 0 à 5 à la ligne.
Pour avoir de l’aide sur une fonction, on peut taper ?for et on obtient :
for(X=a,b,seq): the sequence is evaluated, X going from a up to b.
De même, lorsque l’on cherche une fonction dont on ne connaît pas exactement le nom, on peut chercher avec trois points d’interrogations. Exemple :
???matker
retourne
bnfsignunit idealintersect matinverseimage matker
matkerint
Calcul avec des nombres premiers
La fonction isprime est une fonction déterministe (via l’algorithme AKS) qui détermine si un nombre est premier. Jusquà 500 bits de longueur, le calcul est encore rapide pour la primalité :
isprime(2^(501)-1)
retourne 1 en 310 ms environ (pour obtenir le temps de calcul, taper ## après votre dernière opération), alors qu’il met plus de 5 secondes pour un nombre premier de 1024 bits.
D’ailleurs une manière facile d’obtenir un nombre premier aléatoire est d’utiliser la fonction nextprime qui donne le nombre premier qui suit l’argument donné. Par exemple
nextprime(2^(1024)+random(2^(1024)-1))
renvoit le nombre
179769313486231590782518276703737196373630355166285016700028966421710165488969543617
6526889863117584648152455111700332203590123411794386808044158416082415271352025604694004045
5111003982745778025452513076910528815189617790566856810276323839016028883085338806026638240
6524494940761227538110799658431716130780389
qui est un nombre premier de 1024 bits.
Calculs matriciels
On peut faire facilement avec PARI/GP de l’algèbre linéaire. Par exemple :
C=matid(5); C[1,3]=9; C[2,5]=6; b=[1,2,0,1,1];
ne renvoit rien (à cause des ;) mais a bien enregistré la matrice C que l’on peut afficher :
[1 0 5 0 0]
[0 1 0 0 6]
[0 0 1 0 0]
[0 0 0 1 0]
[0 0 0 0 1]
et le vecteur b.
On peut alors demander de résoudre l’équation d’inconnue
:
a=matsolve(C, b~)
qui renvoit
[1, -4, 0, 1, 1]~
Et on peut vérifier par
C*a-b~
qui renvoit bien le vecteur nul.
Notez que le signe ~ représente la transposition, et que PARI/GP différentie les vecteurs colonnes et lignes. On peut également accéder à la première ligne de la matrice C[1,] ou sa cinquième colonne C[,5].
Procédures en PARI/GP
On peut bien évidemment faire plusieurs opérations en même temps avec des procédures. Par exemple, on peut mettre le code suivant dans un fichier chiffres.gp (dans le dossier où vous êtes avec le terminal, ou on lui donne l’adresse complète)
Chiffres(d,l,n)=
{
local(i,m,v);
if(type(d) != "t_INT" || d <= 0, print("d doit être un entier strictement positif"); return([]));
if(type(l) != "t_INT" || l <= 0, print("l doit être un entier strictement positif"); return([]));
if(type(n) != "t_INT" || n < 0, print("n doit être un entier positif"); return([]));
m=n;
v=vector(l);
for(i=0, l-1, v[l-i]=m%d; m=floor(m/d););
return(v)
}
et demander à PARI/GP de lire ce fichier :
\r chiffres.gp
Il suffira ensuite d'appeler
Chiffres(3, 4, 28)
pour obtenir dans un vecteur de taille 4, la décomposition de 28 en base 3. Autrement dit,
[1, 0, 0, 1]
Finalement, ces exemples reflètent que peu la puissance de PARI/GP que je vous encourage à découvrir sur le site officiel, et qui est un formidable outil qui peut être très utile. Bien entendu vous pouvez calculer dans des corps finis, sur , manipuler des polynômes, des fractions rationnelles, les corps de nombres, les fonctions de Bessel, etc.)



