diff --git a/src/rewrite1/hamming_code.py b/src/rewrite1/hamming_code.py new file mode 100644 index 0000000..8627518 --- /dev/null +++ b/src/rewrite1/hamming_code.py @@ -0,0 +1,42 @@ +from math import ceil, log2 + + +def hamming_encrypt(data): + x_count = 0 + y = [] + index = 0 + while index < x_count + len(data): + if index + 1 == 2 ** x_count: + y.append(-1) + x_count += 1 + else: + y.append(data[index - x_count]) + index += 1 + matrix = [] + for i in range(1, index + 1): + matrix.append(bin(i)[2:].zfill(x_count)) + row_number = 0 + for i in range(index): + if y[i] == -1: + summ = 0 + for j in range(index): + if y[j] >= 0: + summ = summ + y[j] * int(matrix[j][x_count - row_number - 1]) + y[i] = summ % 2 + row_number += 1 + return y + +def check_decrypt(data): + length = len(data) + x_count = ceil(log2(length + 1)) + matrix = [bin(i)[2:].zfill(x_count) for i in range(1, length + 1)] + x_bits = [] + for row in range(x_count): + s = 0 + for j in range(length): + s += data[j] * int(matrix[j][x_count - row - 1]) + x_bits.append(s % 2) + error_pos = 0 + for k, bit in enumerate(x_bits): + error_pos += bit * (2 ** k) + return error_pos diff --git a/src/rewrite1/tests.py b/src/rewrite1/tests.py new file mode 100644 index 0000000..5f44d4a --- /dev/null +++ b/src/rewrite1/tests.py @@ -0,0 +1,5 @@ +from hamming_code import hamming_encrypt + + +def test_encrption(): + assert hamming_encrypt((0, 1, 1, 0, 1, 1, 0, 1)) == [0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1] diff --git a/src/rewrite1/walker_scheme.py b/src/rewrite1/walker_scheme.py new file mode 100644 index 0000000..e635c6c --- /dev/null +++ b/src/rewrite1/walker_scheme.py @@ -0,0 +1,42 @@ +from random import randint + + +class SchemeWalker: + def __init__(self, distribution_law: list[tuple]): + self.n = len(distribution_law) + self.table = [None] * self.n + small, big = [], [] + names = [name for name, i in distribution_law] + probs = [p * self.n for i, p in distribution_law] + for i, p in enumerate(probs): + if p < 1: + small.append(i) + else: + big.append(i) + while small and big: + s = small.pop() + b = big.pop() + self.table[s] = { + "donor": names[s], + "recepient": names[b], + "barrier": probs[s] + } + probs[b] -= (1 - probs[s]) + if probs[b] < 1: + small.append(b) + else: + big.append(b) + for i in small + big: + self.table[i] = { + "donor": names[i], + "recepient": names[i], + "barrier": 1 + } + print(self.table) + + def get_random(self): + x = randint(0, 1) + row = self.table[int(x * self.n)] + if x <= row["barrier"]: + return row["donor"] + return row["recepient"]