Nhập môn mật mã dựa trên mã sửa sai
===================================

.. prf:definition:: Block code
    :label: def-block-code

    **Block code** :math:`(n)_q` là tập hợp 
    :math:`\mathcal{C}` bất kì chứa các vector độ dài 
    :math:`n` trên trường :math:`\mathbb{F}_q`.

.. prf:definition:: Codeword
    :label: def-codeword

    **Codeword** (hay **từ mã**) là bất kì vector nào trong block code 
    :math:`\mathcal{C}`.

.. prf:definition:: Lực lượng của code
    :label: def-card-code
    
    **Lực lượng** (hay **cardinality**) :math:`M` của block code
    :math:`\mathcal{C}` là số lượng codeword trong :math:`\mathcal{C}`. 
    
    Kí hiệu :math:`M = \lvert C \rvert`.

.. prf:definition:: Mã :math:`(n,M)_q`
    :label: def-nm-code
    
    Block code :math:`\mathcal{C}` trên trường :math:`\mathbb{F}_q` 
    có độ dài :math:`n` và có lực lượng :math:`M` được gọi là 
    :math:`(n, M)_q` code.

.. prf:definition:: Độ dài của code
    :label: def-len-code
    
    Độ dài của :math:`(n)_q` code :math:`\mathcal{C}` là số :math:`n` 
    chỉ độ dài mỗi codeword (độ dài mỗi vector).

.. prf:definition:: Khoảng cách tối thiểu
    :label: def-min-dist

    **Khoảng cách tối thiểu** (hay **minimum distance**) 
    của code :math:`\mathcal{C}` là số :math:`d` chỉ 
    khoảng cách Hamming nhỏ nhất giữa hai codeword trong 
    code :math:`\mathcal{C}`:

    .. math:: 
        
        d = \min_{\bm{u}, \bm{v} \in \mathcal{C}, \bm{u} \neq \bm{v}} \rho(\bm{u}, \bm{v}) 
        = \min_{\bm{u}, \bm{v} \in \mathcal{C}, \bm{u} \neq \bm{v}} \mathrm{wt}(\bm{u} - \bm{v}).

Nhắc lại, trọng số Hamming của một vector là số phần tử khác :math:`0` trong vector đó:

.. math:: \mathrm{wt}(x_1, x_2, \ldots, x_n) = \lvert \{ x_i : x_i \neq 0 \} \rvert.

.. prf:definition:: Mã :math:`(n,M,d)_q`
    :label: def-nmd-code
    
    Block code :math:`\mathcal{C}` trên trường :math:`\mathbb{F}_q` 
    với độ dài :math:`n`, lực lượng :math:`M` và có khoảng cách 
    tối thiểu :math:`d` được gọi là :math:`(n, M, d)_q` code.

Thông tin ban đầu có thể được chia thành các đoạn 
độ dài :math:`k` và mỗi đoạn như vậy được encode 
thành một đoạn độ dài :math:`n`. 

Cụ thể hơn, **hàm encode** biến đổi một thông điệp là vector 
:math:`\bm{a}` độ dài :math:`k` thành codeword 
:math:`\bm{c} \in \mathcal{C}` với độ dài :math:`n`:

.. math:: \varphi: V_k(q) \to \mathcal{C}, \quad \varphi(\bm{a}) = \bm{c}.

Ánh xạ :math:`\varphi` cần là đơn ánh (one-to-one) vì chúng ta 
không muốn hai thông điệp độ dài :math:`k` cùng encode ra một 
codeword độ dài :math:`n` (khi decode chúng ta không biết sẽ 
ra thông điệp nào).

.. prf:lemma:: Điều kiện tồn tại ánh xạ mã hóa
    :label: lem-nm-code
    
    Để :math:`(n, M)_q` code có thể encode được các thông điệp 
    độ dài :math:`k` thì điều kiện cần và đủ để tồn tại ánh xạ 
    :math:`\varphi` như trên là :math:`k \leqslant \lfloor \log_q M \rfloor`.

.. prf:definition:: Phổ trọng số
    :label: def-spec-code

    **Phổ trọng số** của :math:`(n)_q` code
    :math:`\mathcal{C}` là một vector các số nguyên không âm 
    :math:`(A_0, A_1, \ldots, A_n) \in \mathbb{Z}^{n+1}_{\geqslant 0}` 
    với :math:`A_i` là số lượng vector có trọng số Hamming bằng 
    :math:`i` trong code.
