use BigInteger directly
to help avoid bugs with initialization of a big number