From a40fecfd22aed6dd1ddbd4071195fdf61ec77f50 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 26 Feb 2025 08:46:48 -0800 Subject: [PATCH] ECC edits --- .../parts/00 detection.tex | 22 ++++++++------ .../parts/01 correction.tex | 6 ++-- .../parts/02 hamming.tex | 28 +++++++++++------- .../Error-Correcting Codes/qr-betalupi.png | Bin 0 -> 16430 bytes .../{qr.png => qr-rick.png} | Bin 5 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 src/Advanced/Error-Correcting Codes/qr-betalupi.png rename src/Advanced/Error-Correcting Codes/{qr.png => qr-rick.png} (100%) diff --git a/src/Advanced/Error-Correcting Codes/parts/00 detection.tex b/src/Advanced/Error-Correcting Codes/parts/00 detection.tex index 58466e3..233db83 100755 --- a/src/Advanced/Error-Correcting Codes/parts/00 detection.tex +++ b/src/Advanced/Error-Correcting Codes/parts/00 detection.tex @@ -1,6 +1,8 @@ \section{Error Detection} -An ISBN\footnote{International Standard Book Number} is a unique numeric book identifier. It comes in two forms: ISBN-10 and ISBN-13. Naturally, ISBN-10s have ten digits, and ISBN-13s have thirteen. The final digit in both versions is a \textit{check digit}. +An ISBN\footnote{International Standard Book Number} is a unique identifier publishers assign to their books. \par +It comes in two forms: ISBN-10 and ISBN-13. Naturally, ISBN-10s have ten digits, and ISBN-13s have thirteen. +The final digit in both versions is a \textit{check digit}. \vspace{3mm} @@ -15,7 +17,8 @@ If $n_{10}$ is equal to 10, it is written as \texttt{X}. \problem{} -Only one of the following ISBNs is valid. Which one is it? +Only one of the following ISBNs is valid. Which one is it? \par +\note[Note]{Dashes are meaningless.} \begin{itemize} \item \texttt{0-134-54896-2} @@ -23,15 +26,16 @@ Only one of the following ISBNs is valid. Which one is it? \end{itemize} \begin{solution} - The first has an inconsistent check digit. + The second is valid. \end{solution} \vfill \pagebreak \problem{} -Take a valid ISBN-10 and change one digit. Is it possible that you get another valid ISBN-10? \par -Provide a proof. +Take a valid ISBN-10 and change one digit. \par +Is it possible that you get another valid ISBN-10? \par +Provide an example or a proof. \begin{solution} Let $S$ be the sum $10n_1 + 9n_2 + ... + 2n_9 + n_{10}$, before any digits are changed. @@ -50,9 +54,8 @@ Provide a proof. \vfill \problem{} -Take a valid ISBN-10 and swap two adjacent digits. When will the result be a valid ISBN-10? \par -This is called a \textit{transposition error}. - +Take a valid ISBN-10 and swap two adjacent digits. This is called a \textit{transposition error}. \par +When will the result be a valid ISBN-10? \begin{solution} Let $n_1n_2...n_{10}$ be a valid ISBN-10. \par @@ -68,7 +71,8 @@ This is called a \textit{transposition error}. \pagebreak \definition{} -ISBN-13 error checking is slightly different. Given a partial ISBN-13 $n_1 n_2 n_3 ... n_{12}$, the final digit is given by +ISBN-13 error checking is slightly different. \par +Given a partial ISBN-13 with digits $n_1 n_2 n_3 ... n_{12}$, the final digit is given by $$ n_{13} = \Biggr[ \sum_{i=1}^{12} n_i \times (2 + (-1)^i) \Biggl] \text{ mod } 10 diff --git a/src/Advanced/Error-Correcting Codes/parts/01 correction.tex b/src/Advanced/Error-Correcting Codes/parts/01 correction.tex index 72d183b..5b55535 100644 --- a/src/Advanced/Error-Correcting Codes/parts/01 correction.tex +++ b/src/Advanced/Error-Correcting Codes/parts/01 correction.tex @@ -8,7 +8,8 @@ QR codes feature a system that does. \par Odds are, you've seen a QR code with an image in the center. Such codes aren't \say{special}---they're simply missing their central pixels. The error-correcting algorithm in the QR specification allows us to read the code despite this damage. \begin{figure}[h] \centering - \href{https://youtube.com/watch?v=dQw4w9WgXcQ}{\includegraphics[width = 3cm]{qr}} + %\href{https://youtube.com/watch?v=dQw4w9WgXcQ}{\includegraphics[width = 3cm]{qr-rick}} + \href{https://betalupi.com}{\includegraphics[width = 3cm]{qr-betalupi}} \end{figure} \definition{Repeating codes} @@ -47,7 +48,8 @@ What is the efficiency of a $k$-repeat code? \vfill -As you just saw, repeat codes are not a good solution. You need many extra bits for even a small amount of redundancy. We need a better system. +Repeat codes are not efficient. We need to inflate our message by +\textit{three times} if we want to correct even a single error. We need a better system. \pagebreak diff --git a/src/Advanced/Error-Correcting Codes/parts/02 hamming.tex b/src/Advanced/Error-Correcting Codes/parts/02 hamming.tex index f1901e2..d90888e 100644 --- a/src/Advanced/Error-Correcting Codes/parts/02 hamming.tex +++ b/src/Advanced/Error-Correcting Codes/parts/02 hamming.tex @@ -1,6 +1,6 @@ \section{Hamming Codes} -Say we have a 16-bit message, for example \texttt{1011 0101 1101 1001}. \par +Say we have an $n$-bit message, for example \texttt{1011 0101 1101 1001}. \par We will number its bits in binary, from left to right: @@ -62,13 +62,14 @@ We will number its bits in binary, from left to right: \problem{} -In this 16-bit message, how many message bits have an index with a one as the last digit? \par +If we number the bits of a 16-bit message as described above, \par +how many message bits have an index with a one as the last digit? \par (i.e, an index that looks like \texttt{***1}) \vspace{2cm} \problem{} -Say we number the bits in a 32-bit message as above. \par +Now consider a 32-bit message. \par How many message bits have an index with a one as the $n^\text{th}$ digit? \par \vspace{2cm} @@ -76,7 +77,10 @@ How many message bits have an index with a one as the $n^\text{th}$ digit? \par -We now want a way to detect errors in our 16-bit message. To do this, we'll replace a few data bits with parity bits. This will reduce the amount of information we can send, but will also improve our error-detection capabilities. +Now, let's come up with a way to detect errors in our 16-bit message. +To do this, we'll replace a few data bits with parity bits. +This will reduce the amount of information we can send, +but will allow the receiver to detect errors in the received message. \vspace{1mm} @@ -174,7 +178,8 @@ Can this coding scheme correct a single-bit error? \vfill \pagebreak -We'll now add four more parity bits, in positions \texttt{0001}, \texttt{0010}, \texttt{0100}, and \texttt{1000}: +We'll now add four more parity bits, in positions \texttt{0001}, \texttt{0010}, \texttt{0100}, and \texttt{1000}: \par +This error-detection scheme is called the \textit{Hamming code}. \begin{center} \begin{tikzpicture}[scale = 1.25] @@ -246,7 +251,7 @@ Bits \texttt{0100} and \texttt{1000} work in the same way. \par When counting bits in binary numbers, go from right to left.} \problem{} -Which message bits does each parity bit cover? \par +Which message bits does each parity bit \say{cover}? \par In other words, which message bits affect the value of each parity bit? \par \vspace{1mm} @@ -358,7 +363,7 @@ Analyze this coding scheme. \vfill \problem{} -Each of the following messages has either 0, 1, or two errors. \par +Each of the following messages has either one, two, or no errors. \par Find the errors and correct them if possible. \par \hint{Bit \texttt{0000} should tell you how many errors you have.} @@ -590,7 +595,7 @@ A \textit{message stream} is an infinite string of binary digits. \problem{} Show that Hamming codes do not reliably detect bit deletions: \par \hint{ - Create a 17-bit message whose first 16 bits are a valid Hamming block, \par + Create a 17-bit message whose first 16 bits are a valid Hamming-coded message, \par and which is still valid when a bit (chosen by you; not the $17^\text{th}$) is deleted. } @@ -598,10 +603,11 @@ Show that Hamming codes do not reliably detect bit deletions: \par \problem{} Convince yourself that Hamming codes cannot correct insertions. \par -Then, create a 16-bit message that... +Then, create a 16-bit message that: \begin{itemize} - \item is a valid Hamming block, and - \item incorrectly "corrects" a single bit error when it encounters an insertion error. + \item is itself a valid Hamming code, and + \item incorrectly "corrects" a single bit error when it encounters an insertion error. \par + You may choose where the insertion occurs. \end{itemize} \vfill diff --git a/src/Advanced/Error-Correcting Codes/qr-betalupi.png b/src/Advanced/Error-Correcting Codes/qr-betalupi.png new file mode 100644 index 0000000000000000000000000000000000000000..f57e008f0aeb45c2054d4ae9312d17fe124e3c53 GIT binary patch literal 16430 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