Code cleanup using lookup tables

There were parts of the code that seemed to make more sense as a lookup table instead of a long list of if/else statements.  Changing it to this form seemed to cut down (just slightly) the execution time and memory usage.

Also added some comments and helper functions to make it easier to understand (and hopefully improve) the algorithm.

@tlycken I was actually planning on adding the initial tests as a pull request too, but I forgot that I put them in the master branch. Do you mind looking over that as well?  Sorry about that.
Does this make more sense?  It's unfortunate that I can't put pictures and diagrams in the code as well.  It might be easier if I put more detailed documentation on the wiki and just point to it in the comments.