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 :

Manipulation de très grands nombres


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 64
    Par défaut Manipulation de très grands nombres
    Salut,

    C'est encore moi

    Je reviens vers vous car je cherche à manipuler un nombre de 645 chiffres, sauf que celui-ci est bien trop grand pour ma machine, visiblement. Donc j'ai cherché en ligne, et excepté des méthodes un peu complexes du style :
    • Utiliser gmp.
    • Jouer avec des chaînes de caractères et des malloc().


    Eh bien je n'ai pas trouvé grand-chose, excepté ceci : long double Flottant double long 10 3.4*10^-4932 à 3.4*10^4932

    Du coup je ne comprends pas pourquoi le compilateur refuse de compiler, car sauf erreur un nombre à la puissance 4932 fait bien plus de 645 caractères...

    Bref, si vous confirmez que le lien ci-dessus indique une bêtise - ou que j'ai mal compris - je vais me lancer dans des manipulations complexes, n'empêche que je suis étonné que le compilateur refuse de compiler.

    Apluss'

    PS : petite anecdote aussi : Windows semble ne pas gérer l'affichage des long double (%Lf, etc...).
    PS 2 : j'ai des camarades qui s'en sortent avec Java, mais je n'aime pas ce langage.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Et on peut voir ton code ?

  3. #3
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    Citation Envoyé par .....1..... Voir le message
    Salut,
    Je reviens vers vous car je cherche à manipuler un nombre de 645 chiffres, sauf que celui-ci est bien trop grand pour ma machine, visiblement.
    Du coup je ne comprends pas pourquoi le compilateur refuse de compiler
    il faudrait donner plus de précision on n'est pas madame soleil...
    1) de quelles manipulations s'agit-il ? Oui malloc peut suffire en stockant des chaïnes de caractères cependant le problème c'est qu'il faut convertir les chiffres qui composent le nombre en caractères et vice-versa.
    Donc voir ce que cette bibliothèque GMP peut apporter de pertinent

    2)le compilateur refuse de compiler : quel est le message d'erreur ?

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 64
    Par défaut
    Salut, merci pour vos réponses.

    @Bktero tu veux voit tout le code ? Car voici comment je déclare ce fameux nombre : long double key = 29999[...];

    @Mat.M oui c'est curieux je m'attendais pourtant à trouver madame soleil...

    Alors voici le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    warning: integer constant is too large for its type
    long double key = 29999[...];
                                                      ^~~~~~~~~~~~~~~~~~~[...]
    Je chercher à trouver de quels deux nombres premiers ce nombre (key - clé RSA -) est le produit).

    J'utilise d'ailleurs l'opérateur modulo, mais visiblement le type de la donnée ne lui plait pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    error: invalid operands to binary % (have 'long double' and 'long double')
    reste = key%i;
               ^

  5. #5
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 736
    Par défaut
    Bonjour.

    Lors de la déclaration, tu mets bien le suffixe L (12345L) ? Car sinon un entier (bien trop grand pour la machine) est créé puis converti en long double.

    L'opérateur modulo ne fonctionne que sur des entiers. l'équivalent pour flottant est la fonction fmod.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    C'est quoi ce [...] ?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Tu peux tenter un uint64_t vis stdint. Mais est-ce que ta machine le supporte ? Est-ce suffisant ?

    Manipuler de tels nombres est difficiles, c'est bien pour ça qu'il existe GMP. Utiliser GMP est le plus simple, ne pas savoir le faire ne présage rien de bon..
    Comment peux-tu en arriver à devoir manipuler de tels nombres en étant clairement un débutant ?
    Camarades, donc étudiants et exercices. De quelles manipulations parle-t-on ? Tu peux sûrement t'en sortir pour recréer des opérations simples et l'afficher (ce serait une simple chaîne de caractères), mais c'est bien tout.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 64
    Par défaut
    @Daïmanu non je ne l'avais pas mis, mais même après cela j'obtiens la même erreur...mais en quoi cela aurait pu résoudre le problème si le nombre est trop grand pour la machine ? Et merci pour fmod.

    @Bktero ça symbolise le fait que j'ai coupé le reste : je ne vais pas écrire le nombre de 645 chiffres, ni la suite de tous les '~~~~~' que j'obtiens dans le message d'erreur...

    @Bousk merci, j'essaierai ta première suggestion. Concernant GMP j'ai bien précisé au début que je ne m'y étais pas encore attaqué et que je le ferai si cela s'avère nécessaire. Sinon comme je l'ai dit le but est de casser une clé RSA en retrouvant les deux nombres premiers dont le produit donne la clé en question.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Tu peux tenter un uint64_t vis stdint. Mais est-ce que ta machine le supporte ? Est-ce suffisant ?
    264 est largement inférieur à 10645, donc non ce ne sera pas suffisant.

    Ce qui rend le reste de ton message d'autant plus important: Utiliser GMP.
    C'est la référence quand il s'agit de manipuler des Grands Entiers.

    PS: long double, ça reste des nombres à virgule flottante, donc si pseudo-à-coucher-dehors a besoin de précision à l'unité près, ce n'est pas la peine. Surtout sous Windows: Visual C++ ne les supporte pas réellement (c'est juste un alias de double, donc à peine 53 bits de mantisse) et MinGW les fait à 80 bits (63-64 (?) bits de mantisse).

    Edit: C'est pour de la cryptographie? (quelle surprise, c'est le champ numéro un concernant l'utilisation de Grands Entiers...) Alors la précision à l'unité près est obligatoire, donc tu oublies tous les types standards du C et tu prends GMP.
    Edit2: Ou bien tu changes de langage. Le C# supporte une classe BigInteger depuis le .Net Framework 4.0.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Manipulation de très grands nombres
    Par BernardT dans le forum Langage
    Réponses: 6
    Dernier message: 07/07/2006, 16h26
  2. Précision d'un très très grand nombre
    Par sniperseb dans le forum Langage
    Réponses: 6
    Dernier message: 05/04/2006, 19h38
  3. Réponses: 2
    Dernier message: 22/12/2005, 18h16
  4. Trés grand nombre
    Par rteuteu55 dans le forum C++Builder
    Réponses: 10
    Dernier message: 15/11/2005, 11h28
  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