Terminale · F3
terminale
Aller plus loin · Scripts

Les sorties de l'Atelier

Les trois livraisons promises à la dernière page de l'Atelier : le duel chronométré des deux séries pour ln 2, la table de Stifel complète, exposants négatifs compris, jusqu'à 2 puissance 20, et le script qui donne le premier chiffre de 2 puissance n pour tous les n que vous voudrez.

L’Atelier du chapitre s’est refermé sur trois promesses. Les voici tenues, dans l’ordre. Tous les nombres de cette page ont été recalculés, les sommes de séries en arithmétique décimale à soixante chiffres afin qu’aucune erreur d’arrondi ne vienne polluer la mesure de l’erreur.

I. Le duel des deux séries

L’exercice 30, Les deux routes, chronométrées, oppose deux formules qui calculent le même nombre.

La première est la série de Mercator (1668), prise en x=1x = 1 :

ln2=112+1314+15\ln 2 = 1 - \frac12 + \frac13 - \frac14 + \frac15 - \cdots

La seconde vient du développement de ln1+x1x\ln \frac{1+x}{1-x}, dans lequel les termes de rang pair s’annulent, pris en x=13x = \frac13 puisque 1+1/311/3=2\frac{1 + 1/3}{1 - 1/3} = 2 :

ln2=2(13+13133+15135+17137+).\ln 2 = 2\left( \frac13 + \frac{1}{3}\cdot\frac{1}{3^{3}} + \frac{1}{5}\cdot\frac{1}{3^{5}} + \frac{1}{7}\cdot\frac{1}{3^{7}} + \cdots \right).

Les deux sont exactes. Une seule calcule.

Les scripts

from decimal import Decimal, getcontext

getcontext().prec = 60


def alternee(N):
    """Somme des N premiers termes de 1 - 1/2 + 1/3 - ..."""
    s = Decimal(0)
    for k in range(1, N + 1):
        s += Decimal((-1) ** (k + 1)) / Decimal(k)
    return s


def acceleree(N):
    """Somme des N premiers termes de 2 * (x + x^3/3 + x^5/5 + ...) en x = 1/3."""
    x = Decimal(1) / Decimal(3)
    s = Decimal(0)
    for k in range(N):
        s += x ** (2 * k + 1) / Decimal(2 * k + 1)
    return 2 * s


LN2 = Decimal("0.693147180559945309417232121458176568075500134360255254120680")

for N in (1, 2, 3, 4, 5, 6, 8, 10, 12):
    print(N, abs(alternee(N) - LN2), abs(acceleree(N) - LN2))

Le tableau d’erreurs

TermesSérie alternéeSérie accélérée
113,07×1013{,}07 \times 10^{-1}2,65×1022{,}65 \times 10^{-2}
221,93×1011{,}93 \times 10^{-1}1,79×1031{,}79 \times 10^{-3}
331,40×1011{,}40 \times 10^{-1}1,43×1041{,}43 \times 10^{-4}
441,10×1011{,}10 \times 10^{-1}1,24×1051{,}24 \times 10^{-5}
559,02×1029{,}02 \times 10^{-2}1,13×1061{,}13 \times 10^{-6}
667,65×1027{,}65 \times 10^{-2}1,07×1071{,}07 \times 10^{-7}
885,86×1025{,}86 \times 10^{-2}1,01×1091{,}01 \times 10^{-9}
10104,75×1024{,}75 \times 10^{-2}1,01×10111{,}01 \times 10^{-11}
12123,99×1023{,}99 \times 10^{-2}1,05×10131{,}05 \times 10^{-13}
1001004,98×1034{,}98 \times 10^{-3}
10001\,0005,00×1045{,}00 \times 10^{-4}
10610^{6}5,00×1075{,}00 \times 10^{-7}

Lisez les deux colonnes comme deux langues différentes.

À gauche, l’erreur est divisée par 1010 quand on multiplie le nombre de termes par 1010 : elle vaut à peu près 12N\frac{1}{2N}, et il faut donc dix fois plus de travail pour gagner un seul chiffre. Après mille termes, l’erreur dépasse encore 10410^{-4}, ce qui veut dire qu’on n’a même pas quatre décimales sûres. Il faut un million de termes pour arriver à 5×1075 \times 10^{-7}, c’est-à-dire six décimales, et le compte exact de ce seuil est fait dans la page des tiroirs du numéro 6.

