\documentclass[a4paper]{article}
\setlength{\parindent}{0em}
\setlength{\parskip}{0.4em}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amsthm}
\usepackage{enumerate}
\usepackage[bookmarksopen=true,bookmarks=true]{hyperref}
\usepackage{bookmark}
\hypersetup{
        pdfborder = {0.1 0.1 0.1},
%     colorlinks,
%     citecolor=black,
%     filecolor=black,
%     linkcolor=black,
%     urlcolor=blue
}

\usepackage{multicol}
\usepackage{graphicx}
\usepackage{float}
\graphicspath{ {./imgs} }
\usepackage{pgf-umlsd} % diagrams
\usepackage[UKenglish]{datetime}
\newdateformat{DATEMonthYear}{\monthname[\THEMONTH] \THEYEAR}
\newdateformat{DATEYearMonthDay}{\THEYEAR-\THEMONTH-\THEDAY}

\usepackage{booktabs} % \toprule \midrule ...

\theoremstyle{definition}
\newtheorem{definition}{Def}[section]
\newtheorem{theorem}[definition]{Thm}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\title{Notes on Reed-Solomon codes}
\author{arnaucube}
\date{January 2023}

\begin{document}

\maketitle

\begin{abstract}
	Notes taken while reading about Reed-Solomon codes. Usually while reading papers I take handwritten notes, this document contains some of them re-written to $LaTeX$.

	The notes are not complete, don't include all the steps neither all the proofs.
\end{abstract}

\tableofcontents

\section{Reed-Solomon Codes overview}
In this section we overview the main ideas presented in the Reed-Solomon paper \cite{reedsolomon} and in Bruce Maggs notes \cite{reedsolomon-bruce}.

Reed-Solomon codes appeared in parallel to the BCH codes, and can be described as nonbinary BCH codes. In this section we will focus only in the Reed-Solomon codes, particularly in the encoding and error detection (not correction).

\emph{tmp-note}: I feel like it is worth to check Galois theory \& BCH codes before going to Reed-Solomon codes, but due time constraints and our main goal being FRI, probably we should skip it.

\subsection{Idea}

Let $p(x) = m_0 + m_1 x + \ldots + m_{k-1} x^{k-1}$, where $m_i \in K$ and $k < 2^n$.

We map $k$-tuples of $K$ into $2^n$-tuples of $K$, where $K=GF(p^r)$.
% Code E maps $k$-tuples of $K$ into $2^n$-tuples of $K$, where $K$ is a field of degree $n$ over the field of two elements $\mathbb{Z}_2$.
$$
k
\begin{cases}
    m_0\\
    m_1\\
    \vdots\\
    m_{k-1}
\end{cases}
\in K~~~~
% \stackrel{E}{ \xrightarrow{\hspace*{1cm}} }
\xrightarrow{\hspace*{1cm}}
2^n
\begin{cases}
    p(0)\\
    p(\alpha)\\
    p(\alpha^2)\\
    \vdots\\
    p(1)
\end{cases}
\in K
$$

The receiver then, can decode the messages by solving simultaneously any $k$ of the $2^n$ equations

\begin{align*}
    p(0) &= m_0\\
    p(\alpha) &= m_0 + m_1 \alpha + m_2 \alpha^2 + \ldots + m_{k-1} \alpha^{k-1}\\
    p(\alpha^2) &= m_0 + m_1 \alpha^2 + m_2 \alpha^4 + \ldots + m_{k-1} \alpha^{2k-2}\\
    &~~~\vdots\\
    p(1) &= m_0 + m_1 + m_2 + \ldots + m_{k-1}\\
\end{align*}

This system of equations can be solved, as we can see that any $k$ of the $p(\alpha^j)$ equations are linearly independent since they form a Vandermonde matrix
$$
V =
\begin{pmatrix}
    1 & x_1 & x_1^2 & \ldots & x_1^{k-1} \\
    1 & x_2 & x_2^2 & \ldots & x_2^{k-1} \\
    1 & x_3 & x_3^2 & \ldots & x_3^{k-1} \\
    \vdots & \vdots & \vdots &  & \vdots\\
    1 & x_n & x_n^2 & \ldots & x_n^{k-1} \\
\end{pmatrix}
$$

