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

R Discussion :

PGCD de grand nombre avec R


Sujet :

R

  1. #1
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Décembre 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2011
    Messages : 61
    Points : 65
    Points
    65
    Par défaut PGCD de grand nombre avec R
    Bonjour,
    Voici mon problème: quelques fois dans mes programmes je suis amené à utiliser des fonctions mathématiques sur des grands nombres, et comme je veux éviter Python je me tourne vers R. Pour R j'ai trouvé la bibliothèque gmp et pour Python c'est natif, or le PGCD de mêmes grands nombres me donne un résultat différent ?!
    L'idée de calculer un pgcd je l'ai reprise d'un site où un enseignant de mathématiques utilisait Python comme outil pédagogique (les chiffres aussi ) : le lien
    Programme R
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/Rscript
    library(gmp)
    a<- as.bigz(295400101920462517154)
    b<-as.bigz(10720242531918724)
    # Vérification1 print(a)
    # Vérification2 print(b)
    gcd.bigz(29400101920462517154,10720242531918724)
    gcd.bigz(a,b)
    Résultat: 196 (pour les 2)
    Le programme Python
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    def pgcd(a, b):
        if b == 0:
            return a
        else:
            return pgcd(b, a%b)
    print(pgcd(295400101920462517154,10720242531918724))
    Résultat: 74
    Je vais sur un site qui accepte les grands nombres comme ici et il me dit que le PGCD est de 74 donc comme Python.
    Alors pourquoi R ne me donne pas 74 ? (je n'ai pas calculé à la main ce pgcd)
    Les universitaires et les scientifiques plébiscitent R donc je pense que j'ai fait une boulette quelque part !!!
    Merci de vos réponses

  2. #2
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    Bonsoir,
    R n'arrivera pas à te donner le bon résultat parce que ces nombres sont supérieurs au plus grand entier que R peut stocker (.Machine$integer.max).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > library(gmp)
    > mode(as.integer(295400101920462517154))
    [1] "numeric"
    Warning message:
    In mode(as.integer(2.95400101920463e+20)) : NAs introduced by coercion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    > mode(as.integer(10720242531918724))
    [1] "numeric"
    Warning message:
    In mode(as.integer(10720242531918724)) : NAs introduced by coercion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    > .Machine$integer.max - 295400101920462517154
    [1] -2.954001e+20
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    > .Machine$integer.max - 10720242531918724
    [1] -1.072024e+16
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    > .Machine$integer.max - as.bigz(295400101920462517154)
    Big Integer ('bigz') :
    [1] -295400101918315053057
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    > .Machine$integer.max - as.bigz(10720242531918724)
    Big Integer ('bigz') :
    [1] -10720240384435077

  3. #3
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Décembre 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2011
    Messages : 61
    Points : 65
    Points
    65
    Par défaut
    Merci... alors que puis je faire pour augmenter ce nombre?
    Linux CQ71 3.2.0-4-amd64 #1 SMP Debian 3.2.63-2+deb7u1 x86_64 GNU/Linux
    et
    processor : 0
    vendor_id : GenuineIntel
    cpu family : 6
    model : 23
    model name : Pentium(R) Dual-Core CPU T4300 @ 2.10GHz
    stepping : 10
    microcode : 0xa07
    cpu MHz : 1200.000
    cache size : 1024 KB
    physical id : 0
    siblings : 2
    core id : 0
    cpu cores : 2
    apicid : 0
    initial apicid : 0
    fpu : yes
    fpu_exception : yes
    cpuid level : 13
    wp : yes
    flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm xsave lahf_lm dtherm
    bogomips : 4188.95
    clflush size : 64
    cache_alignment : 64
    address sizes : 36 bits physical, 48 bits virtual
    Je dois investir dans un autre ordinateur ou ça ne changerait rien?
    (Pour l'instant je vais rester sous Perl pour mes opérations mathématiques)
    Encore merci

  4. #4
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    Ma proposition est d'écrire une fonction en C qui fait le travail et de l'appeler en R.
    Voir ce lien pour une petite introduction et celui-ci pour plus de détails.

  5. #5
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Décembre 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2011
    Messages : 61
    Points : 65
    Points
    65
    Par défaut
    Oui, mais je vois pas l'intérêt... Je voulais faire du R pour des fonctions mathématiques (un langage script approprié) ; mais si je dois passer par du C, je ne vois plus l'intérêt de faire du R.

  6. #6
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    L'un des 2 nombres est supérieur à 264, donc même en C les uint64_t (unisigned long long) vont être dépassés. La solution passe donc par une bibliothèque spécialisée (ou une implémentation manuelle de la manipulation de très grands nombres) et tu avais bon dès le premier message ! GNU MP est excellent dans ça et a un wrapper dans R, celui que tu as indiqué (il appelle du code C à ta place).
    Alors, dans le code que tu avais envoyé, le problème était que tu appelais les fonctions de manipulation des entiers de R avant celles de GMP. Dans la ligne as.bigz(295400101920462517154), R évalue d'abord ce qui est entre parenthèses avant d'évaluer l'appel à la coercition. Or le mode (type) qui va être attribué à 295400101920462517154 est numeric. Ainsi le dépassement de la capacité de stockage des nombres sera déclenché avant l'usage de GMP.
    C'est en lisant la doc du GMP en C que je me suis rendu compte que les entrées de grands nombres peuvent se faire comme des chaînes de caractères. Et as.bigz fournit cette possibilité. Le code qui va avec tout ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > library("gmp")
    > gcd(as.bigz("295400101920462517154"), as.bigz("10720242531918724"))
    Big Integer ('bigz') :
    [1] 74

Discussions similaires

  1. Générer un grand nombre avec UnitGInt
    Par fermat dans le forum Delphi
    Réponses: 15
    Dernier message: 25/01/2015, 21h37
  2. Grands nombres avec RandomRange
    Par fermat dans le forum Débuter
    Réponses: 1
    Dernier message: 19/08/2008, 15h00
  3. grand nombre avec CamL
    Par MacCamL dans le forum Caml
    Réponses: 3
    Dernier message: 28/04/2008, 15h44
  4. declarer un nombre plus grand qu'avec int?
    Par menzeli dans le forum C
    Réponses: 14
    Dernier message: 05/01/2007, 00h14
  5. Réponses: 8
    Dernier message: 21/11/2005, 17h18

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