MAJOR UPDATE:added a reciprocal method and lots of other semi-private methods