import galois as ga import random p = primtal = 29 m = blocklängd = 3 n = kodordslängd = 4 F = ga.GF(primtal) #Vår talmängd generator_matris = F([[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 1]]) #Bör vara en n x m-matris meddelande = "hej" # Funktioner: def block(primtal, blocklängd): #Ger en lista av alla vektorer i (ℤ/(p))ᵐ list_new = [] if blocklängd == 0: return [[]] list_old = block(primtal, blocklängd - 1) for i in list_old: for j in range(primtal): list_new.append(i + [j]) return list_new #print(block(3,5)) def kod(generator_matris ): #Ger en lista av alla vektorer i koden från en generator matris return [generator_matris @ F(i) for i in block(primtal, blocklängd)] def visa_kod(generator_matris): for i in kod(generator_matris): print(i) #print(kod(generator_matris)) def text_till_vektor( text): # Omvandlar text med bokstäver till ett element i (ℤ/(p))ᵐ return F([ord(bokstav) - 97 for bokstav in text]) def vektor_till_text(vektor): # Omvandlar ett element i (ℤ/(p))ᵐ till text text = "" for i in vektor: text = text + chr(int(i) + 97) return text def fel(meddelande, antal_fel): #Skapar ett slummässigt antal fel i meddelandet for i in range(antal_fel): x = random.randint(0, len(meddelande) - 1) meddelande[x] = F([random.randint(0, primtal - 1)]) return meddelande def ordvektor_till_kodordvektor(ordvektor): kodordvektor = generator_matris @ ordvektor return kodordvektor def kodordvektor_till_ordvektor(kodordvektor): for i in block(primtal, blocklängd): if ((generator_matris @ F(i)) == kodordvektor).all(): return F(i) def hamming_avstånd(kodordvektor1, kodordvektor2): count = 0 for i in range(len(kodordvektor1)): if kodordvektor1[i] != kodordvektor2[i]: count = count + 1 return count def separation(generator_matris): noll=[0 for i in generator_matris] avstånd = [ hamming_avstånd(noll, kodordsvektor) for kodordsvektor in kod(generator_matris) ] avstånd.remove(0) return min(avstånd)