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

Calcul scientifique Python Discussion :

précision math module


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut précision math module
    Bonjour,
    si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from math import *
    a = 71641520761751435455133616475667090434063332228247871795429L
    b = long(sqrt(a))
    print (a-b*b)
    je suis assez déçu du résultat...
    est il possible d'obtenir un calcul avec une précision à l'unité près ? Quelle est la précision en base des fonctions du module math ?
    François

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Le module math calcule avec des flottants double précision (ceux du 'C').

    Dans ton cas, tu peux obtenir une bonne précision avec le module "decimal":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    import decimal
    decimal.getcontext().prec = 100  # on fixe 100 chiffres significatifs (28 par defaut)
    n = decimal.Decimal(71641520761751435455133616475667090434063332228247871795429L)
    r = n.sqrt()
    Ce qui donne comme résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    r = 267659337146589069735395147283.3890881947405002610436510067721334911227900345873080152600596909928664
    abs(n-r*r) = 2E-41
    Ça ira comme précision?

    Il existe aussi sur le web des algorithmes pour calculer la racine entière d'un nombre entier, et il est même amusant d'en inventer d'autres .

    Tyrtamos

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut
    Merci tyrtamos ,
    je ne connaissais pas ce module. C'est exactement ce que je cherchais. Je vais me documenter dessus. Et pour la manipulation de grands entiers, il y a un module qui permet de fixer la précision voulue ?
    n c'était le RSA-59.

    François

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    En ce qui concerne le module decimal, il est puissant sans être pratique à utiliser. Il est surtout utile quand on ne veut pas avoir d'incertitude sur les derniers chiffres comme on peut en avoir avec les flottants (0.1 => 0.10000000000000001), par exemple dans les domaines financiers.

    Pour ce qui concerne les nombres entiers longs, il n'y a besoin d'aucun module supplémentaire, et le nombre de chiffres significatifs n'est limité que par la mémoire de l'ordinateur.

    Par exemple, factorielle de 10000 est calculé en moins d'une seconde, et donne un résultat composé de 35660 chiffres...

    Si ce genre de pb t'intéresse, tu peux regarder quelques applications arithmétiques sur mon site: http://python.jpvweb.com/mesrecettes..._arithmetiques.

    Tu peux même les faire fonctionner dans ma calculatrice "Calculext": http://python.jpvweb.com/mesrecettespython/calculext, ou même essayer sur la version en ligne sur le web (mais temps de calcul limité à 8 secondes): http://calculext.jpvweb.com/.

    Tyrtamos

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut
    Ok,

    très bien ta calculatrice et ton site. Je l'ai adoptée après test. Parfaite pour ce que je veux faire sur le coin de mon bureau Par contre, je pensais en la testant que le test premier ou non serait un test proba. Après lecture sur ton site, je crois qu'elle cherche un facteur en fait pour donner une réponse correcte à 100%. Je regarderai peut être pour ajouter un truc style Rabbin Miller pour avoir une réponse rapide. Maintenant, je n'ai plus d'excuse pour tester ma méthode de factorisation. Je vais me faire les dents sur le RSA-59 pour commencer En fait, je n'ai pas besoin de beaucoup de calcul mais d'une précision quasi parfaite sur des flottants (ouais, je sais c'est curieux pour un problème de factorisation d'entiers )
    Merci encore,
    François

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour et meilleurs voeux!

    Si tu es toujours intéressé par un test de Miller Rabin, je viens d'en terminer un. Il est ici:

    http://python.jpvweb.com/mesrecettespython/est_premier.

    Effectivement, il est très efficace: 15 secondes pour tester si un nombre de 600 chiffres est premier...

    Je vais maintenant m'attaquer aux méthodes de factorisation.

    Tyrtamos

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Module et changement de précision
    Par deadhand dans le forum Fortran
    Réponses: 2
    Dernier message: 08/06/2010, 14h49
  2. précision, math et Bigdecimal
    Par polymorphisme dans le forum Général Java
    Réponses: 9
    Dernier message: 08/10/2009, 11h47
  3. Besoin de précision pour module DBD::mysql
    Par mensoif dans le forum SGBD
    Réponses: 7
    Dernier message: 10/08/2009, 12h50
  4. Réponses: 2
    Dernier message: 11/07/2007, 20h31

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