Error-correcting coding theory