/* Copyright 2010 Kevin Ryde

   This file is part of Math-Image.

   Math-Image is free software; you can redistribute it and/or modify it under
   the terms of the GNU General Public License as published by the Free
   Software Foundation; either version 3, or (at your option) any later
   version.

   Math-Image is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   more details.

   You should have received a copy of the GNU General Public License along
   with Math-Image.  If not, see <http://www.gnu.org/licenses/>.  */

#include <stdio.h>
#include <gmp.h>
#include <mpfr.h>

int
main (void)
{
  {
    mpfr_t pi;
    mpz_t z;
    unsigned long bits = 1000000;
    unsigned long i, j, prev;

    mpfr_init2 (pi, bits);
/*     mpfr_const_pi (pi, GMP_RNDZ); */
    mpfr_const_log2 (pi, GMP_RNDZ);
    mpfr_mul_2exp (pi, pi, bits-1, GMP_RNDZ);
    mpz_init (z);
    mpfr_get_z (z, pi, GMP_RNDZ);

    i = bits;
    j = 1;
    prev = 1;
    for (;;) {
      if (mpz_tstbit (z, i)) {
        printf ("%lu\n", j-prev);
        prev = j;
      } else {
        /* printf ("0"); */
      }
      if (i == 0) break;
      i--; j++;
    }
    printf ("\n");
    return 0;
  }

  {
    mpz_t total, num, q;
    unsigned long bits = 1000000;
    unsigned long k, den;

    /* quadratic in bits, about 125000 fracs to accumulate */

    mpz_init_set_ui (total, 0);
    mpz_init_set_ui (num, 1);
    mpz_init (q);
    mpz_mul_2exp (num, num, bits);

    for (k = 0; ; k++) {
      den = 2*k + 1;
      /* printf("1 / 4**%-2lu * %2lu\n", k, den); */

      mpz_div_ui (q, num, den);
      mpz_add (total, total, q);
      mpz_cdiv_q_2exp (num, num, 2);

      if (mpz_cmp_ui (num, den) < 0) {
        break;
      }
    }
    return 0;
  }

  {
    mpfr_t ln;
    unsigned long bits = 1000000;
    mpfr_init2 (ln, bits);
    mpfr_set_ui (ln, 3, GMP_RNDZ);
    mpfr_log (ln, ln, GMP_RNDZ);
    return 0;
  }
}
