Partage
  • Partager sur Facebook
  • Partager sur Twitter

Super gros nombres

Ouch...

    18 novembre 2007 à 19:59:13

    Bonjour tout le monde!
    Alors, comme indiqué dans le titre, j'ai besoin d'utiliser des variables capables de contenir des supers gros nombres. Je sais qu'un sujet existe déjà, mais j'ai pas bien compris et j'aime pas squatter.
    Tout d'abord vous devez savoir que je n'ai que les bases du C. Donc, si vous donnez une technique, merci d'expliquer tout dans les détails (quitte a en faire trop)

    Je veux donc faire des super grosses variables (pour infos c'est pour des nombres premiers, meme si je me doute que des progs qui les calculent existent déjà). Est ce qu'il y a moyen de faire ca avec malloc ? (au passage je n'ai pas bien compris si avec malloc on peut creer des variables de types classiques mais plus grosses...)
    Sinon, comment créer son type de variable?

    Un grand merci d'avance
    Toineo
    • Partager sur Facebook
    • Partager sur Twitter
      18 novembre 2007 à 20:13:14

      Salut Davidbrcz, mici pour l'adresse.
      Cependant, n'etant pas très anglophone, pourrait tu me dire ce que je dois faire?
      Encore merci
      Toineo
      • Partager sur Facebook
      • Partager sur Twitter
        18 novembre 2007 à 20:20:30

        Vais essayer...
        sinon comment fait-on pour creer une variable d'un type defini par GMP ? (vous l'avais dit, je suis nul... :p )

        Toineo
        • Partager sur Facebook
        • Partager sur Twitter
          18 novembre 2007 à 20:24:03

          Fais une recherche, j'avais posté un code d'exemple
          • Partager sur Facebook
          • Partager sur Twitter
            18 novembre 2007 à 20:24:59

            Citation : Dr-Jackal

            Apprendre l'anglais. ;)



            Faut pas abuser non plus, comprendre l'anglais c'est bien mais traduire un site entier avec des termes techniques, bonjour les dégats même si tu es en unif option langue.
            • Partager sur Facebook
            • Partager sur Twitter
              18 novembre 2007 à 20:29:18

              Quand j'ai dis apprendre l'anglais c'était à moitié ironique. Je sais bien que ça s'apprend pas comme ça mais connaitre certains termes pour avoir une idée générale d' un texte peut aider.
              • Partager sur Facebook
              • Partager sur Twitter
                18 novembre 2007 à 20:54:45

                Citation : Pole

                Fais une recherche, j'avais posté un code d'exemple



                Cet exemple est ici. Je l'avais commenté, à toutes fins utiles, .

                À voir les questions que tu poses (mais il n'y a nulle offense dans mon propos), je pense que tu es largement débutant en C et personnelement, je ne te déconseille de te lancer dans l'apprentissage de GMP maintenant (surtout si tu as une réticence vis-à-vis de l'anglais et pire si t'es sous MS-Windows), sans doute arriverais-tu à effectuer une grande multiplication mais sauras-tu exploiter la bibliothèques dans des contextes variés (et même simples) ? pas si sûr. Enfin, je dis ça mais je peux me tromper.

                Sinon, si tu as besoin de faire des calculs simples avec des grands nombres, une multiplication comme à l'école primaire par exemple, je t'invite à essayer de le coder par toi-même, c'est assez facile, il te suffit d'imiter ce que tu avais appris étant enfant. Par besoin de malloc si tu acceptes de te limiter à des nombres de taille donnée et pas trop grands (disons que quelques centaines de chiffres décimaux, ça passera sans problème sur un PC). Surtout, vise SIMPLE, pas de sophistication dans un premier temps, pas d'optimisations.

                EDIT


                Citation : Dr-Jackal
                Apprendre l'anglais. ;)


                Faut pas abuser non plus, comprendre l'anglais c'est bien mais traduire un site entier avec des termes techniques, bonjour les dégats même si tu es en unif option langue.
                Stoppons !! (la POP-programmation, anti-windows, ...) En savoir plus..
                Image utilisateur
                Image utilisateur



                Citation : Dr-Jackal

                Quand j'ai dis apprendre l'anglais c'était à moitié ironique.


                Moi, c'est ce que j'avais compris.
                • Partager sur Facebook
                • Partager sur Twitter
                  18 novembre 2007 à 21:07:29

                  Salut candide, et merci pour tes conseils et les liens.
                  Enfin, bon j'arrive quand même a comprendre l'anglais, je te rassure. D'ailleurs j'ai trouvé la GMP, mais j'arrive pas a l'installer (je tourne sous XP (mais je me soigne)). J'ai cru comprendre que je devais utiliser cygwin, mais j'y arrive pas... comment faire?

                  Pour te repondre je suis pas completement débutant, j'en fais depuis quelques années mais je me suis toujours cantonné dans les bouquins pour débutant et j'ai jamais approfondi. Pour te donner une idée je maitrîse presque tout ce qu'il y a dans les parties I et II du tuto de ce site sur le C.
                  Pour la GMP je ne compte pas (encore?) l'utiliser pour autre chose que notre histoire de grand nombres.

                  Citation : candide

                  (mais il n'y a nulle offense dans mon propos)


                  Je n'en cherchais pas! ;)

                  Citation : candide

                  et pire si t'es sous MS-Windows


                  Comme dit plus haut, malheuresement oui... :euh:

                  Citation : candide

                  si tu acceptes de te limiter à des nombres de taille donnée et pas trop grands (disons que quelques centaines de chiffres décimaux, ça passera sans problème sur un PC)


                  Oui enfin les types basiques sont limités a 2 milliards et des poussieres (EDIT : certes 4 pour unsigned mais il faut que mon entier soit signé), et sinon quand j'essaye d'utiliser double comme entier, j'ai quelques bugs. Donc comment fais-tu?

                  Mici de ta comprehension
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 novembre 2007 à 21:12:39

                    un tableau de char?
                    ta propre fonction?
                    les opérateurs logique?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 novembre 2007 à 21:23:45

                      @micheal :
                      -un tableau de char : ouki mais je ne sais pas l'utiliser comme une seule variable
                      -ma propre fct : je ne sais pas en faire qui resolve mon prob
                      -les operateurs logiques : comment peuvent-ils m'aider?

                      Tu vois, je suis pas bon...si tu peux me donner un exemple pour les choses que tu as proposé je te serais très reconnaissant.

                      Toineo
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 novembre 2007 à 22:12:56

                        Juste, tu voudrais pas m'expliquer comment utiliser une chaine comme variable?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 novembre 2007 à 22:20:41

                          Citation : Toineo


                          Oui enfin les types basiques sont limités a 2 milliards et des poussieres (EDIT : certes 4 pour unsigned mais il faut que mon entier soit signé), et sinon quand j'essaye d'utiliser double comme entier, j'ai quelques bugs. Donc comment fais-tu?


                          Tu n'as pas compris, oublie les double, il faut que tu refasses tout toi même, tu dois créer des objets qui seront tes nombres et implémenter tout toi-même les opérations sur ces objets.

                          Si tu veux faire simple, définis un "grand nombre" comme étant un tableau de int, un exemple contextualisé :

                          1. #define NB_CHIFFRES 100
                          2. void produit(int a[NB_CHIFFRES], int b[NB_CHIFFRES], int resultat[NB_CHIFFRES])
                          3. {
                          4.   /* Ecrire le code qui permet d'écrire le produit de deux entiers comme on le fait eu CE1-CE2.
                          5.    */
                          6. }
                          7. int main(void)
                          8. {
                          9.   /* ci-dessous, deux "grands nombres" a 24 chiffres chacun si j'ai bien compté */
                          10.   int grand_nombre1[NB_CHIFFRES] =
                          11.     { 3, 5, 7, 0, 5, 6, 8, 6, 4, 7, 9, 6, 3, 1, 8, 0, 0, 2, 4, 5, 5, 7, 8, 9 };
                          12.   /*
                          13.      comprendre que le chiffre des unités est 3, le chiffre des dizaines est 5,
                          14.      des centaines 7, etc
                          15.    */
                          16.   int grand_nombre2[NB_CHIFFRES] =
                          17.     { 2, 4, 6, 3, 4, 8, 9, 0, 0, 0, 1, 4, 2, 8, 7, 1, 2, 7, 1, 0, 0, 0, 6, 4 };
                          18.   int resultat[NB_CHIFFRES];
                          19.   /* Savoir, que grosso modo, le nombre de chiffres du résultat
                          20.   c'est la somme des nombres des chiffres des deux nombres
                          21.    */
                          22.   produit(grand_nombre1, grand_nombre2, resultat);
                          23.   /* ecrire le code pour afficher résultat */
                          24.   return 0;
                          25. }


                          Citation : Toineo

                          Juste, tu voudrais pas m'expliquer comment utiliser une chaine comme variable?


                          Pas utile dans un premier temps.

                          Sinon, si ton but est d'apprendre le C, je te déconseille de te lancer dans ce genre de programme, c'est amusant mais ça n'apprend pas le langage (et visiblement, tu sembles ne pas maîtriser certaines choses élémentaires).
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 novembre 2007 à 22:36:26

                            Re candide,
                            merci pour ton code. Cependant, (si j'ai bien compris), tu veux utiliser un tableau, definit et dont la valeur est attribuée dans le code source. Or ce n'est pas tout a fait ce que je voudrais faire (dans l'ideal).

                            En fait je voudrais créer une variable par exemple de 16 octets (normalement il y a de la place avec ca, mais je dis au pif, parce que c'est 4 fois plus grand qu'un int sur ma machine...) et qui prendrait, lors de l'execution, selon les desirs de l'utilisateur, une valeur potentiellement enorme. Voila

                            Sinon a propos du prog en lui meme, (que j'ai fait pour l'instant avec un int), moi je trouve que j'ai appris pas mal de choses avec ca, ou du moins que j'ai appris a bien les utiliser.

                            Et derniere chose, où (ca peut etre un bouquin, j'aime bien :) ) puis-je apprendre les choses elementaires qui me manque?

                            Encore merci
                            Toineo

                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 novembre 2007 à 22:44:01

                              candide, je pense qu'utilisés les opérateurs logique sera plus "propre","fiable","rapide".
                              Avec eux tu peux écrire bit à bit et au final faire le nombre que tu veux...après suffit de faire la fonction qui va lire de telle bit à telle bit et un simple tableau de char (ou du type que tu veux...).
                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 novembre 2007 à 23:36:38

                                Citation : Toineo

                                Re candide,
                                tu veux utiliser un tableau, definit et dont la valeur est attribuée dans le code source.


                                C'est un nombre maximal de chiffres, qui devrait suffire aux besoins courants et ce n'est pas vraiment une limitation, j'ai dit ça pour te simplifier le code.

                                Citation : Toineo

                                Or ce n'est pas tout a fait ce que je voudrais faire (dans l'ideal).


                                Mais sais-tu exactement ce que tu veux faire ? je n'en ai pas l'impression.

                                Citation : Toineo


                                En fait je voudrais créer une variable par exemple de 16 octets (normalement il y a de la place avec ca, mais je dis au pif, parce que c'est 4 fois plus grand qu'un int sur ma machine...) et qui prendrait, lors de l'execution, selon les desirs de l'utilisateur, une valeur potentiellement enorme.


                                Ben là, c'est plus le forum du sdz qu'il faut consulter mais un magicien ou un sorcier ...


                                Citation : Toineo


                                Et derniere chose, où (ca peut etre un bouquin, j'aime bien :) ) puis-je apprendre les choses elementaires qui me manque?


                                Franchement, je ne te connais pas et je ne suis pas en mesure de te conseiller. Et question bouquin, je ne connais rien de bien en français.

                                Citation : michealblancO

                                je pense qu'utilisés les opérateurs logique sera plus "propre","fiable","rapide".


                                Je ne vois pas en quoi ce que j'ai proposé serait sale, non fiable ou particulièrement lent (multiplier deux nombres décimaux en base 10 de chacun 1024 chiffres avec un code ultra-banal et en rien optimisé met 1/100s sur un PC ordinaire). En outre, les opérateurs logiques (&&, || et !) ne doivent pas être confondus avec les opérateurs bit à bit.

                                Citation : michealblancO

                                Avec eux tu peux écrire bit à bit et au final faire le nombre que tu veux...

                                et alors ?

                                Citation : michealblancO

                                après suffit de faire la fonction qui va lire de telle bit à telle bit et un simple tableau de char (ou du type que tu veux...).


                                Et alors, en quoi ça répond au problème de faire des opérations sur des grands nombres. Tu vas faire des multiplications bit à bit ? Tu t'exprimes sur un sujet sur lequel tu n'as visiblement pas porté une réflexion un tant soit peu sérieuse.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  19 novembre 2007 à 7:11:05

                                  Citation : candide

                                  C'est un nombre maximal de chiffres, qui devrait suffire aux besoins courants et ce n'est pas vraiment une limitation, j'ai dit ça pour te simplifier le code.


                                  Je sais bien, mais pour plus de simplicité le mieux serait de garder une variable "classique", même si plus grosse.

                                  Citation : candide

                                  Mais sais-tu exactement ce que tu veux faire ? je n'en ai pas l'impression.


                                  Sisi sisi, bah regarde plus haut, je l'ai dit :p

                                  Citation : candide

                                  Ben là, c'est plus le forum du sdz qu'il faut consulter mais un magicien ou un sorcier ...


                                  Enfin déjà pour les 16 octets je deconnai un peu...je pense que 8 serait déjà très bien.
                                  Mais alors, n'y a t-il pas moyen de definir des types de variables plus gros?
                                  Et comment font les programmeurs pour des progs de math?
                                  Et GMP, ne permait-elle pas ca?

                                  Parce que c'est vrai que ca doit etre complexe de faire ca, mais une fois que j'ai ma variable c'est beaucoup plus simple pour le reste du prog (surtout que je l'utilise beaucoup (la variable) sachant que c'est un prog pour les nombres premiers)

                                  Sinon micheal je vois ce que tu veux dire, et si c'est impossible de faire une très grosse variable, je verrais si je peux faire comme ca (enfin, c'est pas sûr)

                                  Voilou...
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    19 novembre 2007 à 8:04:57

                                    Pour 8 octet tu peux faire un long long.
                                    Les types de variables plus gros c'est les tableaux et les structures.
                                    GMP fait ça mais ne t'attends pas (en C) à pour utiliser *,/,- etc.
                                    Ce n'est plus géré (comme les int,char,short,...) directement par la machine mais par la bibliothèque GMP.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      19 novembre 2007 à 8:12:29

                                      Ah cool, je savais pas qu'on pouvait mettre deux fois un long.Je vais l'essayer le plus vite possible mais là je dois allez bosser. Au passage, long long c'est le max pour les types classiques?

                                      Merci pour la precision sur GMP. Mais pour les opérations classique, elle ne fournit pas des fcts qui servent a ca (je dis ca, j'en sais rien...)?
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        19 novembre 2007 à 8:50:25

                                        Citation : Toineo


                                        Je sais bien, mais pour plus de simplicité le mieux serait de garder une variable "classique", même si plus grosse.


                                        Si tu veux un résultat exact et très grand, ce ne sera pas possible.

                                        Citation : Toineo


                                        Citation : candide

                                        Mais sais-tu exactement ce que tu veux faire ? je n'en ai pas l'impression.


                                        Sisi sisi, bah regarde plus haut, je l'ai dit :p



                                        Tu veux le beurre et l'argent du beurre. Tu veux travailler avec des grands nombres premiers et que ça tienne dans une "petite donnée". Le problème c'est qu'on on ne compresse pas encore des bits en des électrons.

                                        Citation : Toineo


                                        Mais alors, n'y a t-il pas moyen de definir des types de variables plus gros?



                                        Ça dépend de l'architecture mais de toutes façons, si tu veux des nombres vraiment grands, ce dont tu disposes par défaut ne suffiront plus. Ou alors, il faut te tourner vers d'autres langages de programmation, comme Java ou Python qui gèrent presque nativement les grands nombres.

                                        Citation : Toineo


                                        Et comment font les programmeurs pour des progs de math?
                                        Et GMP, ne permait-elle pas ca?



                                        Oui, GMP est un choix reconnu mais c'est pour des applis de type bien particulier comme de la cryptographie, de la théorie des codes correcteurs, de la théorie des nombres, etc.

                                        Citation : Toineo


                                        (surtout que je l'utilise beaucoup (la variable) sachant que c'est un prog pour les nombres premiers)


                                        Et tu veux faire quoi avec ton grand nombre premier ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          19 novembre 2007 à 9:57:02

                                          Citation : candide

                                          Ça dépend de l'architecture mais de toutes façons, si tu veux des nombres vraiment grands, ce dont tu disposes par défaut ne suffiront plus.


                                          Donc, comment en definir des plus grands? C'est vraiment pas possible d'avoir une variable, qui, même si elle utilise beaucoup d'espace, contient un très grand nombre de facon exacte?

                                          Citation : candide

                                          Et tu veux faire quoi avec ton grand nombre premier ?


                                          En fait c'est pour tester si un nombre est premier. Et je voudrais ne pas etre limité a 2 milliards et des poussieres.

                                          Citation : candide

                                          comme Java ou Python qui gèrent presque nativement les grands nombres.


                                          M'interesse pas trop. Sauf peut etre le python.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            19 novembre 2007 à 10:10:08

                                            Citation : Toineo

                                            Citation : candide

                                            Ça dépend de l'architecture mais de toutes façons, si tu veux des nombres vraiment grands, ce dont tu disposes par défaut ne suffiront plus.


                                            Donc, comment en definir des plus grands? C'est vraiment pas possible d'avoir une variable, qui, même si elle utilise beaucoup d'espace, contient un très grand nombre de facon exacte?



                                            Par défaut si tu travailles sur une architecture où les entiers non signés sont codés sur 128 bits (ce qui n'est pas fréquent sur un PC), tu ne pourras pas aller au delà de <math>\(2%5E%7B128%7D\)</math> ce qui n'est pas énorme, grosso modo une quarantaine de chiffres décimaux. Aucun miracle.



                                            Citation : Toineo


                                            En fait c'est pour tester si un nombre est premier. Et je voudrais ne pas etre limité a 2 milliards et des poussieres.



                                            Là encore, faut pas rêver, si tu vas tester ton nombre premier avec un algorithme naïf, genre tous les deiviseurs inférieurs ou égaux à la partie entière de la racine carrée, tu vas pas aller loin. Faut envisager d'autres types de tests plus élaborés et si t'as pas un minimum de connaissance d'algèbre t'ira pas loin.

                                            À mon avis, laisse tomber, tu perds ton temps et ton C.


                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              19 novembre 2007 à 10:18:31

                                              Citation : candide

                                              Là encore, faut pas rêver, si tu vas tester ton nombre premier avec un algorithme naïf, genre tous les deiviseurs inférieurs ou égaux à la partie entière de la racine carrée, tu vas pas aller loin. Faut envisager d'autres types de tests plus élaborés et si t'as pas un minimum de connaissance d'algèbre t'ira pas loin.

                                              À mon avis, laisse tomber, tu perds ton temps et ton C.


                                              Ouais certes ca sera très long, mais a la fois c'est un des seuls programme que je puisse realiser et qui me donne un vrai challenge. Après, quand j'aurai fait des etudes en algebre et que je serait meilleur en C, je pourrait l'ameliorer mais bon...
                                              Sinon, les prog que je trouve a faire sont soit trop simples soit presques impossibles... bien entendu j'essaye de m'ameliorer en C pour changer ca, mais c'est long...et j'ai du mal a trouver ce qui me convient, pour les petits niveaux mais pas les novices...

                                              Par exemple, quand tu étais a peu près dans le même niveau que moi, quel genre de prog faisait-tu?

                                              Toineo
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                19 novembre 2007 à 13:27:59

                                                Citation : Toineo


                                                Sinon, les prog que je trouve a faire sont soit trop simples soit presques impossibles... bien entendu j'essaye de m'ameliorer en C pour changer ca, mais c'est long...et j'ai du mal a trouver ce qui me convient, pour les petits niveaux mais pas les novices...



                                                Quand on est comme toi, à la fois débutant en maths, en programmation et en algorithmique, il faut pas tout mélanger, sinon tu n'avanceras dans aucun domaine. Pour ce qui est du C, il est très tentant de vouloir réaliser des petits programmes comme tu souhaites. Mais, ça ralentit considérablement ton apprentissage du langage C. À toi de décider ce que tu veux faire. Il est très possible de faire des algorithmes de maths en C et connaissant assez peu de C (cf. le site de france-ioi mais à ce moment-là, ton C plafonne et tes maths aussi. Il est inenvisageable de faire des maths compliquées en C sans se construire une bibliothèque à des fins personnelles.

                                                Mais si tu veux vraiment essayer un programme "pour des nombres premiers", essaye déjà de coder ton programme naïf de recherche de nombres premiers mais avec des long long int (grosso modo pour des entiers ayant de l'ordre de 20 chiffres décimaux), tu vas te rendre compte des problèmes de temps de calcul que ça pose ... Et montre-nous ton code. parce que là on est dans le blabla
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  19 novembre 2007 à 15:47:41

                                                  J'ai compris...Je fais ce prog la mais je veux continuer d'apprendre en C

                                                  sinon mon code je le poste ce soir, mais c'est encore plus naïf que tu ne le pense...
                                                  je t'aurai prevenu...
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    19 novembre 2007 à 16:56:28

                                                    peu importe arrêter les code bricolos
                                                    faite ça avec les opérateurs machin là!!!
                                                    et puis c'est tout.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      19 novembre 2007 à 16:58:40

                                                      Citation : michealblancO

                                                      peu importe arrêter les code bricolos
                                                      faite ça avec les opérateurs machin là!!!
                                                      et puis c'est tout.


                                                      Les opérateurs machins? On voit que tu sais de quoi tu parles. Tu n'as aucune idée de ce que tu dis, d'après ce que tu as dit.
                                                      Fais une recherche, informe toi sur le sujet, si tu veux, mais ne dit pas n'importe quoi.
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        19 novembre 2007 à 18:24:29

                                                        Pour tester naïvement jusqu'à la racine de 2^64 (long long sur machines 32 bits) ça va déjà faire quelques secondes.
                                                        Si tu veux tu peux gérer les entiers de la forme a+b*1018 et tu verras des problèmes apparaître.
                                                        Puis tu généralises en faisant des tableaux mais c'est plus compliqué.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        Super gros nombres

                                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                        • Editeur
                                                        • Markdown