!set titb=Utilisation de Pari
!set keyw=
!set datm=20040609
!set prev=
!set next=
!set upbl=main
!set dat1=19000101
!set dat2=24000101


!if $wims_read_parm!=$empty
 !goto $wims_read_parm
!endif
!exit

:content

!read primitives.phtml 1, 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

!read primitives.phtml 2, tool, module=tool/directexec 
.
Pour entrer ensuite les programmes dans WIMS, deux solutions pour les variables 
qui sont déjà définies &#58; soit vous rajoutez un   \ devant toutes ces variables, soit 
vous commencez par les redéfinir au début du programme PARI. 
<p>
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.
<p>
On peut trouver
<a href="http&#58;//pari.math.u-bordeaux.fr/dochtml/html.stable/" target=wims_external>ici</a> les commandes en ligne.
<p>
<h4>Matrices et algèbre linéaire &#58; Création de matrice dans GP/Pari</h4> 
<p>
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>
<p>
Les manipulations algébriques se font très simplement avec 
les opérateurs standards &#58; <tt class = "c">A + B, A*B, A^n</tt>. 
Pour les autres commandes, voir la carte de référence. 
<p>
<h4>Utilisation avec wims</h4>
<pre class = "cc">
  $m_integer$m_lbrac n = $m_randint(3<tt class="w">..</tt>4) $m_rbrac
  $m_text$m_lbrac A = $m_pari(n = \n; M = matrix(n,n,i,j, i + j);
      N = matrix(n,n,i,j,i^j); print(N*M)) $m_rbrac
  $m_matrix$m_lbrac M = 1,2,3
    0,1,2
    0,1,3 $m_rbrac
  $m_text$m_lbrac B = $m_pari(M = Mat([\M]); print(M^2)) $m_rbrac
  $m_statement$m_lbrac  A = &#91; \A&#93 ; B = &#91; \B&#93; $m_rbrac </pre>
<p>
<div class = "aide">Pour 
!insmath A
, on définit deux matrices 
!insmath M
 et 
!insmath N
 et on calcule leur produit de manière totalement interne à Pari/GP. 
Pour 
!insmath B
, on définit une matrice dans WIMS, puis on calcule son carré avec Pari/GP. 
<p>
L'avantage de la formulation pour 
!insmath 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 
!insmath C
, on fait appel à une matrice 
!insmath M
 complètement
définie dans WIMS. </div>
<p>
<pre class = "cc">
  $m_integer$m_lbrac n = $m_randint(3<tt class="w">..</tt>4) $m_rbrac
  $m_text$m_lbrac A = $m_pari(n = \n; M = matrix(n,n,i,j, i + j) ;  
     print(mateigen(M))) $m_rbrac
  $m_text$m_lbrac B = $m_pari(M = matrix(\n,\n,i,j, i + j);
     print(mateigen(M))) $m_rbrac
  $m_matrix$m_lbrac M = 1,2,3
   0,1,2
   0,1,3 $m_rbrac
  $m_text$m_lbrac C = $m_pari(print(mateigen(Mat([\M])))) $m_rbrac
  $m_statement$m_lbrac A = &#91; \A&#93 ; B = &#91; \B&#93; $m_rbrac </pre>
<p>
<div class = "aide">Au sujet de <tt class = "c">print</tt> &#58; Il n'est plus nécessaire de le mettre dans les versions $m_geq 3.22. Par contre, si on veut sortir plusieurs résultats à la fois, c'est nécessaire. 
</div>
<p>
<pre class = "cc">
  $m_text$m_lbrac n = $m_randint(3<tt class="w">..</tt>156) $m_rbrac
  $m_text$m_lbrac m = $m_randint(3<tt class="w">..</tt>156) $m_rbrac
  $m_text$m_lbrac A = $m_pari(a = divrem(\n,\m); b = divrem(\m,\n);
    print(a,",,"b)) $m_rbrac
  $m_text$m_lbrac B =  $m_pari(a  =  divrem(\n, \m) ; print(a~)) $m_rbrac
  $m_text$m_lbrac C = \B[1] $m_rbrac
  $m_statement$m_lbrac A = \A
    &lt;p>
     B = \B
    &lt;p>
     C  = \C
    &lt;p> $m_rbrac </pre>
<p>
<div class = "aide">Attention aux matrices lorsqu'on passe de WIMS à PARI &#58; 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 $m_geq 3.32)
D'autre part, faire attention &#58; 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 &#58;<tt class = "c"> mattranspose</tt> ou <tt class = "c"> ~</tt> 
</pre>
</div>
<p>
<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 &#58;
<pre class="cc">
 $m_text$m_lbrac a = random(0,1) $m_rbrac
  $m_integer$m_lbrac b = randint(10<tt class="w">..</tt>100) $m_rbrac
  $m_text$m_lbrac N = pari((f(n) = local(m) ; m = if(n == 0, n, factor(\b)));f(\a)) $m_rbrac
  $m_text$m_lbrac a = random(0,1) $m_rbrac
  $m_integer$m_lbrac b = randint(10<tt class="w">..</tt>100) $m_rbrac
  $m_text$m_lbrac N = pari((f(n) = local(m) ; m = if(n == 0, n, factor(\b))); f(\a)) $m_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">
 $m_text$m_lbrac A = pari(print(matrix(4,5,i,j,random&#92;(257)))) $m_rbrac </pre> 

