Introduction to the Theory of Error-Correcting Codes