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

C++ Discussion :

Stocker un entier très grand


Sujet :

C++

  1. #1
    Membre habitué
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut Stocker un entier très grand
    Salut à tous!

    J'essaie de faire un programme pour trouver des nombres premiers, mais je suis confronté à un problème : comment faire pour stocker des nombres entier supérieurs à 2^64 - 1 (unsigned long long int)?

    Merci.

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hio,

    Il y a des librairies pour ça.

    Une des plus connues est GMP.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Sauf erreur, il n'y a pas vraiment moyen

    A moins que je ne dise une erreur, il n'est en effet pas prévu dans l'immédiat de rajouter un type plus grand que unsigned long long ...

    Tu peux toujours envisager de travailler avec un bitset, qui devrait te permettre de gérer de nombres de n'importe quelle ordre de grandeur, mais, tu restera fortement embêté pour arriver à le représenter en base décimale , et ce, sans même parler des soucis pour arriver à gérer les divisions

    Ceci dit, j'ai récemment (enfin, cela date d'il y a un mois ou deux) fait l'expérience avec un simple entier chez moi...

    Mon "vieux clou" (un "antique" Athlon 1700 XP) a mouliné pendant plus de 7 heures pour me trouver les nombres premiers entre 0 et UINT_MAX... puis j'ai abandonné

    Il parrait aussi que, avec 64 bits, on pourrait donner un numéro unique à chaque grain de sable présent sur terre... dés lors, estimes-tu réellement utile de vouloir aller plus loin
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Sauf erreur, il n'y a pas vraiment moyen
    Tu fais erreur, beaucoup de langages, comme le Python ou le Java, proposent des entiers et des flottants codés sur un nombre indéfini de bytes. Ce serait certainement très simple à implémenter en C++, mais je ne connais pas de biblio qui le fait.

  5. #5
    Membre habitué
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut
    De toute façon, c'est complètement inutile de trouver les nombres premiers, alors un truc inutile de plus...

    En fait je fais ça avec un pote, parce qu'on s'amuse à trouver les nombres entiers les plus grands possibles (hilarant... ) et là on en a trouvé un qui se rapproche de la valeur maximale que peut contenir un unsigned long long int et donc, il nous faut quelque chose qui peut stocker de plus grands nombres.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par zais_ethael Voir le message
    Tu fais erreur, beaucoup de langages, comme le Python ou le Java, proposent des entiers et des flottants codés sur un nombre indéfini de bytes. Ce serait certainement très simple à implémenter en C++, mais je ne connais pas de biblio qui le fait.
    Comme le l'ai indiqué, le fait est qu'il n'y ait aucun type prévu pour supporter plus de 64 bits dans la norme...

    Comme je l'ai indiqué aussi, il ne reste, à ma connaissance, que le bitset qui devrait permettre de faire coexister deux long long plus ou moins efficacement (car je crains qu'un tableau de deux entier long long ne vienne pas à ton secours sur ce coup)

    Le fait que certains langages puissent le permettre ne signifie nullement que tous les langages doivent le faire
    Citation Envoyé par bogoss91 Voir le message
    De toute façon, c'est complètement inutile de trouver les nombres premiers, alors un truc inutile de plus...

    En fait je fais ça avec un pote, parce qu'on s'amuse à trouver les nombres entiers les plus grands possibles (hilarant... ) et là on en a trouvé un qui se rapproche de la valeur maximale que peut contenir un unsigned long long int et donc, il nous faut quelque chose qui peut stocker de plus grands nombres.
    A la réflexion, il est vrai que tu devrais pouvoir arriver à tester des valeurs allant jusqu'à 128 bits, étant donné que seules les valeurs inférieures à la racine carrée du nombre sont à tester...

    Mais tu en resterais de toutes façons confronté au problème de la représentation en décimale du nombre trouvé... Seul l'hexadécimal aurait une chance de représenter quelque chose de plus ou moins compréhensible (et t'obligeant encore à te "palucher" la conversion hexa->decimal )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Le fait que certains langages puissent le permettre ne signifie nullement que tous les langages doivent le faire
    Ce n'est pas forcément intégré au langage, en Java c'est une simple classe. Alors en C++, avec la rédéfinition d'opérateurs et les transtypages implicites, ce serait on ne peut plus simple à utiliser. Et oui, je sais très bien que ce n'est pas intégré à la biblio standard , pour ce qu'elle contient de toutes façons...

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Dio,

    Citation Envoyé par bogoss91 Voir le message
    De toute façon, c'est complètement inutile de trouver les nombres premiers, alors un truc inutile de plus...

    En fait je fais ça avec un pote, parce qu'on s'amuse à trouver les nombres entiers les plus grands possibles (hilarant... ) et là on en a trouvé un qui se rapproche de la valeur maximale que peut contenir un unsigned long long int et donc, il nous faut quelque chose qui peut stocker de plus grands nombres.
    Si ça ne sert à rien, pourquoi tant de personnes se fatiguent à chercher de nouveaux algorithmes pour ça ?

    Je peux comprendre que ça ne te serve pas, mais ne fait pas de ton cas une généralité.

    Pour aller plus loin, il faut une librairie de calcul multi-précision, soit existante, comme GMP, déjà citée, soit faite maison (un assez gros travail si on veut qu'elle soit performante).
    Citation Envoyé par koala01 Voir le message
    Comme le l'ai indiqué, le fait est qu'il n'y ait aucun type prévu pour supporter plus de 64 bits dans la norme...

    Comme je l'ai indiqué aussi, il ne reste, à ma connaissance, que le bitset qui devrait permettre de faire coexister deux long long plus ou moins efficacement (car je crains qu'un tableau de deux entier long long ne vienne pas à ton secours sur ce coup)

    Le fait que certains langages puissent le permettre ne signifie nullement que tous les langages doivent le faire

    A la réflexion, il est vrai que tu devrais pouvoir arriver à tester des valeurs allant jusqu'à 128 bits, étant donné que seules les valeurs inférieures à la racine carrée du nombre sont à tester...

    Mais tu en resterais de toutes façons confronté au problème de la représentation en décimale du nombre trouvé... Seul l'hexadécimal aurait une chance de représenter quelque chose de plus ou moins compréhensible (et t'obligeant encore à te "palucher" la conversion hexa->decimal )
    Tu as tout faux en l'occurrence.

    Le bitset est sans le moindre doute une des pires solutions pour résoudre ce genre de problème.
    Si les cons volaient, il ferait nuit à midi.

  9. #9
    Membre habitué
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut
    J'ai téléchargé GMP mais j'ai pas du tout compris comment l'installer

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par droggo Voir le message
    <snip>
    Tu as tout faux en l'occurrence.

    Le bitset est sans le moindre doute une des pires solutions pour résoudre ce genre de problème.
    J'ai peu etre tord en parlant de bitset, je l'accorde, mais dans ce cas, quelle solution proposerais tu toi

    Par contre, je ne vois pas où, dans la citation que tu fais, j'ai tord en rappelant que l'on peut se contenter de tester les nombres plus petits que la racine carrée d'un nombre à tester, ni dans le fait que tu risque de toutes façons d'avoir des problème de représentation en base dix...

    En deux mots, je te serait gré d'être attentif à tes citations
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par bogoss91 Voir le message
    J'ai téléchargé GMP mais j'ai pas du tout compris comment l'installer
    Si tu travailles avec Gcc (mingw ou similaire), tu peux installer MSYS et te baser sur les explications que je fournis dans mon Guide de la Compilation de Gcc sous windows (en particulier compiler GMPlib)...

    Si tu travailles avec VC++, désolé, je ne suis pas assez habitué avec ce compilo pour pouvoir t'aider
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  12. #12
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Kio,
    Citation Envoyé par koala01 Voir le message
    J'ai peu etre tord en parlant de bitset, je l'accorde, mais dans ce cas, quelle solution proposerais tu toi

    Par contre, je ne vois pas où, dans la citation que tu fais, j'ai tord en rappelant que l'on peut se contenter de tester les nombres plus petits que la racine carrée d'un nombre à tester, ni dans le fait que tu risque de toutes façons d'avoir des problème de représentation en base dix...

    En deux mots, je te serait gré d'être attentif à tes citations
    A part le coup de la racine carrée, que j'ai oublié de couper, tu as tout faux, je me répète.

    La représentation décimale de grands nombres n'est pas plus difficile que celle des nombres plus habituels, c'est exactement le même algorithme qu'on utilise.

    Et il ne s'agit surtout pas de faire une représentation en base 10 dans les données stockées, rien de tel pour faire un programme qui rame.

    La solution est de faire un tableau d'un type unsigned (le plus grand supporté par le matériel, pas seulement par le compilateur), et de traiter les morceaux successivement, exactement comme on traite à la main notre représentation décimale.
    Il faut bien entendu ajouter un champ donnant la taille effectivement utilisée, et un autre donnant le signe.
    A partir de là, tu fais ce que tu veux.
    Si les cons volaient, il ferait nuit à midi.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    C'est pas très difficile de stocker un entier de grandeur aléatoire, il suffit de faire une liste chainée ou chaque noeud contient un short/int/long dépendant du nombre de digits qu'on veut par noeud, ensuite il te reste un sale boulot au niveau des algo d'addition/soustraction/multiplication/division/mod/etc. Mais sinon ça reste dans le monde du très possible!

  14. #14
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Gio,
    Citation Envoyé par xs4all Voir le message
    C'est pas très difficile de stocker un entier de grandeur aléatoire, il suffit de faire une liste chainée ou chaque noeud contient un short/int/long dépendant du nombre de digits qu'on veut par noeud, ensuite il te reste un sale boulot au niveau des algo d'addition/soustraction/multiplication/division/mod/etc. Mais sinon ça reste dans le monde du très possible!
    Une liste chaînée est une solution, mais un tableau est bien préférable dans ce cas, pour une question de temps d'accès aux données.

    Dans les calculs multi-précisions, le temps de calcul augmente vite si on utilise des nombres assez grands, et il faut rapidement faire une version suffisamment optimisée en vitesse, sinon on risque d'attendre les résultats un peu trop longtemps.
    Si les cons volaient, il ferait nuit à midi.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Ouais j'ai eu des mauvaise surprises avec les mutliplications... j'addtionnais n fois un nombre m... c'était vraiment trop long! Mais bon la mon algo semble faire le tout en O(lognlogn) (En fait, j'ai vraiment des doutes sur ma façon de calculer la complexité de mon algo étant donnée que la fft se fait en O(nlogn)...).

    Je vais revoir ma structure de donnée pour mettre le tout dans un tableau, je n'avais pas du tout pensé à ça! Ce serait beaucoup plus simple, je crois et plus rapide!

  16. #16
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par xs4all Voir le message
    Ouais j'ai eu des mauvaise surprises avec les mutliplications... j'addtionnais n fois un nombre m... c'était vraiment trop long! Mais bon la mon algo semble faire le tout en O(lognlogn) (En fait, j'ai vraiment des doutes sur ma façon de calculer la complexité de mon algo étant donnée que la fft se fait en O(nlogn)...).
    Utiliser des fft pour la multiplication n'est rentable que pour des très grands nombres. Il y a d'autres algo qui sont d'une complexité calculatoire intermédiaire entre le n carré de l'algo naïf et le N log N de l'utilisation des FFT mais avec en pratique des constantes telles qu'ils sont meilleurs dans la plupart des cas.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    J'ai une question aussi naïve que l'algo en n^2 au sujet des complexités. J'ai calculé mon algo en O(lognlogN) pour le calcul n*N où n et N sont les nombres, mais j'ai O(X*x) où X et x sont respectivement les longueurs de n et N. Si je veux comparer avec Karatsuba, fft ou autre, il utilise n comme étant le nombre ou le nombre de chiffre composant le nombre?

  18. #18
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par xs4all Voir le message
    J'ai une question aussi naïve que l'algo en n^2 au sujet des complexités. J'ai calculé mon algo en O(lognlogN) pour le calcul n*N où n et N sont les nombres, mais j'ai O(X*x) où X et x sont respectivement les longueurs de n et N. Si je veux comparer avec Karatsuba, fft ou autre, il utilise n comme étant le nombre ou le nombre de chiffre composant le nombre?
    Nombre de chiffres.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. Surcharge de l'opérateur / en c++ pour les entiers très grands
    Par marbouchi dans le forum Mathématiques
    Réponses: 1
    Dernier message: 05/05/2009, 00h08
  2. Surcharge de l'opérateur / pour les entiers très grands
    Par marbouchi dans le forum Débuter
    Réponses: 5
    Dernier message: 04/05/2009, 21h28
  3. Déclarer un (très) grand tableau?
    Par Cheos dans le forum C++
    Réponses: 8
    Dernier message: 17/02/2005, 17h43
  4. [SELECT sur 16 millions de lignes] délai très grand
    Par localhost dans le forum Requêtes
    Réponses: 6
    Dernier message: 22/11/2004, 17h04
  5. Une unité pour gérer des très grands nombres
    Par M.Dlb dans le forum Langage
    Réponses: 2
    Dernier message: 09/09/2003, 12h07

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