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 :

GMP Première tentative C


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    décembre 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : décembre 2021
    Messages : 12
    Points : 3
    Points
    3
    Par défaut GMP Première tentative C
    Bonsoir,

    Je me permets de poster un message dans ce forum car je débute tout juste C (mais ai lu de la docu sur internet).
    J'ai essayé de faire un programme en utilisant la bibliothèque gmp tel que l'utilisateur entre k, un nombre de bit, et le programme génère des nombres aléatoires d'au plus kbits et continue jusqu'à temps d'en trouver un multiple de 20 (i.e. reste de la div euclidienne de n par 20 vaut 0).
    Mon code ressemble à ça pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #include <stdio.h>
    #include "gmp.h"
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
     
    int main(int argc, char* argv[])
    {
    	unsigned long int k;
    	scanf("k bits avec k= %d", &k);
    	mpz_t z_n;
    	gmp_randstate_t mon_gen; \\Déclaration_gen
    	gmp_randinit_default(mon_gen);\\Init_gen
    	gmp_randseed_ui(mon_gen, time(NULL)); \\seed
    	mpz_urandomb (mpz_t z_n, gmp_randstate_t state, mp_bitcnt_t k);
    	while ( gmp_div_r(mpz_t z_n, 20) != 0)
    	{
    		mpz_urandomb (mpz_t z_n, gmp_randstate_t state, mp_bitcnt_t k);
    	}
    	gmp_printf(z_n);
    	gmp_randclear(mon_gen);
    }
    Pouvez-vous commenter mon code et/ou le corriger ?

    Merci par avance de vos retours.
    Bonne soirée,

    Chaka_Sobek

  2. #2
    Membre éprouvé Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2011
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mai 2011
    Messages : 495
    Points : 1 260
    Points
    1 260
    Par défaut
    Hello,

    Je ne comprends pas très bien ce qe tu veux faire, mais ligne 11, le format pour un unsigned long int c'est %lu, pas %d.

    Les commentaires en ligne commencent par //, pas \\

    Lignes 16 et 19, puisqu'il s'agit d'un appel de fonction et non d'une déclaration, tu ne dois pas mettre le type des variables.

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    décembre 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : décembre 2021
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Hello,

    Je ne comprends pas très bien ce qe tu veux faire, mais ligne 11, le format pour un unsigned long int c'est %lu, pas %d.

    Les commentaires en ligne commencent par //, pas \\

    Lignes 16 et 19, puisqu'il s'agit d'un appel de fonction et non d'une déclaration, tu ne dois pas mettre le type des variables.
    Merci pour ce premier retour ! Je vais corriger de suite.

    En fait je veux générer un nombre aléatoire tenant sur k bits (d'où le mpz_urandomb) et tant que le nombre généré n'est pas un multiple de 20, j'en génère un nouveau.

    En espérant avoir été plus clair cette fois-ci !

  4. #4
    Membre éprouvé Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2011
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mai 2011
    Messages : 495
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par Chaka_Sobek Voir le message
    En fait je veux générer un nombre aléatoire tenant sur k bits (d'où le mpz_urandomb) et tant que le nombre généré n'est pas un multiple de 20, j'en génère un nouveau.
    Ben, t'es pas rendu ! Ton programme pourrait tourner indéfiniment: entre 0 et 99 (inclus) par exemple, il n'y a que 4 nombres éligibles. Tu aurais intérêt à te trouver un autre algorithme.

  5. #5
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    décembre 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : décembre 2021
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Ben, t'es pas rendu ! Ton programme pourrait tourner indéfiniment: entre 0 et 99 (inclus) par exemple, il n'y a que 4 nombres éligibles. Tu aurais intérêt à te trouver un autre algorithme.
    Comment ça ? :/

    Si je donne k= 10, mon générateur va générer des nombres entre 0 et 2^10 -1 et donc il y a quand même pas mal de candidats.

    Et a vrai dire que ce soit des multiples de 20, de 7 ou de 156 je m'en fiche je veux juste arriver à générer des nombres sur kbits.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    10 833
    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 : 10 833
    Points : 27 285
    Points
    27 285
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Chaka_Sobek Voir le message
    Si je donne k= 10, mon générateur va générer des nombres entre 0 et 2^10 -1 et donc il y a quand même pas mal de candidats.
    Il y en a très exactement 52. Or 52 pour 1024 nombres ça fait 5%. Ca veut dire que tu as une chance sur 20 de sortir de la boucle. Ok edgarjacobs a peut-être un peu exagéré car tu sortiras probablement mais ça peut prendre du temps.

    Citation Envoyé par Chaka_Sobek Voir le message
    Et a vrai dire que ce soit des multiples de 20, de 7 ou de 156 je m'en fiche je veux juste arriver à générer des nombres sur kbits.
    Ben pourquoi tu ne dis pas "je vais en générer 10/15/20" et tu génères sans chercher des nombres particuliers?
    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

  7. #7
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    décembre 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : décembre 2021
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Il y en a très exactement 52. Or 52 pour 1024 nombres ça fait 5%. Ca veut dire que tu as une chance sur 20 de sortir de la boucle. Ok edgarjacobs a peut-être un peu exagéré car tu sortiras probablement mais ça peut prendre du temps.


    Ben pourquoi tu ne dis pas "je vais en générer 10/15/20" et tu génères sans chercher des nombres particuliers?
    Bonsoir,

    Et merci pour ta réponse !

    En effet, je peux juste essayer avec un for pour avoir un aperçu.

    Voici le code modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
     
    #include "gmp.h"
     
    int main(int argc, char* argv[])
    {
    	unsigned long int k;
            int i;
    	scanf("k bits avec k= %d", &k);
    	mpz_t z_n;
    	gmp_randstate_t mon_gen; //Déclaration_gen
    	gmp_randinit_default(mon_gen);//Init_gen
    	gmp_randseed_ui(mon_gen, time(NULL)); //seed
    	mpz_urandomb (z_n, mon_gen, k);
    	for (i=0; i<10; i++)
    	{
    		mpz_urandomb (z_n, mon_gen, k);
                    gmp_printf(z_n);
    	}
    	gmp_randclear(mon_gen);
    }
    Cependant, après avoir essayé de compiler ceci, le terminal me renvoie :

    Nom : 1.png
Affichages : 72
Taille : 89,2 Ko

    Comme si il ne comprenait pas que les fonctions venait de gmp.h :/

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    10 833
    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 : 10 833
    Points : 27 285
    Points
    27 285
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Chaka_Sobek Voir le message
    Comme si il ne comprenait pas que les fonctions venait de gmp.h :/
    Pas tout à fait. Le premier message indique que tu utilises mal la fonction gmp_printf(), que son premier argument doit-être un char* et non pas un "mpz_t" (qui semble être un pointeur caché).
    Si cette fonction s'utilise de la même façon que printf(), alors effectivement il faut lui mettre en premier une string (un char*) et ensuite les éléments à afficher (exemple printf("Le carré de 4 est %d", 4*4)). Ca la doc devrait te le dire.
    Ensuite les undefined infiquent qu'il manque le code des fonctions, donc le lien vers la librairie "gmp".

    Compiler un programme ça se fait en deux étapes
    • examen de la syntaxe et de la corrélation "type des fonctions/façon de les appeler". C'est là que les ".h" (qui ne sont que des déclarations, et ne servent qu'à éviter de redéclarer soi-même 40000 trucs) entrent en jeu
    • création de l'exécutable. Là le compilateur va chercher le code effectif des fonctions appelées. Et il cherche ce code soit dans ton source, soit dans la librairie que tu utilises qui contient elle le code réel des fonctions appelées. Il faut donc indiquer cette librairie dans la ligne de compilation
    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

  9. #9
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    décembre 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : décembre 2021
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Etant un néophyte... je vais vous expliquer la démarche que j'ai suivi pour installer la bibliothèque gmp : j'ai télécharger gmp puis l'ai dézippé dans mon dossier de travail, puis cd le dossier extrait à l'instant, ./configure et enfin make, make check et sudo make install.

    (J'ai essayé gmp.h avec les guillemets "" et les chevrons<> mais toujours les mêmes erreurs )

  10. #10
    Membre éprouvé Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2011
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mai 2011
    Messages : 495
    Points : 1 260
    Points
    1 260
    Par défaut
    Comme l'a dit Sv@er, la construction d'un exécutable se fait en deux phases, la phase de compilation (le code est-il syntaxiquement correct ?), puis l'édition des liens (le link) qui permet (en très très gros) de joindre au programme les fonctions dont il a besoin.

    Ici, une recherche pour linker la librairie gmp avec ton programme

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    6 995
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 6 995
    Points : 32 274
    Points
    32 274
    Billets dans le blog
    4
    Par défaut
    Avant de vouloir utiliser gmp et faire je ne sais quoi avec (et en l'occurence, pas grand chose), pourquoi ne pas juste utiliser du bon vieux C et un simple rand() ?
    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.

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    10 833
    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 : 10 833
    Points : 27 285
    Points
    27 285
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Chaka_Sobek Voir le message
    j'ai téléchargé gmp puis l'ai dézippé dans mon dossier de travail, puis cd le dossier extrait à l'instant, ./configure et enfin make, make check et sudo make install.
    Ok, donc tu as installé gmp sur ton système (et je suis heureux de voir que tu ne travailles pas en root de par le sudo que tu as été obligé de faire). Mais le compilateur, lui, ne sait pas que ton programme utilise gmp. Il faut que tu le lui dises lors de la compilation (en réalité lors de l'édition de liens mais pour un programme simple, l'édition de liens est incluse dans la compilation).

    Citation Envoyé par Chaka_Sobek Voir le message
    (J'ai essayé gmp.h avec les guillemets "" et les chevrons<> mais toujours les mêmes erreurs )
    Oui car la différence entre les deux écritures n'entre pas en ligne de compte ici. Et ce n'est pas parce que tu inclus un .h que le compilateur va "deviner" qu'il faut lier ton code à la librairie en question. Inclure un ".h" c'est juste dire "recopier ici son contenu", contenu qui contient comme je l'ai dit toutes les déclarations des choses ce qui t'évite de les redéclarer toi-même. Rien de plus.

    Il te faut compiler ton programme de cette façon: gcc exo1.c -lgmp -o exo1 pour que le compilateur aille chercher le code (et le code ne se trouve pas dans les ".h") des fonctions dans la librairie gmp.

    Mais avant toute chose, il te faut d'abord corriger les erreurs signalées, à savoir le mauvais format "%d" dans le scanf() ainsi que la mauvaise utilisation de gmp_printf().

    Citation Envoyé par Chaka_Sobek Voir le message
    Etant un néophyte...
    Dans ce cas, Bousk n'a pas tout à fait tort (en réalité il n'a pas du tout tort). Avant de vouloir courir il te faudrait d'abord apprendre à marcher...
    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

  13. #13
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : mai 2013
    Messages : 851
    Points : 2 674
    Points
    2 674
    Par défaut Efficacité et paresse, un seul combat
    Bonjour,

    Juste sur le principe. Au lieu de tester la divisibilité par 20 il est possible de travailler avec k-2 et de tester la divisibilité par 5 puis de remultiplier par 4.
    4 fois moins de tirages, ça se fête , non ?

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    10 833
    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 : 10 833
    Points : 27 285
    Points
    27 285
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Guesset Voir le message
    4 fois moins de tirages, ça se fête , non ?
    Ben si c'est une question de principe et de tirages, on part de i=0 et tant que i*20 est inférieur à 2^k on affiche i*20 et on incrémente i...
    Là ça devient une vraie fête
    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

  15. #15
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : mai 2013
    Messages : 851
    Points : 2 674
    Points
    2 674
    Par défaut Aller jacter à l'est !
    Bonjour Sve,

    Citation Envoyé par Sve@r Voir le message
    Ben si c'est une question de principe et de tirages, on part de i=0 et tant que i*20 est inférieur à 2^k on affiche i*20 et on incrémente i...
    Tu as raison et c'est beaucoup plus efficace pour boire 2k / 20 coups car moins aléatoire

    Ceci étant, il y a une solution simple et aléatoire : faire un seul tirage au sort et retirer le modulo 20

    Salut et bonne journée.
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. erreur dans la compilation d'un programme
    Par ludovic787 dans le forum C++
    Réponses: 5
    Dernier message: 08/02/2019, 10h49
  2. erreur dans l'éxécution d'un programme
    Par chlab dans le forum Caml
    Réponses: 1
    Dernier message: 07/06/2010, 22h09
  3. Réponses: 5
    Dernier message: 10/06/2009, 19h47
  4. Réponses: 1
    Dernier message: 27/04/2009, 18h06
  5. une erreur dans l'exécution d'un programme
    Par viou25 dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2008, 22h52

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