Calculer le nombre Pi en ligne de commande sous Linux
Sous Linux et UNIX, le programme bc est une sorte de calculatrice en ligne de commande. Il est très pratique pour effectuer des opérations arithmétiques simples dans des scripts shell (addition, soustraction, etc.). Si on parcourt sa page de manuel (man bc), les auteurs donnent une petite astuce pour calculer le nombre Pi.
Voici un extrait de ce que l'on peut lire :
In /bin/sh, the following will assign the value of "pi" to the shell variable pi. pi=$(echo "scale=10; 4*a(1)" | bc -l)
Analysons cette commande plus en détails :
- scale=10 : cette option permet d'indiquer le nombre de chiffres après la virgule que l'on souhaite dans le résultat
- 4*a(1) : c'est l'une des formules mathématiques qui permet de calculer le nombre Pi. Celle-ci se base sur la fonction Arc Tangente a().
- bc -l : on envoie la formule mathématique à la commande bc, pour que celle-ci effectue le calcul. L'option -l permet de charger la librairie mathématique standard, nécessaire pour utiliser la fonction Arc Tangente a().
Donc, si on veut calculer le nombre Pi à la 10000 ème décimale près, on peut utiliser cette commande :
$ time echo "scale=10000; 4*a(1)" | bc -l
3.141592653589793238462643383279502884197169399375105820974944592307\
81640628620899862803482534211706798214808651328230664709384460955058\
22317253594081284811174502841027019385211055596446229489549303819644\
28810975665933446128475648233786783165271201909145648566923460348610
...
...
real 1m48.511s
user 1m48.031s
sys 0m0.007s
Ici, il m'aura fallu moins de deux minutes pour effectuer le calcul sur un processeur Intel Core i7.
A noter que le dernier record de calcul de Pi, à l'heure où j'écris ces lignes, date du mois d'août 2010. Celui-ci a été établi par deux informaticiens (un japonais et un américain) avec 5 000 milliards de décimales après la virgule.
10 Commentaires pour "Calculer le nombre Pi en ligne de commande sous Linux"
Flux des commentaires de cet article Ajouter un commentairemerci pour l'astuce, j'adooore
inutile donc indispensable
Yep, pareil
Remarque: Pi est un nombre, pas un chiffre
@neola : ok, j'ai changé le titre du coup.
Nombre pas Chiffre.
Pi est un nombre. Les chiffres sont les symboles d’écritures des nombres.
De plus c'est une astuce pour utilisé Pi dans bc, il ne me semble pas que ce soit une astuce intéressante pour calculer Pi lui-même.
Tangente et ArcTangente sont des fonction liées à Pi, comme toutes les fonctions trigonométriques, elle ne sont donc pas calculées magiquement de manière exacte, mais par des algos, qui ont donc une complexité intrinsèque qui va vite grimper avec le nombre de décimales.
Il me semble que l'algo le plus efficace d'ArcTan se base sur 1/(1+x²), ce qui n'est pas le cas de l'algo le plus efficace pour les décimales de Pi.
Cette astuce permet de gagner du temps et de ne pas réinventer la roue, pour une simple calculatrice basique en utilisant une fonction déjà présente dans la machine et dont l'efficacité est clairement suffisante pour la précision que demande les utilisateurs de bc.
Je ne me lancerais pas dans le calcul de plus d'une centaine de décimales avec cette méthode, qui risque de devenir très gourmande et de donner quelques décimales fausse sur la fin...
Excellent merci
Je viens de faire un essai et il faut 2m41sec pour calculer la 10000eme décimal de pi avec mon processeur Intel core i3... Not bad!
Par curiosité j'ai comparé le résultat est c'est tout à fait correct, ce qui confirme que l'algorithme utilisé par BC est très puissant et approprié.
Vous pouvez donc utilisé BC en toute sécurité la prochaine fois que vous calculerez la trajectoire de votre sonde cosmique à destination de Jupiter.
http://www.wolframalpha.com/input/?i=what+is+the+10000+decimal+of+pi
@Virtualmix : sympa ta technique pour vérifier les décimales. J'y avais pas pensé.
@all : la commande bc à quand même quelques limites. Si on cherche à calculer une décimale trop grane, on se prend un "out of memory". Donc cette astuce, c'est juste pour le fun, pas pour battre des records.
À noter qu'en pratique, une quarantaine de décimales suffisent pour calculer la circonférence de l'univers observable, à un atome d'hydrogène près.
Donc au delà (et même bien avant), on est vraiment dans le benchmark, sans réelle utilité.
Bonjour
Merci à tous pour votre érudition en calcul.
Ancien logicien, j'ai suivi de loin les travaux du groupe Twist21 sur les techniques de calcul des fonctions non primitives récursives, la première candidate étant bien sûr celle d'Ackermann.
L'un des doctes contributeurs sur ce forum tux planet saurait-il proposer une alternative optimisées par rapport à celle qu'a proposé Pollux lors du colloque du 02/11.
Pour rappel, on peut écrire comme suit la fonction d'Ackermann (j'utilise la syntaxe du C, je pense compréhensible par la majorité) :
int mybr( long m, long n)
{
if (m == 0)
{
return n + 1;
}
else if (n == 0)
{
return mybr(m - 1, 1);
}
else
{
return mybr(m - 1, mybr(m, n - 1));
}
}
==> Jusqu'ici rien de surprenant, tout béotien connait cette fonction.
Par contre, ce qui m'a séduit, c'est l'implémentation en perl faite par cora.hammser et son calcul de ack(8,21) en moins de 82449 heures sur un pentium simple processeur cadencé à 1.1 Ghz.
Les contributeurs sur ce site disposeraient-ils aussi d'une implémentation "supra-optimisée" pour reprendre les termes de la ravissante et fort brillante Cora ?
Si oui, pourraient-ils nous en faire profiter.
La fonction d'Ackermann ne loge qu'au premier étage des fonctions NPR, Cora a aussi mis au point un algo pour calcul de fonction (sur entiers uniquement) des NPR niveau 2 et 3.
Toutes connaissances sur le sujet m'intéresse fortement.
MErci à tous.
Apollon4
@Virtualmix :
J'ai un doute sur la validité de l'outil en ligne : il prétend que la 1ere décimale de pi est 3, et donne la même réponse si la requête est http://www.wolframalpha.com/input/?i=what+is+the+1+digit+of+pi
http://www.wolframalpha.com/input/?i=what+is+the+1+decimal+of+pi
Du coup, quelle est vraiment la 10000e décimale de pi ? Je parierais sur 8 si le calcul effectué est correct