Kouwaa ? Des maths ?
Et bien oui, jeune prépubère. Aujourd'hui on va bouffer des maths et du code, afin de calculer nous mêmes (sisi), l'un des nombres les plus fascinants :
42 Pi.
Tout d'abord, nous allons rappeler les bases :
L'aire d'un cercle est égale au produit de son rayon au carré et de pi.
Soit A = r² x pi
C'est tout ce dont vous aurez besoin

.
Maintenant, entrons dans le vif du sujet, avec cette figure :
![[Image: 9AAgfIf.png]](https://i.imgur.com/9AAgfIf.png)
Il y a deux charabias à gauche du quart de cercle inscrit dans le carré.
- e = sqrt(1-x²) //C'est l'équation de la courbe qui délimite l'aire verte
- La deuxième ligne
. Elle veut dire littéralement "Pour tout point I appartenant au rectangle ABCD, la probabilité que I appartienne à l'aire délimitée par e est égale à pi/4. Par conséquent, pi = 4 x cette probabilité. "
Vous vous demandez sans doute comment j'arrive à ce résultat. Et bien, j'ai tout simplement utilisé une règle élémentaire de probabilité, en faisant le quotient de l'aire délimitée par e et de l'aire d'ABCD.
La surface délimitée par e étant un quart de cercle, son aire est égale à (pi x r²) / 4 soit pi / 4 puisque r = 1.
L'aire du carré étant égale à 1, la probabilité qu'un point appartienne à la surface délimitée par e est égale à son aire, on trouve alors pi / 4.
Si vous avez compris, vous savez ce qu'il vous reste à faire pour calculer pi ;D.
On va trouver la probabilité qu'un point appartienne à l'aire
en simulant des points aléatoires dont les coordonnées restent dans le carré ABCD. Donc, codons ça, d'abord en python pour un rapide prototypage.
Code PYTHON :
import sys
from random import random
from math import sqrt
f = lambda x: sqrt(1 - x ** 2)
if len(sys.argv) >= 2:
n = int(sys.argv[1])
else:
n = 1000000
points = 0
for i in range(n):
x, y = random(), random()
if y <= f(x):
points += 1
print("pi =", 4 * points / n)
Ça marche ! On obtient bien un début de 3.1415... Mais voila, notre code python est trop lent. Recodons ça en bon vieux C des familles !
Code C :
/*
* C'est ce programme qui va générer des positions
* de points aléatoires afin de calculer la
* probabilité qu'un point appartienne à la surface
* délimitée par e, et ainsi trouver une approximation
* de pi.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
/* Ceci est la formule de la courbe e */
#define f(a) sqrt(1 - pow(a, 2.))
/*
* La méthode utilisée pour générer un nombre aléatoire
* entre 0 et 1.
* (en effet, il se peut qu'elle ne soit pas optimale
* c'est pour cela j'ai créé une macro spéciale en vue
* de conserver un code propre même s'il y a une amélioration )
*/
#define rand_inf_1() drand48()
int main(int argc, char* argv[])
{
double x, y;
int n, i, points = 0;
srand48(time(NULL));
/* Si on n'entre aucun argument à la ligne de commande,
* on fait 1'000'000 de lancers par défaut */
if (argc > 1)
n = atol(argv[1]);
else
n = 1000000;
for (i = 0; i < n; i++) {
/* On donne des coordonnées aléatoires au point */
x = rand_inf_1();
y = rand_inf_1();
/* Si le point appartient à la surface */
if (y <= f(x))
++points;
}
printf("pi = %f\n", (double) 4 * points / n);
return 0;
}
On peut alors obtenir une meilleure approximation, et ce en un temps plus court qu'en python.
Voila ! J'espère que vous avez compris que le calcul de pi n'est pas magique. Si vous avez la moindre question n'hésitez pas, je vous répondrai avec plaisir.