À droite, l’erreur est divisée par 99 à chaque terme ajouté, parce que chaque terme porte un facteur x2=19x^{2} = \frac19 de plus que le précédent. Un terme, une décimale, sans négociation : les valeurs le montrent, l’erreur passe de 10210^{-2} à 101310^{-13} en douze pas. Les douze termes donnent bien douze décimales exactes ; le douzième terme amène l’erreur à 1,05×10131{,}05 \times 10^{-13}, juste sous le seuil de 5×10135 \times 10^{-13} qu’exige un arrondi correct au douzième rang. Le voici, comparé à la cible :

12 termes=0,69314718055984ln2=0,69314718055994\begin{aligned} \text{12 termes} &= 0{,}693\,147\,180\,559\,84\ldots \\ \ln 2 &= 0{,}693\,147\,180\,559\,94\ldots \end{aligned}

Le duel se résume donc à ceci : douze contre deux millions, pour la même précision et la même cible. Ce n’est pas un écart de vitesse, c’est un écart de nature. La série alternée avance par différences d’inverses d’entiers, qui décroissent lentement ; la série accélérée avance par puissances d’un nombre plus petit que 11, qui décroissent géométriquement. Newton, qui construisait ses tables personnelles à la main, employait déjà des combinaisons de ce genre, et pour cause : à la plume, deux millions de termes ne sont pas une lenteur, ce sont plusieurs vies humaines.

II. La table de Stifel, complète

L’exercice 23, La table de Stifel (1544), travaille sur la double ligne imprimée dans l’Arithmetica Integra, arrêtée à 27=1282^{7} = 128. La voici prolongée, exposants négatifs compris, jusqu’à 2202^{20}.

nn2n2^{n}nn2n2^{n}nn2n2^{n}
3-318\frac18553232131381928\,192
2-214\frac1466646414141638416\,384
1-112\frac127712812815153276832\,768
00118825625616166553665\,536
1122995125121717131072131\,072
2244101010241\,0241818262144262\,144
3388111120482\,0481919524288524\,288
441616121240964\,096202010485761\,048\,576

Michael Stifel, moine augustin devenu prédicateur luthérien, publie cette table à Nuremberg en 1544, soixante-dix ans avant Napier. Il l’accompagne d’une remarque qu’il ne développe pas et dont il ne mesure visiblement pas la portée : la ligne du haut fait par addition ce que la ligne du bas fait par multiplication. En langage moderne, la table est un extrait du graphe de log2\log_2, et les trois règles qu’elle met en scène sont celles du paragraphe 2 du cours, restreintes aux puissances entières de 22.

Trois usages, sur la table élargie

Multiplier, en additionnant. Pour calculer 4096×1284\,096 \times 128, on lit les deux exposants dans la ligne du haut, 1212 et 77, on les additionne, 12+7=1912 + 7 = 19, et on lit le résultat en face de 1919 :

4096×128=212×27=219=524288.4\,096 \times 128 = 2^{12} \times 2^{7} = 2^{19} = 524\,288.

Une multiplication de deux nombres à quatre et trois chiffres est devenue l’addition 12+712 + 7. C’est tout le principe, et c’est ce que trois siècles d’ingénieurs feront ensuite à la règle à calcul.

Diviser, en soustrayant. C’est l’apport des exposants négatifs, qui manquaient aux tables antérieures. Pour 64128\frac{64}{128}, on soustrait : 67=16 - 7 = -1, et la colonne 1-1 donne

64128=267=21=12.\frac{64}{128} = 2^{6 - 7} = 2^{-1} = \frac12.

Sans la partie gauche de la table, le calcul sortait du tableau et n’avait plus de réponse lisible. Avec elle, la division est une soustraction, y compris quand le quotient est plus petit que 11.

Extraire une racine, en prenant la moitié. Pour 65536\sqrt{65\,536}, on lit 1616, on divise l’exposant par 22, et on lit en face de 88 :

65536=216/2=28=256.\sqrt{65\,536} = 2^{16/2} = 2^{8} = 256.

La méthode ne marche que si l’exposant s’y prête, et l’exercice 23 de l’Atelier vous fait toucher la limite du doigt (que demanderait 32\sqrt{32} à la table ?). C’est là que l’échelle de 1544 s’arrête et que le travail de Briggs commence : remplir les trous entre les entiers, en extrayant à la main les racines carrées successives dont le cours a détaillé la mécanique. Stifel avait construit une échelle à barreaux très espacés ; les logarithmes en ont fait une pente continue.

