Switch Long to be BigInteger so we can have arbitrary precision