mpz_sizeinbase

Torbjorn Granlund tege@swox.com
04 Nov 2002 15:49:44 +0100


  > Now, suppose the return value of mpz_sizeinbase(op, base) is
  > numdigs and I want to know the *exact* number of digits. The most
  > straightforward way is to compare op with base^(numdigs-1) and
  > then reduce numdigs by 1 if op is less than base^(numdigs-1). Is
  > there a better way?

  Not that I know of.

One could compute t=approx(base^n/2^m), where n is initially
chosen to a suitable value less than returned mpz_sizeinbase(op,
base).  During the computation of base^n, low limbs should be
truncated gradually,

Then, we compute op/t and op/(t+1) and convert these small number
to to base.  If they are the same number of digits, we're done.
Else, decrease m and try again...

On average, this should be very fast.

  > By the way, is it too expensive to *always* return the exact
  > number of digits when base is not 2 ?

  It already does so. :-) (And it always did I think, but it's
  has only recently been documented.)

No, the results are exact just for powers of 2.

--
Torbjörn