• # Optimisations

    Posté par (site web personnel) . En réponse au message Je veux bien que JavaScript soit optimisé, mais quand même !.... Évalué à 3.

    Bonjour,

    J'ai fait quelques essais ... en Perl (oui, c'est lent ;/) :
    my $n = 9;

    my $a = 2.0;
    my $min = 1;

    for (my $b=0 ; $b < $n ; $b++) {
    my $max = 10 * $min;
    for (my $i = $min; $i< $max; $i++) {
    $a += $a/(4*$i*$i - 1.);
    }
    $min = $max;
    print $b+1, " :\t", $a, "\n";
    }

    Double boucle : plutôt que tester un milliard de fois si i est une puissance de 10,
    j'utilise des intervalles en progression géométrique de raison 10;

    Simplification de la formule de a en fonction de i : le multiplicateur B/(B-1)
    est arrangé en (D+1)/D = 1 + 1/D, un peu plus simple ; en outre, la multiplication a *= (1+1/D ) peut être remplacée par une addition : a += a/D ...

    La version additive tourne en 1mn 34.6s, et la multiplicative en 1mn 51.25s.

    Les résultats ne sont pas très bons : la boucle finale tourne 900 millions de fois
    pour rien (la 9ième valeur de a est identique à la précédente ; l'incrément devient beaucoup trop petit). Il faut donc utiliser des types plus longs pour les nombres obtenus.

    Autre amélioration possible : le calcul direct du dénominateur D en fonction de i
    peut être remplacé par un calcul itératif : on a un polynôme de degré 2 : P(X)= 4 * X2 -1, et on utilise la méthode des différences finies :

    P(X+1) - (P(X) = 8 X + 4 = Q(X)

    Le terme constant -1 de D a disparu de la boucle (pour se cacher dans l'initialisation).

    On peut appliquer la même méthode à Q :

    R(X) = Q(X+1) - Q(X) = 8

    La différence théorique entre les sommes/produits partiels et la limite peut être évaluée à l'aide d'une intégrale : \int_N^{+\inf} dx/P(x)