and $\det V$ is a Vandermonde determinant and $\det V \neq 0$ as
$$
\det~V = \prod_{j < i} (x_i - x_j)
$$

See Annex \ref{sec:vandermondedet} for a proof of the Vandermonde determinant.

% The number of combinations of taking $k$ elements from $2^n$ elements (without regard of order) can be expressed by $C_k^{2^n} = \binom{2^n}{k} = \frac{(2^n)!}{k!~(2^n - k)!}$.
% This is the number of determinations of $(m_0, \ldots, m_{m-1})$ in case of no errors.

% TODO this part needs to be continued & finished.

\subsection{Real world approach}
In the practical side, instead of transmitting $k+2s$ polynomial evaluations, we send $k$ coefficients + $2s$ evaluations.

This is because we are interested in efficiency in the \emph{common} case, where in most of cases there are no errors and we care more about having a fast check that there are no errors than of the error recovering phase.

Furthermore, in our use case in the context of FRI IOP, we are not interested into decoding but only into detecting errors.

% \subsubsection{The setup}
% We work on $GF(p^r)$. For $\alpha$ being a primitive element of $GF(p^r)$, we set the generator polynomial
% 
% $$
% g(x) = (x-\alpha) (x-\alpha^2) \cdots (x-\alpha^{2s-1})
% $$
% 
% 
% THIS part is not coherent with the 'Encoding' section
% We define
% $$b(x) = x^{2s} \cdot m(x) \pmod{g(x)}$$
% 
% thus, for some $q(x)$,
% $$x^{2s} m(x) = q(x) g(x) + b(x)$$
% 
% Define the codeword $c(x)$ as
% $$c(x) = x^{2s} \cdot m(x) - b(x)$$
% UNTIL HERE.

% notice that $c(x)=q(x)g(x)$, thus $c(x)$ is a multiple of $g(x)$.
% 
% In order to check if a received codeword $c'(x)$ is correct, we'll check its divisibility by $g(x)$. If the check passes, we extract the first $k$ elements of $c'(x)$.


\subsubsection{Encoding}

Let $g(x)$ be the generator polynomial
$$g(x) = (x-\alpha) (x-\alpha^2) \cdots (x-\alpha^{2s-1})$$

whith $\alpha$ being a primitive element of $GF(p^r)$.

The \emph{encoder} wants to map the message $\{ m_0, m_1, \ldots, m_{k-1} \}$ into a polynomial $p(x)$ of degree $<k$ such that

$$p(\alpha_i) = m_i ~~ \forall i\in{0, k-1}$$

so we interpolate taking $\{ m_0, m_1, \ldots, m_{k-1} \}$ as the coefficients of $p(x)$ in order to obtain
$$p(x) = m_0 + m_1 \cdot x + \cdots + m_{k-1} x^{k-1}$$

Then the encoder computes $c(x) = p(x) \cdot g(x)$, and will output the coefficients of $c(x)$, $\{ c_i \}^k$.

Notice that $c(x)=q(x)g(x)$, thus $c(x)$ is a multiple of $g(x)$.

\subsubsection{Error checking}

