Advertisement
csmine

TP 7 (Info) (Z / 2Z, Hamming)

Mar 22nd, 2019
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.25 KB | None | 0 0
  1. from math import *
  2. from copy import deepcopy
  3. from random import *
  4. #from fractions import Fraction
  5.  
  6. class Matrice:
  7.     def __init__(self,Coeff) :
  8.         self.Coeff = Coeff
  9.        
  10.     def __repr__(self):
  11.         chaine=""
  12.         for i in range(0,len(self.Coeff)):
  13.             chaine+="("+" "
  14.             for k in self.Coeff[i]:
  15.                 chaine+=str(k)+" "
  16.             chaine+=")"+"\n"
  17.         return(chaine)
  18.     def NL(self):
  19.         return(len(self.Coeff))
  20.     def NC(self):
  21.         return(len(self.Coeff[0]))
  22.     def trace(self):
  23.         somme=0
  24.         for i in range(min(self.NL(),self.NC())):
  25.             somme+=self.Coeff[i][i]
  26.         return(somme)
  27.        
  28.     def __eq__(self,Mat2):
  29.         if len(self.Coeff)==len(Mat2.Coeff):
  30.             for i in range(0,len(self.Coeff)):
  31.                 if self.Coeff[i]!=Mat2.Coeff[i]:
  32.                     return(False)
  33.             return(True)
  34.         else:
  35.             return(False)
  36.            
  37.     def __add__(self,Mat2):
  38.         if (self.NL() == Mat2.NL()) and (self.NC() == Mat2.NC()):
  39.             A=[]
  40.             for x in range(self.NL()):
  41.                 A.append([])
  42.                 for y in range(self.NC()):
  43.                     A[x].append(self.Coeff[x][y]+Mat2.Coeff[x][y])
  44.             return(Matrice(A))
  45.     def __sub__(self,Mat2):
  46.         if (self.NL() == Mat2.NL()) and (self.NC() == Mat2.NC()):
  47.             A=[]
  48.             for x in range(self.NL()):
  49.                 A.append([])
  50.                 for y in range(self.NC()):
  51.                     A[x].append(self.Coeff[x][y]-Mat2.Coeff[x][y])
  52.             return(Matrice(A))
  53.    
  54.     def __mul__(self,Mat2):
  55.         if type(Mat2)!=Matrice:
  56.             return(Mat2*self)
  57.         if self.NC() == Mat2.NL():
  58.             A=[]
  59.             """for numero in range(0,Mat2.NC()):
  60.                A.append([])
  61.                for ligne1 in range(0,self.NL()):
  62.                    if type(self.Coeff[0][0])==int:
  63.                        somme=0
  64.                    else:
  65.                        somme=F2(0)
  66.                    for colonne1 in range(0,self.NC()):
  67.                        somme+=self.Coeff[numero][colonne1] * Mat2.Coeff[colonne1][ligne1]
  68.                    A[numero].append(somme)"""
  69.                    
  70.             for i in range(0,self.NL()):
  71.                 A.append([])
  72.                 for j in range(0,Mat2.NC()):
  73.                     somme=self.Coeff[i][0]*Mat2.Coeff[0][j]
  74.                     for k in range(1,self.NC()):
  75.                         somme+=self.Coeff[i][k]*Mat2.Coeff[k][j]
  76.                     A[i].append(somme)
  77.             return(Matrice(A))
  78.         else:
  79.             return("error")
  80.                
  81.     def __rmul__(self,reel):
  82.         A=self.Coeff[:]
  83.         for x in range(self.NL()):
  84.             for y in range(self.NC()):
  85.                 A[x][y]*=reel
  86.         return(Matrice(A))
  87.    
  88.    
  89.     def puissance(self,n):
  90.         if self.NL()==self.NC():
  91.             if n!=0:
  92.                 Mat=self
  93.                 for i in range(1,n):
  94.                     self=self*Mat
  95.                 return(self)
  96.             else:
  97.                 self=0*self
  98.                 for x in range(self.NL()):
  99.                     self.Coeff[x][x]=1
  100.                 return(self)
  101.  
  102.     def transpo(self):
  103.             A=[]
  104.             for i in range(0,self.NC()):
  105.                 A.append([])
  106.                 for j in range(0,self.NL()):
  107.                     A[i].append(self.Coeff[j][i])
  108.             return(Matrice(A))
  109.  
  110. def m_frac(liste):
  111.     for k in liste:
  112.         for i in range(len(k)):
  113.             k[i]=F2(k[i])
  114.     return(Matrice(liste))
  115.    
  116. class F2 :
  117.     def __init__(self,value):
  118.         self.value = value%2
  119.    
  120.     def __repr__(self):
  121.         return(str(self.value))
  122.        
  123.     def __add__(self, b):
  124.         return(F2((self.value + b.value)%2))
  125.    
  126.     def __mul__(self,b):
  127.         return(F2(self.value*b.value))
  128.        
  129.     def __eq__(self,b):
  130.         return(self.value==b.value)
  131.        
  132. def to_binaire(nbr):
  133.     L=""
  134.     a=nbr
  135.     while a!=0:
  136.         L=str(a%2)+L
  137.         a= a//2
  138.     return(L)
  139.    
  140. def to_nombre(bin):
  141.     nbr=0
  142.     i=len(bin)-1
  143.     for k in range(0,len(bin)):
  144.         nbr+=int(bin[k])*2**(i)
  145.         i=i-1
  146.     return(nbr)
  147.  
  148. def decoupage(texte,n):
  149.     L=[]
  150.     for c in texte:
  151.         s=bin(ord(c))[2:].zfill(8)
  152.         for b in s:
  153.             L.append(F2(int(b)))
  154.     def bloc2column(li):
  155.         Li=[]
  156.         for x in li:
  157.             Li.append([x])
  158.         return(Matrice(Li))
  159.     R=[]
  160.     l=len(L)
  161.     k=0
  162.     while k+n<=l:
  163.         bloc=L[k:k+n]
  164.         R.append(bloc2column(bloc))
  165.         k+=n
  166.     if k<l:
  167.         bloc=L[k:]+[F2(0)]*(k+n-l)
  168.         R.append(bloc2column(bloc))
  169.     return(R)
  170.    
  171.  
  172. def coefficients_join(liste):
  173.     nbr=""
  174.     for element in liste:
  175.         nbr+=element[0]
  176.     return(nbr)
  177.  
  178. def reconstitution(liste,n):
  179.     L=[]
  180.     for mat in liste:
  181.         co=mat.Coeff
  182.         for ligne in co:
  183.             L.append(str(ligne[0]))
  184.     R=[]
  185.     l=len(L)
  186.     k=0
  187.     while k+8<=l:
  188.         bloc=L[k:k+8]
  189.         R.append(chr(int("".join(bloc),2)))
  190.         k+=8
  191.     return("".join(R))
  192.  
  193.  
  194.  
  195. # Ne marche que pour k=4
  196. def ik_hamming47():
  197.     k=4
  198.     I=[]
  199.     for i in range(1,k+1):
  200.         I.append([0]*k)
  201.     I=I+[[1,1,1,0],[1,1,0,1],[1,0,1,1]]
  202.     I=Matrice(I)
  203.     for i in range(0,k):
  204.         I.Coeff[i][i]=1
  205.     coefficients_transform(I)
  206.     return(I)
  207.  
  208. def coefficients_transform(matrice):
  209.    
  210.     for k in range(0,matrice.NL()):
  211.         for i in range(0,matrice.NC()):
  212.             matrice.Coeff[k][i]=F2( int( matrice.Coeff[k][i]) )
  213.     return(matrice)
  214.  
  215.  
  216. def CodageHamming(m):
  217.  
  218.     G=Matrice([[F2(1),F2(1),F2(1),F2(0)],[F2(1),F2(1),F2(0),F2(1)],[F2(1),F2(0),F2(1),F2(1)]])
  219.    
  220.    
  221.     return(Matrice(m.Coeff + (G*m).Coeff))
  222.  
  223.  
  224. def MotHamming(M):
  225.     return( (M.Coeff[4][0] == M.Coeff[0][0] + M.Coeff[1][0] + M.Coeff[2][0]) and (M.Coeff[5][0] == M.Coeff[0][0] + M.Coeff[1][0] + M.Coeff[3][0]) and (M.Coeff[6][0] == M.Coeff[0][0] + M.Coeff[2][0] + M.Coeff[3][0]))
  226.  
  227.  
  228. def DecodageHamming(M):
  229.     if MotHamming(M):
  230.         a=Matrice(M.Coeff[0:4])
  231.         return(a)
  232.     else:
  233.         return(Matrice(Plus_Petite_Difference(M).Coeff[0:4]))
  234.    
  235. # donne toutes les matrices qui vérifient la relation de Hamming
  236. def Liste_aux_Hamming():
  237.     L = []
  238.     for i in range(0,2):
  239.         for j in range(0,2):
  240.             for k in range(0,2):
  241.                 for l in range(0,2):
  242.                     L.append(CodageHamming(Matrice([[F2(i)],[F2(j)],[F2(k)],[F2(l)]])))
  243.     return(L)
  244.  
  245. def Differences_Hamming(A,B):
  246.     difference=0
  247.     for i in range(0,7):
  248.         if A.Coeff[i][0] != B.Coeff[i][0]:
  249.             difference+=1
  250.     return(difference)
  251.  
  252. def Plus_Petite_Difference(A):
  253.     best=7
  254.     L=[]
  255.     ListeHamming=Liste_aux_Hamming()
  256.     for element in ListeHamming:
  257.         dif=Differences_Hamming(A,element)
  258.         if dif<best:
  259.             best=dif
  260.             a=element
  261.         elif dif==best:
  262.             L.append([element,dif])
  263.     #print("best différence :",best)
  264.     return(a)
  265.  
  266.  
  267. def Random_Errors_Into_Liste_of_Matrice(liste,proba):
  268.    
  269.    
  270.     for element in liste:
  271.         L=[randint(0,100),randint(0,100),randint(0,100),randint(0,100),randint(0,100),randint(0,100),randint(0,100)]
  272.        
  273.         if L[0]<proba :
  274.             element.Coeff[0][0]+=F2(1)
  275.         if L[1]<proba :
  276.             element.Coeff[1][0]+=F2(1)
  277.         if L[2]<proba :
  278.             element.Coeff[2][0]+=F2(1)
  279.         if L[3]<proba :
  280.             element.Coeff[3][0]+=F2(1)
  281.         if L[4]<proba :
  282.             element.Coeff[4][0]+=F2(1)
  283.         if L[5]<proba :
  284.             element.Coeff[5][0]+=F2(1)
  285.         if L[6]<proba :
  286.             element.Coeff[6][0]+=F2(1)
  287.        
  288.     return(liste)
  289.  
  290.  
  291. def JouerAvecHamming(proba,texte=""):
  292.     if texte=="":
  293.         userinput=str(input("Entrez un message \n>"))
  294.     else:
  295.         userinput=texte
  296.    
  297.     Liste_Message=decoupage(userinput,4)
  298.     L=[]
  299.     for element in Liste_Message:
  300.         L.append(CodageHamming(element))
  301.     # L_initial=deepcopy(L)
  302.     L2=Random_Errors_Into_Liste_of_Matrice(L,proba)
  303.    
  304.     templist1=[]
  305.     for element in L2:
  306.         templist1.append(Matrice(element.Coeff[0:4]))
  307.     premier_troncage=reconstitution(templist1,4)
  308.    
  309.     templist2=[]
  310.     for element in L2:
  311.         templist2.append(Matrice(DecodageHamming(element).Coeff[0:4]))
  312.     deuxieme_troncage=reconstitution(templist2,4)
  313.     print("Premier troncage naif: ",premier_troncage,"\nDeuxieme troncage decodé : ",deuxieme_troncage)
  314.    
  315.  
  316.  
  317. M=CodageHamming(decoupage("0",4)[0])
  318. #A=coefficients_transform(decoupage("A",4)[0])
  319. #A = F2(3)
  320. #B = F2(4)
  321.  
  322. G=Matrice([[F2(1),F2(1),F2(1),F2(0)],[F2(1),F2(1),F2(0),F2(1)],[F2(1),F2(0),F2(1),F2(1)]])
  323. #G=m_frac(G)
  324.  
  325. X=Matrice([[1,3,5,1],[2,4,6,1],[4,5,8,7]])
  326. #X=m_frac(X)
  327.  
  328. Texte="Alors Jesus levant les yeux sur ces disciples dit : heureux, vous qui êtes pauvre car le royaume de Dieu est à vous. Heureux vous qui avez faim maintenant car vous serez rassasiés. Heureux vous qui pleurez maintenant car vous serez dans la joie. Heureux serez vous lorsque les hommes vous haïrons lorsquon vous chassera, vous outrageras et quon rejetera votre nom comme infame. A cause du fils de lhomme, rejouiseez vous en ce jour là et tresaillez dallegresse car votre recompense sera grande dans le ciel."
  329.  
  330. Texte2="Avancez, Lysandre. Et celui-ci, mon gracieux duc, a ensorcelé le coeur de mon enfant. C.est toi, c.est toi, Lysandre, qui lui as donné des vers et qui as échangé avec ma fille des gages d.amour. Tu as, à la clarté de la lune, chanté sous sa fenêtre, avec une voix trompeuse, des vers d.un amour trompeur : tu as surpris son imagination avec des bracelets de tes cheveux, avec des bagues, des bijoux, des hochets, des colifichets, des bouquets, des friandises, messagers d.un ascendant puissant sur la tendre jeunesse ! Tu as dérobé avec adresse le coeur de ma fille, et changé l.obéissance qu.elle doit à son père en un âpre entêtement. Ainsi, gracieux duc, dans le cas où elle oserait refuser ici devant Votre Altesse de consentir à épouser Démétrius, je réclame l.ancien privilége d.Athènes. Comme elle est à moi, je puis disposer d.elle ; et ce sera pour la livrer à ce jeune homme ou à la mort, en vertu de notre loi"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement