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 :

Résultat mathématique étonnant


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut Résultat mathématique étonnant
    Bonjour étant en apprentissage de python, je fais quelques exercices très basique.

    Je voulais par exemple trouver le résultat de 2A² = C² tel que A et C soit des entiers.

    Le programme m'a trouvé le couple suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A= 93222358
    C= 131836323
    Mais pour contrôler je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print(2*(93222358*93222358))
    17380816062160328
    mais si je fais (131836323)² j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print(131836323 * 131836323)
    17380816062160329


    donc j'ai bien un de différence de 1.

    Là je me dis c'est mon code qui déraille mais par acquis de conscience je fais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print(sqrt(17380816062160328))
    131836323.0
    donc c'est quand même bien juste

    et si je fais par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print(sqrt(17380816062190328))
    131836323.00011377
    Je trouve cela étonnant.

    car

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print(sqrt(173))
    13.152946437965905


    Il y aurait donc une limite au nombre utilisable pour sqrt() ?

    Merci de vous être penché sur mon problème

  2. #2
    Membre Expert
    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
    Par défaut
    En Python, la précision des entiers n'est pas limitée, mais la fonction sqrt opère sur des flottants, qui eux ont une précision limitée. Lors de l'appel de sqrt, l'entier est converti en flottant et une perte de précision a lieu si l'entier est trop grand.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> float(17380816062160329)
    17380816062160328.0
    L'idéal serait de trouver la solution sans passer par une conversion en flottant, c'est à dire sans passer par sqrt.

  3. #3
    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,

    On peut utiliser la méthode de Heron d'Alexandrie (2000 ans!) qui est très efficace pour calculer la racine entière d'un nombre entier sans jamais convertir en flottant: http://fr.wikipedia.org/wiki/M%C3%A9thode_de_H%C3%A9ron.

    Voilà la version que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def lrac2(x):
        """Racine carrée entière d'un nombre entier x (méth. de Héron d'Alexandrie)"""
        r1 = 1
        while True:
            r2 = (r1+x//r1)>>1
            if abs(r1-r2) < 2:
                if r1*r1 <= x and (r1+1)*(r1+1) > x:
                    return r1
            r1 = r2
    Mais, bien sûr, si x n'est pas un carré parfait, la racine n'est que la partie entière de la vraie racine.

    On peut cependant faire des choses étonnantes avec de grands entiers:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x = 4112508058167862726684138187739243495869080430700517 
    print lcar2(x)
    64128839519890446296697044
    On peut aussi faire le calcul de la racine entière avec une méthode par dichotomie. C'est en plus généralisable à la racine nième (http://python.jpvweb.com/mesrecettes...racine_entiere)

    On peut aussi travailler avec le module decimal qui permet de faire des calculs en flottant avec une précision arbitraire.

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par JiPhi75 Voir le message
    Bonjour étant en apprentissage de python, je fais quelques exercices très basique.

    Je voulais par exemple trouver le résultat de 2A² = C² tel que A et C soit des entiers.


    (...)
    Hello,
    si tu réussis, ça sera effectivement un résultat mathématique étonnant

    tu cherches à trouver deux entiers A et C tels que a/c = sqrt(2) ... tu prouverais que sqrt(2) est un rationnel ...

    Tout va dépendre de ton code ... les flottants ne sont pas assez précis pour calculer avec de grands entiers, en général.

  5. #5
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Ce serait pas plutôt c/a = sqrt(2)*?

    Mais effectivement, c’est bien vu, la recherche risque de durer… ad vitam æternam*!

  6. #6
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par mont29 Voir le message
    Ce serait pas plutôt c/a = sqrt(2)*?

    Mais effectivement, c’est bien vu, la recherche risque de durer… ad vitam æternam*!
    ooops effectivement

    Wheeler disait «ne jamais faire un calcul avant d'en connaître le résultat», mais bon là ce n'est pas de la physique.

  7. #7
    Membre éprouvé

    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
    Par défaut
    Bonsoir,
    au passage un petit programme tout bête pour montrer les problèmes inhérents aux nombres flottants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #! /usr/bin/env python
    #coding=utf-8
     
    i = 1
     
    A = 1.0
    while ((A + 1.0) - A == 1.0):
        i += 1
        A *= 2
     
    print(i)

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rambc Voir le message
    Bonsoir,
    au passage un petit programme tout bête pour montrer les problèmes inhérents aux nombres flottants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #! /usr/bin/env python
    #coding=utf-8
     
    i = 1
     
    A = 1.0
    while ((A + 1.0) - A == 1.0):
        i += 1
        A *= 2
     
    print(i)
    Plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #! /usr/bin/env python
    #coding=utf-8
    print "%.15f" % 9.95
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre éprouvé

    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
    Par défaut
    Bonjour,
    c'est vrai que c'est plus simple.

    L'intérêt de l'exemple dans mon post c'est qu'il montre aussi de façon courte la différence entre algorithme et programme.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut
    désolé de répondre si tard...

    Merci pour toutes les précisions

    et effectivement, plutôt obnubilé par la création d'une boucle et l'obtention d'un résultat "bizarre" (que je comprends maintenant). J'ai oublié de faire une simple analyse du problème et de voir qu'effectivement il ne pouvait y avoir de résultat.

    Nbre rationnel/Nbre rationnel = donnera toujours un nombre rationnel
    et sqrt(2) est un nombre irrationnel

  11. #11
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Attention, comme la question est posée il y a une solution le couple (0,0) ...

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut
    effectivement 2*(0²) = 0² semble juste car donne 2 *(0*0) = (0*0) donc 2*0 = 0

    mais puisque 2A² = C² est égale C/A = sqrt(2) si on remplace C par 0 et A par zéro

    donc est-ce vrai aussi pour (0/0) = sqrt(2) ?



    PS : je sors du sujet sur lequel j'ai déjà eu ma réponse.

  13. #13
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par JiPhi75 Voir le message
    effectivement 2*(0²) = 0² semble juste car donne 2 *(0*0) = (0*0) donc 2*0 = 0

    mais puisque 2A² = C² est égale C/A = sqrt(2) si on remplace C par 0 et A par zéro

    donc est-ce vrai aussi pour (0/0) = sqrt(2) ?



    PS : je sors du sujet sur lequel j'ai déjà eu ma réponse.
    si tu as deux réels qui vérifient 2A²=C² tu peux diviser par A ssi A est non nul ... donc non

  14. #14
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Je ferais probablement mieux de laisser un prof de math répondre, mais il me semble que la division par zéro est «*interdite*»…

    Je me rappelle d’ailleurs un S&V Junior dans lequel ils s’amusaient à démontrer que 1+1 = 3 (ou un truc de ce goût là), justement grâce à une division par zéro dans une des étapes de leurs démonstration…

  15. #15
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Voir Wikipedia
    Ce qui est vrai pour l'algèbre n'est pas forcément 'ailleurs' car l'impossibilité (et non l'interdiction, les maths n'ont pas fonction de "police") y est définie par:

    Or, la division s'entend comme l'opération réciproque de la multiplication. Diviser x par y, c'est chercher l'élément z tel que z*y=x. Or, comme on vient de le voir, si y vaut 0 et x est un nombre autre que zéro, aucun nombre z ne peut satisfaire une telle propriété. Si y est 0 et x aussi, z peut être n'importe quoi.
    Mais pour l'informatique, la chose est définie ainsi le par standard IEEE 754:
    Tout nombre positif non-nul divisé par 0 donne Inf (l'infini), tandis qu'un nombre négatif donne -Inf. Cependant il est aussi prévu que le diviseur ait une valeur de zéro, tout en ayant son signe négatif (-0). Dans ce cas, le signe de l'infini est inversé. Techniquement, cela vient du fait que dans le codage des nombres à virgule flottante en informatique, un bit indique si le nombre est positif ou négatif, les autres bits représentant la valeur absolue. En fait, excepté quand on calcule avec des nombres complexes, la division par zéro est quasiment le seul cas où la distinction +0/-0 prend une importance.
    Dans tous les cas, il est préférable de réfléchir un peu avant de coder.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  16. #16
    Membre éprouvé

    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
    Par défaut
    Je confirme qu'il est interdit de diviser par zéro, et que pour passer de 2A² = C² à C/A = sqrt(2) il faut absolument supposer A non nul.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut
    donc le couple (0,0) est à exclure car sans le savoir l'équation 2A² = C² sousd entend que A ne doit pas être égal à 0 (ce qui est différent de nul en informatique)

  18. #18
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Non.

    avec A et C des entiers naturels,

    l'équation 2A²=C² a exactement une solution (A,C)=(0,0)
    l'équation C²/A²=2
    1. impose A non nul pour être valide
    2. Si A est non nul alors
    résoudre C²/A²=2 revient à résoudre 2A²=C², avec A non nul
    2A²=C² a pour unique solution (0,0) or A doit être non nul
    Donc C²/A²=2 n'a aucune solution pour A et C des entiers naturels.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut
    Oui je comprends bien cela mais j'en reviens donc à mon titre.

    Le résultat est étonnant puisque Si 2A² = C² est équivalent à dire racine carré de 2 = C/A
    mais 2*(0²) = 0² n'est pas équivalent à racine carré de 2 = 0/0 car impossible

    je sais que c'est vrai mais néanmoins je trouve cela étonnant. Bien qu'en y réfléchissant cela doit être fréquent avec le 0

  20. #20
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par JiPhi75 Voir le message
    Oui je comprends bien cela mais j'en reviens donc à mon titre.

    Le résultat est étonnant puisque Si 2A² = C² est équivalent à dire racine carré de 2 = C/A
    mais 2*(0²) = 0² n'est pas équivalent à racine carré de 2 = 0/0 car impossible

    je sais que c'est vrai mais néanmoins je trouve cela étonnant. Bien qu'en y réfléchissant cela doit être fréquent avec le 0
    Justement, ce n'est pas équivalent. Mais il y a deux problèmes bien distincts :

    * tu ne peux pas passer de 2A²=C² à 2=C²/A² sans préciser «pour A non nul»
    * ton programme met en évidence que les calculs effectués avec des nombres dont la précision est limitée peut donner des résultats faux.
    cette dernière remarque est surtout à prendre dans le sens : le domaine de validité de ton programme est limité par la représentation des nombres, donc il ne faut pas interpréter les résultats hors du domaine.

Discussions similaires

  1. Problème de résultat d'une opération mathématique
    Par Porkipic dans le forum Débuter
    Réponses: 12
    Dernier message: 03/03/2014, 15h37
  2. Afficher les résultats exacts mathématiques GTK
    Par ampholyte dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 09/01/2013, 09h16
  3. [PHP 5.2] preg_replace et accent : Résultat étonnant
    Par neojick dans le forum Langage
    Réponses: 9
    Dernier message: 27/04/2010, 12h32
  4. rewriting / Erreur d'URL.. un résultat étonnant
    Par Joe Le Mort dans le forum Dépannage et Assistance
    Réponses: 2
    Dernier message: 10/08/2006, 09h09

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