Внедрение QM-кодирования в Python - обязательное 16-битное слово?

Я пытаюсь внедрить QM-кодирование в образовательных целях. Мой главный ресурс - глава 5.11 из "Справочника по сжатию данных", 5-е издание. Это моя грубая реализация кодировщика:

def _encode_bit(self, bit):
    if bit == self._lps:
        self._code_lps()
    else:
        self._code_mps()

def _code_mps(self):
    self._a = self._a - self._q_e()
    if self._a < 0x8000:
        self._switch_intervals_if_needed()
        self._renormalize()
        self._p_table.next_mps()

def _code_lps(self):
    self._c = self._c + self._a - self._q_e()
    self._a = self._q_e()
    self._switch_intervals_if_needed()
    self._renormalize()
    self._p_table.next_lps()

def _renormalize(self):
    while self._a < 0x8000:
        #C < 0,5 (0xFFFF / 3)
        if self._c < 0x5555:
            b = 0
            d = 0
        else:
            b = 1
            d = 0x5555
        self._write_bit(b)
        logger.debug("Written '%i' to output", b)
        #C = 2 * (C - D)
        self._c = (self._c - d) << 1
        #A = 2 * A
        self._a <<= 1

Я сопоставляю интервал с целыми числами, так как он должен быть более эффективным, насколько я понимаю. В книге упоминается, что для сопоставления используется 16-битное слово, но поскольку я делаю это в Python, я не уверен, не применяет ли 16-разрядную длину всех переменных. Проблема в том, что когда я запускаю свой кодер, C (self._c в коде), который должен указывать на нижнюю часть интервала MPS, если я понимаю, что он правильно переполняет более 16 бит длиной очень быстро, и его значение становится очень большим, Из-за этого закодированные биты в основном представляют собой только строку символов LPS. Должен ли я каким-то образом применять переменную длину? Или есть другая проблема в моем коде? Я потратил несколько дней на это, пытаясь понять, что пошло не так...

Ответы

Ответ 1

В любой форме арифметического сжатия (например, QM) необходимо оставаться в пределах максимально допустимых бит (в этом случае 16), иначе у вас возникнут всевозможные проблемы. Эти проблемы включают ошибки округления, потому что в теории вам может понадобиться бесконечная точность. Сам алгоритм округляется, когда это необходимо, и выполняет перенормировку для максимального использования диапазона бит. Ответ на ваш вопрос: "Да".