• STATISTIQUES
  • Il y a eu un total de 3 membres et 559 visiteurs sur le site dans les dernières 24h pour un total de 562 personnes!


    Membres: 1 819
    Discussions: 3 546
    Messages: 32 707
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] PHP Débutant
    Apprendre le PHP par l'exemple, facilement et simplement. Réservé d'abord aux débutants....
    Programmation
    [EN] Astalavista
    Un site aux ressources incontournable depuis plusieurs années, Astalavista est réellement devenue un cl...
    Hacking
    [EN] xda-developers
    Très bon site pour les gros bidouilleurs de smartphone de windows à androïd et de Apple jusqu'...
    Phreaking
    [EN] Hack this site
    Basic: 11, Realistic: 17, Application: 18, Programming: 12, Extbasic: 14, Javascript: 7, Stego: 17
    Challenges
    [EN] Bright Shadows
    JavaScript: 13, Exploit: 27, Crypto: 69, CrackIt: 52, Stegano: 67, Flash: 3, Programming: 16, Java-Applet: 10, Logic: 20...
    Challenges
    [EN] HackQuest
    Logic: 12, JavaScript: 14, Applet: 6, CrackIt: 13, Crypto: 11, Internet: 3, Exploit: 7, Stegano: 12, Flash: 1, Programmi...
    Challenges
    [FR] InfoMirmo
    Apprentissage de l'informatique par l'intermédiaire de challenges de sécurité. Venez app...
    Hacking

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Calculer pi

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 Smile.

Maintenant, entrons dans le vif du sujet, avec cette figure :
[Image: 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 Wink. 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.

New Project News White Hat Hacker V2.3
Accueil | Challenges | Tutoriels | Téléchargements | Forum