Communication in the Presence of Noise and Algorithms for Error-Correction