The \emph{receiver} starts from the received coefficients $\{c_i'\}^k$ of $c'(x)$. $c'(x)$ may contain errors, which we represent by $e(x) = e_0 + e_1 x + e_2 x^2 + \ldots + e_{k-1} x^{k-1}$, so $c'(x) = c(x) + e(x)$.

In order to check $c(x)\stackrel{?}{=} c'(x)$ (thus, that there are no errors ($e(x) = 0$)), we will do the divisibility check $g(x) | c'(x)$, which if there are no errors the check should pass. This comes from the fact that we've chosen $c(x)$ to be a multiple of $g(x)$.
If the check passes, we'll extract the first $k$ elements of $c'(x)$.

If $c'(x) / g(x) = 0$, it means that $c'(x)$ is a multiple of $g(x)$, thus $c(x)=c'(x)$, which means that there are no errors.

In practice, checking divisibility by dividing $c'(x)$ by $g(x)$ could be computationally expensive, that's why we do the following approach.
% so we multiply $c(x)$ by some polynomial $d(x)$, and then we check if $g(x)d(x)$ divides the result.
% 
% In this way, instead of checking that $c'(x)/g(x) = 0$, we check that
% $$c'(x) = d(x) \cdot g(x) = 0 \pmod{x^n - 1}$$
% 
% If $c'(x) / g(x) \neq 0$, means that there are errors, such that
% $$c'(x) = p(x) \cdot g(x) + e(x)$$

\textbf{The check polynomial}

From $g(x) = (x-\alpha) (x-\alpha^2) \cdots (x-\alpha^{2s-1})$, we know that
$$g(x) = \prod_{i=0}^{2s-1} (x - \alpha^i) = x^{2s} - 1$$
a proof for $\prod_{i=0}^{n-1} (x - \alpha^i) = x^n - 1$ can be found in \cite{cyclotomicpolyroots}.

Now, let $g'(x)=\prod_{i=0}^{n-1} (x-\alpha^i)$, which for $n=k +2s$, is equivalent to

$$g'(x) = \prod_{i=0}^{n-1} (x-\alpha^i) = \prod_{i=0}^{2s-1} (x-\alpha^i) ~\cdot \prod_{i=2s-1}^{n-1} (x-\alpha^i)$$
% \begin{align*}
%     g'(x) = \prod_{i=0}^{n-1} (x-\alpha^i) =& \prod_{i=0}^{2s-1} (x-\alpha^i) ~\cdot \prod_{i=2s-1}^{n-1} (x-\alpha^i)\\
% =& ~g(x) ~\cdot \prod_{i=2s-1}^{n-1} (x-\alpha^i)
% \end{align*}

where we see clearly that $g'(x)$ is a multiple of $g(x)$, so, we have that $g(x) | g'(x)$, which is the same than saying that
$$g(x) | (x^n-1),~for~2s<n$$

From here, as we know that $c(x)$ is a multiple of $g(x)$, we can see that there is a unique polynomial $h(x)$ of degree $n-2s$ such that
$$g(x) h(x) = x^n - 1$$
So, $h(x) = (x^n -1) / g(x)$, and we can see that

$$h(x) = (x^n -1)/g(x)= \prod_{2s-1}^{n-1} (x - \alpha^i)$$
% $$h(x) = (x^n -1)/g(x)=\frac{x^n -1}{x^{2s} -1} = \frac{\prod_0^{n-1} (x-\alpha^i)}{\prod_0^{2s-1} (x-\alpha^i)}$$
% $$= \frac{\prod_0^{2s-1} (x-\alpha^i) \cdot \prod_{2s-1}^{n-1} (x - \alpha^i)}{\prod_0^{2s-1} (x-\alpha^i)}
% = \prod_{2s-1}^{n-1} (x - \alpha^i)
% $$

The degree of $h(x)$ being $n-2s$ can be seen from the fact that $deg(g(x))=2s$ and $deg(x^n -1)=n$, thus
$$deg(h(x)) = deg((x^n -1)/g(x))=n-2s$$
which is equal to $k$.

The polynomial $h(x)$ receives the \emph{check polynomial} name.

From here, to determine if $c'(x)$ is a valid codeword we check:
$$c'(x) \cdot h(x) = 0 \pmod{x^n - 1}$$


It is common to choose $n = p^r -1$ such as $n=2^8 - 1$, and $k=223$ (\emph{RS(255, 223)}), over $GF(2^8)$. 







\newpage
%%%%%% APPENDIX

\appendix
\section{Vandermonde determinant}
\label{sec:vandermondedet}

This section contains a simple proof of the Vandermonde matrix determinant. The proof was found in \cite{vanddetproof}, here it is written with small modifications and expanded. A different proof can be found in \cite{vanddetproof2}.

$$
\det~V(x_1, ..., x_n) = \det
\begin{pmatrix}
    1 & x_1 & x_1^2 & \ldots & x_1^{n-1} \\
    1 & x_2 & x_2^2 & \ldots & x_2^{n-1} \\
    1 & x_3 & x_3^2 & \ldots & x_3^{n-1} \\
    \vdots & \vdots & \vdots &  & \vdots\\
    1 & x_n & x_n^2 & \ldots & x_n^{n-1} \\
\end{pmatrix}
= \prod_{j < i} (x_i - x_j)
$$

\emph{Proof}

The equation is true for $n = 2$, as we have:

$$
\det~V(x_1, x_2) = \det
\begin{pmatrix}
    1 & x_1\\
    1 & x_2
\end{pmatrix}
= x_2 - x_1
$$

We now assume that $n \ge 3$. Starting with column $n$ and ending at column $2$, we successively apply the following operation: subtract $x_1$ times column $i-1$ from column $i$. The determinant remains the same and the resulting matrix is:

$$
= \det
\begin{pmatrix}
    1 & x_1-(x_1 \cdot 1) & x_1^2 - (x_1 \cdot x_1) & \ldots & x_1^{n-1} - (x_1 \cdot x_1^{n-2}) \\
    1 & x_2-(x_1 \cdot 1) & x_2^2 - (x_1 \cdot x_2) & \ldots & x_2^{n-1} - (x_1 \cdot x_2^{n-2}) \\
    1 & x_3-(x_1 \cdot 1) & x_3^2 - (x_1 \cdot x_3) & \ldots & x_3^{n-1} - (x_1 \cdot x_3^{n-2}) \\
    \vdots & \vdots & \vdots &  & \vdots\\
    1 & x_n-(x_1 \cdot 1) & x_n^2 - (x_1 \cdot x_n) & \ldots & x_n^{n-1} - (x_1 \cdot x_n^{n-2}) \\
\end{pmatrix}
$$
$$
= \det
\begin{pmatrix}
    1      & 0           & 0              & \ldots & 0 \\
    1      & (x_2 - x_1) & x_2(x_2 - x_1) & \ldots & x_2^{n-2}(x_2 - x_1) \\
    1      & (x_3 - x_1) & x_3(x_3 - x_1) & \ldots & x_3^{n-2}(x_3 - x_1) \\
    \vdots & \vdots      & \vdots         &        & \vdots \\
    1      & (x_n - x_1) & x_n(x_n - x_1) & \ldots & x_n^{n-2}(x_n - x_1) \\
\end{pmatrix}
$$

Applying the Laplace expansion along the first row and factoring out the scalar multiples $(x_i - x_1)$ in each column, we obtain: 

$$
= \det
\begin{pmatrix}
    x_2-x_1 & x_2^2 - x_1 x_2 & x_2^3 - x_1 x_2^2 & \ldots & x_2^{n-1} - x_1 x_2^{n-2} \\
    x_3-x_1 & x_3^2 - x_1 x_3 & x_3^3 - x_1 x_3^2 & \ldots & x_3^{n-1} - x_1 x_3^{n-2} \\
    \vdots & \vdots & \vdots &  & \vdots\\
    x_n-x_1 & x_n^2 - x_1 x_n & x_n^3 - x_1 x_n^2 & \ldots & x_n^{n-1} - x_1 x_n^{n-2} \\
\end{pmatrix}
$$

in each row, factor out $(x_i - x_1)$

$$
= \det
\begin{pmatrix}
    1(x_2-x_1) & x_2(x_2 - x_1) & x_2^2(x_2 - x_1) & \ldots & x_2^{n-2}(x_2 - x_1) \\
    1(x_3-x_1) & x_3(x_3 - x_1) & x_3^2(x_3 - x_1) & \ldots & x_3^{n-2}(x_3 - x_1) \\
    \vdots & \vdots & \vdots &  & \vdots\\
    1(x_n-x_1) & x_n(x_n - x_1) & x_n^2(x_n - x_1) & \ldots & x_n^{n-2}(x_n - x_1) \\
\end{pmatrix}
$$
$$
= \prod_{2 \leq i \leq n} (x_i - x_1) ~~\det
\begin{pmatrix}
    1 & x_2 & x_2^2 & \ldots & x_2^{n-2} \\
    1 & x_3 & x_3^2 & \ldots & x_3^{n-2} \\
    \vdots & \vdots & \vdots &  & \vdots\\
    1 & x_n & x_n^2 & \ldots & x_n^{n-2} \\
\end{pmatrix}
$$

now, by induction

$$
= \prod_{i=2}^n (x_i - x_1) ~~\cdot \prod_{2 \leq j < i \leq n} (x_i - x_j) ~~= \prod_{1 \leq j < i \leq n} (x_i - x_j)
$$
\qed




% Bibliography
\addcontentsline{toc}{section}{References}
\bibliography{notes_reed-solomon.bib}
\bibliographystyle{unsrt}

\end{document}
