Information Theory and Coding for Beginners: An Introduction to the Principles and Applications of Data Compression and Error Correction Daniel Garfield