 |
Apprendre Maple Site dédié au logiciel de calcul formel Maple
|
Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
mbm
Inscrit le: 31 Mar 2007 Messages: 7
|
Posté le: 22 Avr 2007 16:50 Sujet du message: aidez moi pour que le procedure Gauss donne des bonne result |
|
|
je remarque que mon procedure Gauss retourne des resultats errones et je essier des les resoudre vous pouver m'aidez s'il vous plais?
voiala le procedure:
*************************************************************
> Euclide:=proc(a,b)
local r , u,v, q, i, u0, u1, v0, v1, r0, r1;
r0:=a; r1:=b; u0:=1; u1:=0; v0:=0; v1:=1;
while r1<>0 do q:=iquo(r0,r1);
r:=r0-r1*q; u:=u0-u1*q; v:=v0-v1*q;
r0:=r1; r1:=r; u0:=u1; u1:=u; v0:=v1; v1:=v; end do; [r0,u0,v0]
end proc:
> gauss:=proc(A,p)
local n,i,j,piv,s,d,l,B,x,ipiv,k, eu,c,sgn;
n:=linalg[coldim](A); d:=1; B:=map(x->x mod p, evalm(A));sgn:=1;
for i to n do j:=i; piv:=B[j,i] mod p;
while piv=0 and j<n do j:=j+1; piv:=B[j,i] mod p end do ;
if piv=0 then return(0) else d:=d*piv;
for k from i to n do c:=B[i,k]; B[i,k]:=B[j,k]; B[j,k]:=c;
sgn:=-1*sgn; end do;
eu:=Euclide(piv,p);
if piv < 0 then do
ipiv:=-eu[2] mod p; end do;
else
ipiv:=eu[2] mod p; end if;
for k from j+1 to n do l:=B[k,i]*ipiv mod p;
for s from i to n do B[k,s]:=B[k,s]-l*B[i,s] end do ; end do;
end if ; end do; sgn*d mod p ; end proc:
> |
|
Revenir en haut de page |
|
 |
prof_simplet
Inscrit le: 12 Sep 2006 Messages: 86
|
Posté le: 23 Avr 2007 8:28 Sujet du message: |
|
|
Bonjour,
Déjà vous devriez expliquer ce que vous cherchiez à faire par ces procédures.
Si j'ai bien compris, la première , Euclide, retourne [r0,u0,v0] où r0=pgcd(a,b) et (u0,v0) est une solution de l'équation ax+by=pgcd(a,b).
Si a et b ne sont pas premiers enre eux, on obtient u0=0 v0=1 ou u0=1 v0=0. Donc tout semble correct dans Euclide.
Pour la deuxième, pourriez-vous expliquer votre démarche?
La fonction préexistante de Maple
Gausselim(A) mod p
doit faire le même travail, non? |
|
Revenir en haut de page |
|
 |
