Exemplo n.º 1
0
 def __init__(self, p, n):
     """
     Constructs a BCH code with the
     specified parameters.
     :param p: a parameter of a
     binary symmetric channel,
     the error probability.
     :param n: length of a code.
     """
     t, n, k, power = initiate(p=p, n=n)
     self.t = t
     self.n = n
     self.k = k
     self.power = power
     primitive_polynomial = get_primitive_polynomial(power=power, k=1)
     cyclotomic_cosets = get_cyclotomic_cosets(power=power)
     logarithmic_table = build_logarithmic_table(
         power=power, primitive_polynomial=primitive_polynomial)
     generator_polynomial = calculate_generator_polynomial(
         primitive_polynomial=primitive_polynomial,
         cyclotomic_cosets=cyclotomic_cosets,
         logarithmic_table=logarithmic_table,
         power=power,
         t=t)
     self.primitive_polynomial = primitive_polynomial
     self.cyclotomic_cosets = cyclotomic_cosets
     self.logarithmic_table = logarithmic_table
     self.generator_polynomial = generator_polynomial
     print()
     print("t: {0}".format(t))
     print("n: {0}".format(n))
     print("k: {0}".format(k))
     print("Generator polynomial: {0:b}".format(generator_polynomial))
Exemplo n.º 2
0
 def test_decode(self):
     power = 4
     t = 2
     primitive_polynomial = 0b10011
     cyclotomic_cosets = get_cyclotomic_cosets(power=power)
     logarithmic_table = build_logarithmic_table(
         power=power, primitive_polynomial=primitive_polynomial)
     generator_polynomial = calculate_generator_polynomial(
         primitive_polynomial=primitive_polynomial,
         cyclotomic_cosets=cyclotomic_cosets,
         logarithmic_table=logarithmic_table,
         power=power,
         t=t)
     count = 0
     for i in range(10):
         error_vector = get_random_number_of_hamming_weight(
             length=2**power - 1, weight=t)
         for message in range(2**(2**power - 1 - power * t)):
             codeword = encode(generator_polynomial=generator_polynomial,
                               message=message,
                               power=power,
                               t=t)
             received_message = codeword ^ error_vector
             decoded = decode(primitive_polynomial=primitive_polynomial,
                              received_message=received_message,
                              cyclotomic_cosets=cyclotomic_cosets,
                              logarithmic_table=logarithmic_table,
                              power=power,
                              t=t)
             if decoded != message:
                 count += 1
     assert count == 0
Exemplo n.º 3
0
 def test_get_cyclotomic_cosets(self):
     power = 8
     result = 0
     counter = 0
     for i in get_cyclotomic_cosets(power=power):
         result ^= i
         counter += 1
     result ^= 1
     assert result == 2 ** (2 ** power - 1) - 1
     assert counter >= power
Exemplo n.º 4
0
 def test_calculate_generator_polynomial(self):
     primitive_polynomial = get_primitive_polynomial(power=self.power, k=1)
     cyclotomic_cosets = get_cyclotomic_cosets(power=self.power)
     logarithmic_table = build_logarithmic_table(
         power=self.power, primitive_polynomial=primitive_polynomial)
     generator_polynomial = calculate_generator_polynomial(
         primitive_polynomial=primitive_polynomial,
         cyclotomic_cosets=cyclotomic_cosets,
         logarithmic_table=logarithmic_table,
         power=self.power,
         t=self.t)
     assert generator_polynomial == 0b111010001
Exemplo n.º 5
0
 def test_get_syndromes(self):
     power = 5
     t = 3
     primitive_polynomial = 0b100101
     received_message = 0b100101000000001
     cyclotomic_cosets = get_cyclotomic_cosets(power=power)
     logarithmic_table = build_logarithmic_table(
         power=power, primitive_polynomial=primitive_polynomial)
     syndromes = get_syndromes(primitive_polynomial=primitive_polynomial,
                               received_message=received_message,
                               cyclotomic_cosets=cyclotomic_cosets,
                               logarithmic_table=logarithmic_table,
                               power=power,
                               t=t)
     assert syndromes == [0, 0, 29, 0, 23, 27]
Exemplo n.º 6
0
 def test_berlekamp_massey_decode(self):
     power = 4
     t = 2
     primitive_polynomial = 0b10011
     received_message = 0b000011001100011
     cyclotomic_cosets = get_cyclotomic_cosets(power=power)
     logarithmic_table = build_logarithmic_table(
         power=power, primitive_polynomial=primitive_polynomial)
     syndromes = get_syndromes(primitive_polynomial=primitive_polynomial,
                               received_message=received_message,
                               cyclotomic_cosets=cyclotomic_cosets,
                               logarithmic_table=logarithmic_table,
                               power=power,
                               t=t)
     assert berlekamp_massey_decode(syndromes=syndromes,
                                    logarithmic_table=logarithmic_table,
                                    power=power,
                                    t=t) == [0, 2, 14, -1, -1]
Exemplo n.º 7
0
 def test_get_polynomial_from_roots(self):
     power = 4
     assert get_polynomial_from_roots(
         roots=get_cyclotomic_cosets(power)[1],
         power=power,
         logarithmic_table=build_logarithmic_table(power, 0b10011)) == 0b11111