IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Pour fêter dignement la journée de Pi


Sujet :

Python

  1. #1
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut Pour fêter dignement la journée de Pi
    Bonjour,

    Puisque google nous rappelle qu'on fête aujourd'hui la journée de pi (3.14159...), voilà un petit code pour le calcul de pi qui utilise le module "decimal".

    Il existe de nombreuses façons de calculer Pi. Celle-ci est basée sur le calcul de l'arc sinus par série entière, et sur le fait que pi=6*arcsin(0.5):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
     
    from decimal import *
     
    ##############################################################################
    def pidec():
        """utilitaire pour le calcul de pi"""
        getcontext().prec += 2
        x = Decimal("0.5")
        xc = x*x
        k = x
        s1 = k
        n = 0
        while True:
            n += 1
            k *= xc*(2*n-1)*(2*n-1)/(2*n*(2*n+1))
            s2 = s1 + k
            if s2 == s1:
                break
            s1 = s2
        getcontext().prec -= 2
        return 6*s2
    Utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    getcontext().prec = 1001
    p = pidec()
    print "pi=", p
    Et voilà donc le résultat: Pi avec 1000 décimales. Calcul fait en 7 secondes environ:

    pi= 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989
    Vous pouvez vérifier les résultats ici: http://www.brouty.fr/Maths/pi.html

    Bon. je ne suis pas sûr que de calculer des nombres aussi grands soit d'un grand intérêt pratique, mais je vous souhaite de vous amuser autant que moi en le faisant...

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Si c'est comme ça j'y vais aussi de ma contribution à la fête ^^

    Voici ma méthode, basée sur la fomule de Ramanujan qui converge rapidement (http://fr.wikipedia.org/wiki/Srinivasa_Ramanujan):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # -*- coding: utf-8 -*-
    from decimal import *
     
    def pidec():
        getcontext().prec += 2
        n1 = 1
        n2 = 1103
        num = n1 * n2
        denom = 1
        n = 0
        r = Decimal(num) / denom
        old_r = 0
        while r <> old_r:
            old_r = r
            n += 1
            t = 4*n
            n1 *= t * (t-1) * (t-2) * (t-3)     # n1 = (4n)!
            n2 += 26390                         # n2 = 1103 + 26390n
            num = n1 * n2
            denom *= n**4 * 24591257856         # denom = (n!)**4 * (4*99)**(4n)
            r += Decimal(num) / denom
        result = 9801 / (2 * Decimal(2).sqrt() * r)
        getcontext().prec -= 2
        return result + 0
    Il n'y a que 126 itérations (pour une précision de 1000 chiffres) contre 1658 avec la méthode de tyrtamos (mais elles sont plus lourdes).

  3. #3
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Je trouve que de plus en plus sur ce forum, les messages vont de pi en pi...

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Tant qu'à parler d'algorithme à forte convergence, en voici un beau. Il est dû à Salamin et Brent (http://fr.wikipedia.org/wiki/Pi):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
     
    from decimal import *
     
    ##############################################################################
    def pidec():
        """Calcul de pi avec la précision demandé"""
        getcontext().prec += 2
        a1 = Decimal("1.0")
        b1 = Decimal("1.0")/Decimal("2.0").sqrt()
        p1 = Decimal("1.0")
        t1 = Decimal("0.25")
        eps = Decimal("1.0e-" + str(getcontext().prec-1))  # condition d'arrêt
        while True:
            a2 = (a1 + b1)/2
            b2 = (a1*b1).sqrt()
            p2 = 2*p1
            a12 = a1-a2
            t2 = t1-p1*a12*a12
            if abs(a2-b2)<eps:
                break
            else:
                a1, b1, p1, t1 = a2, b2, p2, t2
        ab = a2+b2
        res = (ab*ab)/(4*t2)
        getcontext().prec -= 2
        return res*1
    Pi avec 1000 décimales est calculé en 10 boucles et... 0.14 seconde.

    Pi avec 50000 (cinquante mille!) décimales est calculé en 16 boucles et un peu moins de 10 minutes (j'ai bien entendu vérifié le résultat avec http://www.brouty.fr/Maths/Deci/Piaa).

    Mais les boucles sont lourdes...

    Pour aller plus loin il faudrait que l'algorithme permette d'accroître le nombre de chiffres après la virgule, sans nécessiter de manipuler le grand nombre lui-même.

    Tyrtamos

    pour rambc: tant pi
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    pour rambc: tant pi
    C'est juste pi-toyable comme jeu de mots...

  6. #6
    Candidat au Club Avatar de Jazouki
    Homme Profil pro
    Collégien
    Inscrit en
    Janvier 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2017
    Messages : 1
    Points : 2
    Points
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
     
    from decimal import *
     
    ##############################################################################
    def pidec():
        """Calcul de pi avec la précision demandé"""
        getcontext().prec += 2
        a1 = Decimal("1.0")
        b1 = Decimal("1.0")/Decimal("2.0").sqrt()
        p1 = Decimal("1.0")
        t1 = Decimal("0.25")
        eps = Decimal("1.0e-" + str(getcontext().prec-1))  # condition d'arrêt
        while True:
            a2 = (a1 + b1)/2
            b2 = (a1*b1).sqrt()
            p2 = 2*p1
            a12 = a1-a2
            t2 = t1-p1*a12*a12
            if abs(a2-b2)<eps:
                break
            else:
                a1, b1, p1, t1 = a2, b2, p2, t2
        ab = a2+b2
        res = (ab*ab)/(4*t2)
        getcontext().prec -= 2
        return res*1
    Tu as utilisé quelle version de python pour ce programme ?

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par Jazouki Voir le message
    Tu as utilisé quelle version de python pour ce programme ?
    C'était en 2010: j'étais sous Python 2 à ce moment là. Probablement la v2.6 puisque la v2.7 n'est sortie qu'en juillet.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. Réponses: 26
    Dernier message: 12/09/2010, 15h00
  2. Réponses: 32
    Dernier message: 27/07/2010, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo