Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions src/rewrite1/hamming_code.py
Original file line number Diff line number Diff line change
@@ -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
5 changes: 5 additions & 0 deletions src/rewrite1/tests.py
Original file line number Diff line number Diff line change
@@ -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]
42 changes: 42 additions & 0 deletions src/rewrite1/walker_scheme.py
Original file line number Diff line number Diff line change
@@ -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"]