From ba9a8526d331db742ed5c6368706257be681767b Mon Sep 17 00:00:00 2001 From: Max Ipatov Date: Mon, 15 Dec 2025 15:04:33 +0300 Subject: [PATCH 1/6] Hamming encryption --- src/rewrite1/hamming_code.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/rewrite1/hamming_code.py diff --git a/src/rewrite1/hamming_code.py b/src/rewrite1/hamming_code.py new file mode 100644 index 0000000..1a471c2 --- /dev/null +++ b/src/rewrite1/hamming_code.py @@ -0,0 +1,29 @@ +from math import log2, ceil + +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 + + + From 6f03191bf86b8e33da101c3fe43bdb77acd4f4dc Mon Sep 17 00:00:00 2001 From: Max Ipatov Date: Mon, 15 Dec 2025 15:08:21 +0300 Subject: [PATCH 2/6] Hamming decryption --- src/rewrite1/hamming_code.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/rewrite1/hamming_code.py b/src/rewrite1/hamming_code.py index 1a471c2..28d576f 100644 --- a/src/rewrite1/hamming_code.py +++ b/src/rewrite1/hamming_code.py @@ -25,5 +25,17 @@ def hamming_encrypt(data): 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 \ No newline at end of file From 36f762b39c8ad52549e260ef303543e4386179f1 Mon Sep 17 00:00:00 2001 From: Max Ipatov Date: Mon, 15 Dec 2025 15:24:48 +0300 Subject: [PATCH 3/6] Walker scheme --- src/rewrite1/walker_scheme.py | 42 +++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/rewrite1/walker_scheme.py diff --git a/src/rewrite1/walker_scheme.py b/src/rewrite1/walker_scheme.py new file mode 100644 index 0000000..3fb5571 --- /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 + similar_p = 1 / 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 < similar_p: + 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 + } + + def get_random(self): + x = randint(0, 1) + row = self.table[int(x * self.n)] + if x <= row["barrier"]: + return row["donor"] + else: + return row["recepient"] \ No newline at end of file From bc6078348dd12d963ff9b4a909b68e6608fa5341 Mon Sep 17 00:00:00 2001 From: Max Ipatov Date: Mon, 15 Dec 2025 15:27:08 +0300 Subject: [PATCH 4/6] Test hamming --- src/rewrite1/tests.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/rewrite1/tests.py diff --git a/src/rewrite1/tests.py b/src/rewrite1/tests.py new file mode 100644 index 0000000..e65bce7 --- /dev/null +++ b/src/rewrite1/tests.py @@ -0,0 +1,4 @@ +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] \ No newline at end of file From c71b19f3ddcf32f4e0e069e25fc65e5381a3b3f4 Mon Sep 17 00:00:00 2001 From: Max Ipatov Date: Mon, 15 Dec 2025 15:32:37 +0300 Subject: [PATCH 5/6] Fix linter error --- src/rewrite1/hamming_code.py | 5 +++-- src/rewrite1/tests.py | 3 ++- src/rewrite1/walker_scheme.py | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/rewrite1/hamming_code.py b/src/rewrite1/hamming_code.py index 28d576f..8627518 100644 --- a/src/rewrite1/hamming_code.py +++ b/src/rewrite1/hamming_code.py @@ -1,4 +1,5 @@ -from math import log2, ceil +from math import ceil, log2 + def hamming_encrypt(data): x_count = 0 @@ -38,4 +39,4 @@ def check_decrypt(data): error_pos = 0 for k, bit in enumerate(x_bits): error_pos += bit * (2 ** k) - return error_pos \ No newline at end of file + return error_pos diff --git a/src/rewrite1/tests.py b/src/rewrite1/tests.py index e65bce7..5f44d4a 100644 --- a/src/rewrite1/tests.py +++ b/src/rewrite1/tests.py @@ -1,4 +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] \ No newline at end of file + 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 index 3fb5571..6cb8477 100644 --- a/src/rewrite1/walker_scheme.py +++ b/src/rewrite1/walker_scheme.py @@ -1,5 +1,6 @@ from random import randint + class SchemeWalker: def __init__(self, distribution_law: list[tuple]): self.n = len(distribution_law) @@ -38,5 +39,4 @@ def get_random(self): row = self.table[int(x * self.n)] if x <= row["barrier"]: return row["donor"] - else: - return row["recepient"] \ No newline at end of file + return row["recepient"] From cc41b9105729e2ffb2443d49f7f6c9f63ee530c5 Mon Sep 17 00:00:00 2001 From: Max Ipatov Date: Mon, 15 Dec 2025 15:38:27 +0300 Subject: [PATCH 6/6] Fix walker scheme init --- src/rewrite1/walker_scheme.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rewrite1/walker_scheme.py b/src/rewrite1/walker_scheme.py index 6cb8477..e635c6c 100644 --- a/src/rewrite1/walker_scheme.py +++ b/src/rewrite1/walker_scheme.py @@ -5,12 +5,11 @@ class SchemeWalker: def __init__(self, distribution_law: list[tuple]): self.n = len(distribution_law) self.table = [None] * self.n - similar_p = 1 / 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 < similar_p: + if p < 1: small.append(i) else: big.append(i) @@ -33,6 +32,7 @@ def __init__(self, distribution_law: list[tuple]): "recepient": names[i], "barrier": 1 } + print(self.table) def get_random(self): x = randint(0, 1)