III. Le premier chiffre de 2n2^{n}, pour tous les nn

Dernière promesse. L’exercice 31, Le premier chiffre du géant, établit que si logN=m+f\log N = m + f avec mm entier et f[0;1[f \in [0\,;1[, alors NN compte m+1m+1 chiffres et commence par le chiffre 10f\lfloor 10^{f} \rfloor. Voici l’outil complet, prêt à recevoir n’importe quel exposant.

import math


def tete(a, n):
    """Nombre de chiffres et premier chiffre de a**n, sans calculer a**n."""
    y = n * math.log10(a)
    m = math.floor(y)
    f = y - m
    return m + 1, math.floor(10 ** f)


for n in (10, 30, 64, 100, 128, 500, 1000, 4253):
    nb, d = tete(2, n)
    print(f"2^{n} : {nb} chiffres, commence par {d}")

Un échantillon de sorties.

nnChiffres de 2n2^{n}Premier chiffreDébut de l’écriture décimale
1010441110241024
303010101110731073\ldots
646420201118441844\ldots
10010031311112671267\ldots
12812839393334023402\ldots
5005001511513332733273\ldots
10001\,0003023021110711071\ldots
42534\,25312811\,2811119071907\ldots
136279841136\,279\,8414102432041\,024\,3208888168816\ldots

La ligne n=1000n = 1\,000 est vérifiable de deux façons, et il faut le faire au moins une fois : le script annonce 302302 chiffres et une tête de 11, et le calcul exact, que Python mène sans broncher sur les grands entiers, donne

21000=107150860718(302 chiffres),2^{1\,000} = 107\,150\,860\,718\ldots \quad (302 \text{ chiffres}),

soit exactement 10f1,071510^{f} \approx 1{,}0715 multiplié par 1030110^{301}. Les deux méthodes concordent, mais elles ne sont pas de même nature : la seconde écrit le nombre, la première le devine à distance.

La dernière ligne du tableau montre pourquoi cette distance est précieuse. Le nombre 21362798412^{136\,279\,841}, dont le record de Mersenne du cours est le voisin immédiat, possède plus de quarante et un millions de chiffres. Aucun tableau, aucune page, aucun écran ne l’affichera jamais en entier ; le logarithme, lui, en donne le premier chiffre et le nombre total de chiffres en deux opérations flottantes.

Il faut simplement savoir jusqu’où on a le droit de la croire. La partie fractionnaire ff est calculée à partir d’un log2\log 2 approché, et l’erreur commise sur ff est de l’ordre de nn fois l’erreur sur log2\log 2 : pour nn de l’ordre de 10810^{8}, une approximation à 101610^{-16} près donne un ff connu à 10810^{-8} près seulement, ce qui reste largement suffisant pour lire le premier chiffre mais ne le serait plus pour en lire dix. C’est l’objet de la question 4 de l’exercice 31, et c’est aussi ce qui explique le piège du comptage de chiffres signalé dans le cours : l’arrondi log20,301030\log 2 \approx 0{,}301\,030 fausse le total d’une unité, et il faut aller à neuf décimales, log20,301029996\log 2 \approx 0{,}301\,029\,996, pour retomber sur les 4102432041\,024\,320 chiffres annoncés.

Enfin, le script accepte n’importe quelle base : tete(3, 1000) répond 478478 chiffres et une tête de 11, et le calcul exact confirme, 31000=13220708193^{1\,000} = 1\,322\,070\,819\ldots. C’est la question 3 du même exercice, et elle sert précisément à cela : contrôler la méthode approchée par un calcul qui ne peut pas mentir, avant de la lâcher sur des exposants où plus aucun contrôle n’est possible.

Sources

  • Atelier F3, exercices 23 La table de Stifel (1544), 30 Les deux routes, chronométrées et 31 Le premier chiffre du géant ; Coulisses n°6, pièce 50 ; cours F3, paragraphes 7 et 8.
  • M. Stifel, Arithmetica Integra, Nuremberg, 1544. N. Mercator, Logarithmotechnia, Londres, 1668.
  • Toutes les valeurs ont été recalculées en Python : sommes de séries en arithmétique décimale à soixante chiffres, chiffres de tête et nombres de chiffres contrôlés sur les entiers exacts partout où cela reste possible.
← Retour au chapitre F3