Puissance de 2 commençant par 777777 (1998-08-15)

In article <6r1a27$hcc$1@nef.ens.fr>, David Madore wrote:

> En clair, trouver une puissance de 2 qui commence par 1000000, c'est
> facile.  Par 999999 aussi.  Mais pour trouver la premiere puissance de
> 2 qui commence par 777777, on fait comment, en pratique ?

Voilà une petite modification de mon algo; j'espère qu'il n'y a pas
d'erreur. Comme il n'est pas long, je donne directement le source C
(c'est mieux pour ceux qui veulent tester), mais ce n'est pas tout à
fait rigoureux à cause des erreurs d'arrondi (mais en point fixe, il
n'y a aucun problème, et comme toutes les variables flottantes sont
entre 0 et 1, c'est intéressant)...

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int approx(double x, double b, double d)
{
  int u = 1, v = 1, r = 0;
  double y;

  b -= floor(b);
  x -= floor(x);
  y = 1.0 - x;
  for (;;)
    if (b < x)
    {
      while (x < y)
        { y -= x; u += v; }
      x -= y;
      if (b >= x) r += v;
      v += u;
    }
    else
    {
      if ((b -= x) <= d) return r+u;
      while (y < x)
        { x -= y; v += u; }
      y -= x;
      if (b < x) r += u;
      u += v;
    }
}

int main(int argc, char **argv)
{
  double a, b, d;
  if (argc != 4) exit(1);
  a = atof(argv[1]);
  b = atof(argv[2]);
  d = atof(argv[3]);
  printf("%d\n", approx(a,b,d));
  return 0;
}

On donne comme arguments 3 réels a, b et d, et l'entier renvoyé est
censé être le plus petit entier tel que {b - n.a} <= d, où {x} désigne
la partie fractionnaire positive de x, i.e. {x} = x - floor(x).

Voici l'application pratique pour une puissance de 2 qui commence
par 777777. On écrit (je n'explique pas les notations, j'espère que
vous les comprenez): 2^n = (777777 + [0,1[).10^k

On passe au logarithme décimal, que je note "log":
n.log(2) = log(777777+[0,1[) + k

On applique l'algo à:
  a = log(2)                     approx. 0.30102999566
  b = log(777778)                approx. 5.89085565466
  d = log(777778) - log(777777)  approx. 0.00000055838

On obtient: 26399.
Voici les premiers chiffres de 2^26399: 7777777829...


webmaster@vinc17.org