mbm
Inscrit le: 31 Mar 2007 Messages: 7
|
Posté le: 23 Avr 2007 12:56 Sujet du message: se que je veut que le prosedure gauss donne |
|
|
je veut que gauss me calcule le determinant d'une matice modulo des entiers premieres.
j'espere que vous pouvez m'aidez . |
|
Revenir en haut de page |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 24 Avr 2007 10:09 Sujet du message: |
|
|
Bonjour, j'ai modifié quelque peu la seconde procédure en normalisant la ligne concernée lorsque piv<>0: on multiplie toute la ligne par 1/piv mod p de façon à faire apparaitre un 1 en diagonale.
Ainsi la matrice B obtenue est triangulaire supérieure, son déterminant modulo p est le produit des termes diagonaux.
La procédure donne pour résultat la liste [B,det(B]] c'est à dire [evalm(B),product(B[h,h],h=1..n)]
On peut vérifier la matrice B obtenue avec le résultat donné par la procédure préexistante Gausselim(A) mod p; de Maple.
Ca semble maintenant correctement fonctionner: le vérifier plus en détail sur des matrices générées aléatoirement:
> A:=linalg[randmatrix](4,4); u:=rand(1..20): p:=nextprime(u()); gauss(A,p); Gausselim(A) mod p;
Code: |
> Euclide:=proc(a,b)
> local r , u,v, q, i, u0, u1, v0, v1, r0, r1;
> r0:=a; r1:=b; u0:=1; u1:=0; v0:=0; v1:=1;
> while r1<>0 do q:=iquo(r0,r1);
> r:=r0-r1*q; u:=u0-u1*q; v:=v0-v1*q;
> r0:=r1; r1:=r; u0:=u1; u1:=u; v0:=v1; v1:=v; end do; [r0,u0,v0]
> end proc:
> Euclide(17,12);
[1, 5, -7]
> gauss:=proc(A,p)
> local n,i,j,piv,s,l,B,x,ipiv,k,eu,c;
> n:=linalg[coldim](A);
> B:=map(x->x mod p, evalm(A));
> for i to n do
> j:=i;
> piv:=B[j,i] mod p;
> while piv=0 and j<n do
> j:=j+1; piv:=B[j,i] mod p
> end do ;
> if piv=0 then return [evalm(B),0] else
> for k to n do B[j,k]:=B[j,k]* (1/piv mod p): B[j,k]:=B[j,k] mod p end do:
> piv:=B[j,i]:
> for k from i to n do
> c:=B[i,k]; B[i,k]:=B[j,k]; B[j,k]:=c;
> end do;
> eu:=Euclide(piv,p);
> if piv < 0 then ipiv:=-eu[2] mod p else ipiv:=eu[2] mod p end if;
> for k from j+1 to n do
> l:=B[k,i]*ipiv mod p;
> for s from i to n do
> B[k,s]:=B[k,s]-l*B[i,s]:
> B[k,s]:=B[k,s] mod p
> end do;
> end do;
> end if ;
> end do;
> [evalm(B),product(B[h,h],h=1..n)]
> end proc:
>
> A:=matrix([[7,4,3,1,5],[0,7,2,-5,11],[-1,6,2,6,2],[5,-9,12,5,3],[-9,12,1,2,0]]);
[ 7 4 3 1 5]
[ ]
[ 0 7 2 -5 11]
[ ]
A := [-1 6 2 6 2]
[ ]
[ 5 -9 12 5 3]
[ ]
[-9 12 1 2 0]
> p:=7: gauss(A,p);
[1 1 5 1 5]
[ ]
[0 1 6 2 3]
[ ]
[[0 0 1 1 2], 1]
[ ]
[0 0 0 1 3]
[ ]
[0 0 0 0 1]
> Gausselim(A) mod p;
[1 1 5 1 5]
[ ]
[0 1 6 2 3]
[ ]
[0 0 1 1 2]
[ ]
[0 0 0 1 3]
[ ]
[0 0 0 0 1]
> A:=linalg[randmatrix](4,4); u:=rand(1..20): p:=nextprime(u()); gauss(A,p); Gausselim(A) mod p;
[-75 58 -15 60]
[ ]
[ 17 26 94 -23]
A := [ ]
[ 53 -23 -38 -70]
[ ]
[ 69 37 92 -96]
p := 17
[1 16 7 6]
[ ]
[0 1 1 5]
[[ ], 1]
[0 0 1 2]
[ ]
[0 0 0 1]
[1 16 7 6]
[ ]
[0 1 1 5]
[ ]
[0 0 1 2]
[ ]
[0 0 0 1]
|
A plus tard. |
|
Revenir en haut de page |
|
 |
mbm
Inscrit le: 31 Mar 2007 Messages: 7
|
Posté le: 27 Avr 2007 18:42 Sujet du message: |
|
|
merci de la reponse se bien marche |
|
Revenir en haut de page |
|
 |
|
|
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum
|

Développé par phpBB © 2001, 2006 phpBB Group
Traduction par : phpBB-fr.com
Apprendre Maple - ©
- Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.
|