#Pi

Commandes
Avancer
Reculer

ou à la souris avec la molette
ou au clavier : + pour avancer et - pour reculer

Explications

Tout est contenu dans le code source de cette page (clic-droit, afficher le code source).

Algorithme Spigot pour le calcul des décimales de $\pi$

Pour calculer les décimales de $\pi$ on utilise une suite récurrente de quatre entiers permettant d'obtenir à chaque fois une nouvelle décimale. On peut trouver la suite utilisée à la fin de cet article de Jeremy Gibbons.

Ce calcul part de la série suivante obtenue par Gosper :

$$\pi = 3 + \frac{1\times 1}{3 \times 4 \times 5}\times (8 + \frac{2 \times 3}{3 \times 7 \times 8} \times (... 5i-2 + \frac{i(2i-1)}{3 (3i+1)(3i+2) } \times ... ))$$

et calcule les troncatures à droite terme après terme avec une conjecture pour accélerer les calculs.

On se ramène alors à la suite : $$q_0 = 1, r_0 = 180, t_0 = 60, i_0 = 2$$ $$\forall n \in \mathbb{N}, u = 3(3i_n + 1)(3i_n + 2), y = \left\lfloor \frac{q_n(27i_n -12)+5r_n}{5t_n} \right\rfloor$$

$$q_{n+1} = 10q_n i_n (2i_n-1), r_{n+1} = 10 u (q_n (5i_n-2) + r_n - y t_n), t_{n+1} = u t_n, i_{n+1} = i_n + 1$$

où $y$ est la nouvelle décimale calculée.

Calcul en javascript

Les entiers de javascript étant en précision fixe, on utilise la bibliothéque Big-integer pour faire les calculs. Les décimales sont stockées dans un tableau et on rajoute des décimales à la demande. Le nombre de chiffres des termes de la suite récurrente augmente à mesure que l'on progresse dans $\pi$ et les limites d'une telle bibliothéque se font rapidement sentir.

Projection d'hélice

Pour déterminer la spirale concentrique, on dispose dans l'espace les décimales le long d'une spirale d'axe Oz. On voit alors le cadre comme un plan sur lequelle on projette l'hélice en perspective conique depuis un point de fuite situé derrière l'écran.

Affichage

L'affichage s'effectue avec un canvas en HTML5. La taille de la police est relié à la distance entre le point de fuite et la décimale.

Interaction

Les interactions reposent sur des bindings en jQuery