A=matrix([[4,2,2,-3,-1],[-1,1,-5,3,4],[2,4,-8,3,7]]).transpose();show('matrice des coordonnées de u,v,w : A=',A)l=fsmith(A)print;J=transf(A,l);show('réduite de Smith de A :',J)ll=[oforoinlifo[0]%2==0]definv(o):#cf corr int2n=len(o)ifn==0:return(o)else:ifo[n-1][0]in[3,4]:op=o[n-1]else:op=o[n-1][:3]+[-o[n-1][3]]return([op]+inv(o[:n-1]))print'll=',showop(ll)print'llinv=',showop(inv(ll))P=transf(matrix.identity(5),ll)Pinv=transf(matrix.identity(5),inv(ll))show('test P*Pinv=',P*Pinv)print;show('Pinv=',Pinv)show('base de F:',Pinv[:,0],Pinv[:,1])show('base de Im(A):',J[0,0]*Pinv[:,0],J[1,1]*Pinv[:,1])show('coordonnées de (1,-1,-11,6,9) dans la base donnée de F ?',transf(matrix([[1,-1,-11,6,9]]).transpose(),ll))print('(1,-1,-11,6,9) n\'est pas engendré par les deux premières colonnes de Pinv donc n\'est pas dans F')show('coordonnées de (1,1,-1,0,1) dans la base donnée de F:',transf(matrix([[1,1,-1,0,1]]).transpose(),ll))
coordonnées de (1,-1,-11,6,9) dans la base donnée de F ?
(1,-1,-11,6,9) n'est pas engendré par les deux premières colonnes de Pinv donc n'est pas dans F
coordonnées de (1,1,-1,0,1) dans la base donnée de F:
Fontions prédéfinies
defshowop(o):# affichage d'une liste d'opérationsl=""foropino:ifop[0]==1:l=l+"C"+str(op[1])+" + "+str(op[3])+"C"+str(op[2])+" → C"+str(op[1])+"\n"elifop[0]==2:l=l+'L'+str(op[1])+' + '+str(op[3])+'*L'+str(op[2])+' → L'+str(op[1])+"\n"elifop[0]==3:l=l+'C'+str(op[1])+" ↔ C"+str(op[2])+"\n"elifop[0]==4:l=l+'L'+str(op[1])+" ↔ L"+str(op[2])+"\n"return(l)
importcopy#B=copy.deepcopy(A)deftransf(A,o):#transformation d'une matrice A suivant la liste d'opération oB=copy.deepcopy(A)#sinon A est modifiéforopino:ifop[0]==1:B[:,op[1]-1]=B[:,op[1]-1]+op[3]*B[:,op[2]-1]elifop[0]==2:B[op[1]-1,:]=B[op[1]-1,:]+op[3]*B[op[2]-1,:]elifop[0]==3:C=B[:,op[1]-1];B[:,op[1]-1]=B[:,op[2]-1];B[:,op[2]-1]=Celifop[0]==4:L=B[op[1]-1,:];B[op[1]-1,:]=B[op[2]-1,:];B[op[2]-1,:]=Lreturn(B)
deffsmith(M,verif=false):A=copy.deepcopy(M)#sinon M est modifiéifverif:show(A)p=A.nrows();q=A.ncols()L=[abs(A[i][j])foriinrange(p)forjinrange(q)]ifp*q==0ormax(L)==0:#print([]);return([])else:a=min(L[i]foriinrange(p*q)ifL[i]!=0)k=L.index(a);i0=k//q;j0=k%q;a=A[i0][j0]#a avec signel=[iforiinrange(p*q)ifL[i]%a!=0]ifverif:print'(verif) min,position =',[a,i0,j0]#verififl==[]:#pivot suivant ao=[[1,j+1,j0+1,-A[i0][j]/a]forjin[0..q-1]ifj!=j0]\+[[2,i+1,i0+1,-A[i][j0]/a]foriin[0..p-1]ifi!=i0]ifj0!=0:o=o+[[3,1,j0+1]]ifi0!=0:o=o+[[4,1,i0+1]]ifverif:print'(verif) pivot',showop(o);show(transf(A,o))return(o+[[op[0],1+op[1],1+op[2]]+op[3:]foropinfsmith(transf(A,o).submatrix(1,1),verif)])# else:#vers l'apparition du pgcd des coeff de A comme coeff de Ak=min(l);i1=k//q;j1=k%q;b=A[i1][j1]ifverif:print'(verif) coef non multiple de min, position =',[b,i1,j1]ifA[i0][j1]%a!=0:o=[[1,j1+1,j0+1,-(A[i0][j1]//a)]]elifA[i1][j0]%a!=0:o=[[2,i1+1,i0+1,-(A[i1][j0]//a)]]else:o=[[2,i1+1,i0+1,-(A[i1][j0]//a)],[2,i0+1,i1+1,1],\[1,j1+1,j0+1,-(((1-A[i1][j0]//a)*A[i0][j1]+b)//a)]]# Il y a une erreur [2,i0,i1,1] dans TP-smith-corr et dans int2 qui si elle n'est pas corrigée conduit à une réponse fausse pour l'ex6ifverif:print'(verif) vers pgcd',showop(o);show(transf(A,o))return(o+fsmith(transf(A,o),verif))