Skip to content

Commit

Permalink
SMZKS first kab
Browse files Browse the repository at this point in the history
  • Loading branch information
SenchaBrest committed Sep 17, 2024
1 parent 36e4bf4 commit b3bfda2
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 0 deletions.
49 changes: 49 additions & 0 deletions SMZKS/LABA1/classic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from functools import reduce


def calculate_ctrl_sum(lst, r):
return list(
f"{reduce(lambda x, y: x ^ y, (i + 1 for i, x in enumerate(lst) if x == '1')):0{r}b}"
)


def invert_element(lst, index):
lst[index] = str(int(lst[index]) ^ 1)
return lst


M = 200
r = 5

M_binary_str = f"{M:b}"
M_lst = list(M_binary_str)
print(f"M:{M}, r:{r}\n{M_lst}")

while 2 ** r > len(M_lst) + r:
r -= 1
r += 1

for p in range(r):
M_lst.insert(2 ** p - 1, '')

print(M_lst)
ctrl_sum1 = calculate_ctrl_sum(M_lst, r)[::-1]
print(ctrl_sum1)
M_lst = [ctrl_sum1.pop(0) if elem == '' and ctrl_sum1 else elem for elem in M_lst]
print(M_lst, end='\n\n')


ctrl_sum2 = calculate_ctrl_sum(M_lst, r)
print(ctrl_sum2)
print(M_lst, end='\n\n')

index = 5
M_lst = invert_element(M_lst, index)
print(M_lst)
control_sum3 = calculate_ctrl_sum(M_lst, r)
print(control_sum3)
error_index = int(''.join(control_sum3), 2) - 1
print(f"error index:{error_index}")
M_lst = invert_element(M_lst, error_index)
print(M_lst)

91 changes: 91 additions & 0 deletions SMZKS/LABA1/extended.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
def invert_element(lst, index):
"""Инвертирует элемент списка по указанному индексу (0 -> 1, 1 -> 0)."""
lst[index] = str(int(lst[index]) ^ 1)
return lst


# Исходные данные
M = 202 # Число для кодирования
r = 4 # Начальное значение для вычисления количества проверочных бит

# Преобразуем число M в двоичную строку длиной до 7 бит
M_binary_str = f"{M:b}"[:7]
M_lst = list(M_binary_str)
print("M в двоичной системе :", M_lst)

# Определение минимального количества проверочных бит
while 2 ** r > len(M_lst) + r:
r -= 1
r += 1

# Добавляем проверочные биты на позиции 2^p - 1
for p in range(r):
M_lst.insert(2 ** p - 1, '0')

print("M с проверочными битами :", M_lst)

# Рассчитываем позиции для проверки (перекрытие битов для каждого проверочного бита)
C_overlaps = [
[
j for i in range(2 ** k, len(M_lst) + 1, 2 ** (k + 1))
for j in range(i, i + 2 ** k) if j < len(M_lst) + 1
]
for k in range(r)
]
print("Перекрывающиеся позиции :", C_overlaps)

# Вычисляем значения проверочных битов
C = [
sum([int(M_lst[i - 1]) for i in C_overlaps[j]]) % 2
for j in range(r)
]
print("Значения проверочных битов :", C)

# Записываем проверочные биты на соответствующие позиции
for p in range(r):
M_lst[2 ** p - 1] = str(C[p])

print("M после установки битов :", M_lst)

# Инвертируем один бит для моделирования ошибки
M_lst = invert_element(M_lst, 5)
M_lst = invert_element(M_lst, 3)

print("M после инверсии (ошибка) :", M_lst)

# Проверка кодов Хемминга
CC = [
str(sum([int(M_lst[i - 1]) for i in C_overlaps[j]]) % 2)
for j in range(r)
]
print("Пересчитанные проверочные :", CC)

# Определение индекса ошибки
error_index = int(''.join(CC), 2) - 1
print("Найденный индекс ошибки :", error_index)

# Исправляем ошибку
M_lst = invert_element(M_lst, error_index)
print("M после исправления ошибки :", M_lst)

# Пересчитываем проверочные биты после исправления
CC = [
str(sum([int(M_lst[i - 1]) for i in C_overlaps[j]]) % 2)
for j in range(r)
]

error_index = int(''.join(CC), 2) - 1
print("Индекс ошибки после проверки:", error_index, "Проверочные биты:", CC)

# # Исправляем ошибку
# M_lst = invert_element(M_lst, error_index)
# print("M после исправления ошибки :", M_lst)
#
# # Пересчитываем проверочные биты после исправления
# CC = [
# str(sum([int(M_lst[i - 1]) for i in C_overlaps[j]]) % 2)
# for j in range(r)
# ]
#
# error_index = int(''.join(CC), 2) - 1
# print("Индекс ошибки после проверки:", error_index, "Проверочные биты:", CC)

0 comments on commit b3bfda2

Please sign in to comment.