\embed{definition}{&nbsp;}L'utilisation des logiciels de calcul formel augmente les
possibilités de WIMS. Mais ce n'est pas toujours facile à déboguer. 
On recommande de tester d'abord les programmes directement dans PARI/GP 
sur votre machine si cela vous est possible ou à travers
\tool{module=tool/directexec}.
Pour entrer ensuite les programmes dans WIMS, deux solutions pour les variables 
qui sont déjà définies : soit vous rajoutez un   \\ devant toutes ces variables, soit 
vous commencez par les redéfinir au début du programme PARI. 

Il y a bien sûr des possibilités plus "professionnelles" de GP/Pari. Nous décrivons
 seulement ici quelques fonctions complétant WIMS (voir la carte de référence), 
 un exemple de programme et leur interface avec WIMS ainsi que quelques pièges.

On peut trouver
<a href="http://pari.math.u-bordeaux.fr/dochtml/html.stable/" target=wims_external>ici</a> les commandes en ligne.


<h4>Matrices et algèbre linéaire : Création de matrice dans GP/Pari</h4> 

Une matrice peut être rentrée simplement par 
<tt class = "c">M = [1,2,3;4,5,6]</tt>. Lorsqu'il n'y a pas de points virgules, Pari/GP l'interprète comme vecteur. Aussi, vaut-il mieux écrire
<tt class = "c">M = Mat([1,2,3;4,5,6])</tt>. 
On peut aussi la créer de manière non extensive par 
<tt class = "c">M = matrix(n,m,i,j, expression en i et j )</tt>
ou encore 
<tt class = "c">M = matrix(3,2); M[1,2] = 9; M[1,1] = 5</tt>

Les manipulations algébriques se font très simplement avec 
les opérateurs standards : <tt class = "c">A + B, A*B, A^n</tt>. 
Pour les autres commandes, voir la carte de référence. 

<h4>Utilisation avec wims</h4>
<pre class = "cc">
  \integer\lbrac n = \randint(3<tt class="w">..</tt>4) \rbrac
  \text\lbrac A = \pari(n = \\n; M = matrix(n,n,i,j, i + j);
      N = matrix(n,n,i,j,i^j); print(N*M)) \rbrac
  \matrix\lbrac M = 1,2,3
    0,1,2
    0,1,3 \rbrac
  \text\lbrac B = \pari(M = Mat([\\M]); print(M^2)) \rbrac
  \statement\lbrac  A = &#91; \\A&#93 ; B = &#91; \\B&#93; \rbrac </pre>

<div class = "aide">Pour \(A), on définit deux matrices \(M) et \(N) et on calcule leur produit de manière totalement interne à Pari/GP. 
Pour \(B), on définit une matrice dans WIMS, puis on calcule son carré avec Pari/GP. 

L'avantage de la formulation pour \(A) est que le programme PARI peut être collé tel quel une fois qu'on l'a testé dans GP et rajouté la définition de <tt class = "c"> n</tt> défini en dehors de Pari/GP. Pour \(C), on fait appel à une matrice \(M) complètement
définie dans WIMS. </div>

<pre class = "cc">
  \integer\lbrac n = \randint(3<tt class="w">..</tt>4) \rbrac
  \text\lbrac A = \pari(n = \\n; M = matrix(n,n,i,j, i + j) ;  
     print(mateigen(M))) \rbrac
  \text\lbrac B = \pari(M = matrix(\\n,\\n,i,j, i + j);
     print(mateigen(M))) \rbrac
  \matrix\lbrac M = 1,2,3
   0,1,2
   0,1,3 \rbrac
  \text\lbrac C = \pari(print(mateigen(Mat([\\M])))) \rbrac
  \statement\lbrac A = &#91; \\A&#93 ; B = &#91; \\B&#93; \rbrac </pre>

<div class = "aide">Au sujet de <tt class = "c">print</tt> : Il n'est plus nécessaire de le mettre dans les versions \geq 3.22. Par contre, si on veut sortir plusieurs résultats à la fois, c'est nécessaire. 
</div>

<pre class = "cc">
  \text\lbrac n = \randint(3<tt class="w">..</tt>156) \rbrac
  \text\lbrac m = \randint(3<tt class="w">..</tt>156) \rbrac
  \text\lbrac A = \pari(a = divrem(\\n,\\m); b = divrem(\\m,\\n);
    print(a,",,"b)) \rbrac
  \text\lbrac B =  \pari(a  =  divrem(\\n, \\m) ; print(a~)) \rbrac
  \text\lbrac C = \\B[1] \rbrac
  \statement\lbrac A = \\A
    &lt;p>
     B = \\B
    &lt;p>
     C  = \\C
    &lt;p> \rbrac </pre>

<div class = "aide">Attention aux matrices lorsqu'on passe de WIMS à PARI : Une matrice dans WIMS est en fait du type
1,2,3;1,4,5 . 
Une matrice dans PARI est &#91;1,2,3;1,4,5&#93; ou mieux
<pre class = "cc">
  Mat(&#91;1,2,3;1,4,5&#93;)
</pre>
Ne pas oublier les crochets.
Dans le sens inverse (PARI-> WIMS), WIMS les enlève automatiquement 
sauf s'il y a deux matrices (version \geq 3.32)
D'autre part, faire attention : lorsque la réponse de pari/GP est un vecteur 
comme dans le cas précédent, 
c'est un vecteur colonne. Il est alors repris tel quel dans wims. Donc pour le transformer 
en vecteur ligne, 
utiliser la transposition :<tt class = "c"> mattranspose</tt> ou <tt class = "c"> ~</tt> 
</pre>
</div>

<h4>Programme auxiliaire dans PARI/GP</h4>
Il est possible d'entrer un programme PARI/GP  à condition de le mettre entre parenthèses  et de le réutiliser un peu plus tard :
<pre class="cc">
 \text\lbrac a = random(0,1) \rbrac
  \integer\lbrac b = randint(10<tt class="w">..</tt>100) \rbrac
  \text\lbrac N = pari((f(n) = local(m) ; m = if(n == 0, n, factor(\\b)));f(\\a)) \rbrac
  \text\lbrac a = random(0,1) \rbrac
  \integer\lbrac b = randint(10<tt class="w">..</tt>100) \rbrac
  \text\lbrac N = pari((f(n) = local(m) ; m = if(n == 0, n, factor(\\b))); f(\\a)) \rbrac </pre>
</pre><div class="aide">renvoie la factorisation de <tt class="d">\\b</tt> si un nombre pris au hasard <tt class="d">a = \\a</tt> ne vaut pas 0 et 0 sinon.
</div>
<h4>Avancé</h4>
La commande <tt class="c">random </tt> de PARI/GP étant incompatible avec celle de WIMS, on écrit <tt class="c"> random&#92;(125) </tt>
Dans ce cas, la commande <tt class="c">random</tt> est envoyée à PARI/GP sans être interprétée mais  le <tt class="c">\\</tt>est retiré.
<pre class="cc">
 \text\lbrac A = pari(print(matrix(4,5,i,j,random&#92;(257)))) \rbrac </pre> 
