Bibliothèque GMP

Résolu/Fermé
Utilisateur anonyme - 27 mars 2016 à 22:55
 Utilisateur anonyme - 1 avril 2016 à 17:44
Bonsoir,

Je viens d'installer la bibliothèque GMP sur CodeBlocks.
J'ai créer un programme en C listant les nombres parfaits, mais on arrive rapidement à de très grands nombres.
Comment puis-je utiliser cette bibliothèque pour pouvoir afficher les grands nombres tels qu'ils le sont ? Je n'ai aucune idée de comment m'en servir.
Voici mon code :

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <gmp.h>

#define P 35

typedef enum
{False = 0, True = 1}
Bool;

long long int powInt(long long int base, long long int exp)
{
  long long res = 1;
  for(long long int i = 0 ; i < exp ; i++)
    res *= base;
  return res;
}

int main()
{
    long long int n, la;
    long long int p = P;
    Bool test = True;

    printf("6\n");

for(n = 3; n <= p; n+=2)
{
    test = True;
    long long int j;
    long long int carre = (powInt(2, n)-1);
        for(j = 2; j*j <= carre; j++)
        {
            if(carre % j == 0)
            {
                test = False;
                break;
            }
        }
        if(test)
        {
            la = powInt(2, n-1)*(powInt(2,n)-1);
            printf("%lld\n", la);
        }
}
    return 0;
}


Merci,

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
27 mars 2016 à 23:30
Bonjour,

Tu as quelques exemples sur Wikipedia, sinon réfères toi au manuel...
1
Utilisateur anonyme
28 mars 2016 à 14:01
Bonjour,

Merci, j'ai essayé d'adapter les exemples à mon problème mais mon programme crash directement :

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <gmp.h>
 
#define P 100
 
typedef enum
{False = 0, True = 1}
Bool;
 
long long int powInt(long long int base, long long int exp)
{
  long long res = 1;
  for(long long int i = 0 ; i < exp ; i++)
    res *= base;
  return res;
}
 
int main()
{
    long long int n;
    mpz_t la;
    mpz_t one, two;
    mpz_init(la);
    long long int p = P;
    Bool test = True;
 
    printf("6\n");
 
for(n = 3; n <= p; n+=2)
{
    test = True;
    long long int j;
    long long int carre = (powInt(2, n)-1);
        for(j = 2; j*j <= carre; j++)
        {
            if(carre % j == 0)
            {
                test = False;
                break;
            }
        }
        if(test)
        {
            mpz_set_ui(one, powInt(2, n-1));
            mpz_set_ui(two, powInt(2,n)-1);
            mpz_mul_si(la, one, two);
            gmp_printf("%Zd\n", la);
        }
}
    return 0;
}
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
28 mars 2016 à 16:26
C'est vieux pour moi tout ça, mais si tu travailles avec GMP alors utilises le de bout en bout, ne fais pas de mélanges long long int et mpz_t
0
Utilisateur anonyme
29 mars 2016 à 16:49
Si je fais ça, le compilateur me renvoie une erreur au niveau de la boucle for avec n, si n est déclaré avec GMP.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
29 mars 2016 à 19:20
Dans ta boucle for c'est des int simples que tu dois garder. Jamais tu ne feras des puissances supérieures à deux milliards.
Par contre le calcul res *= base devrait être en mpz_t car cette valeur peut rapidement exploser et dépasser.

Remarque : il y a plus malin qu'une boucle for pour calculer la puissance (en calculant avec des grands nombres tu verras que même les algos les plus simples doivent être optimisés)
0
Utilisateur anonyme
30 mars 2016 à 23:18
Bonsoir.
Ce problème est résolu, je vous remercie pour votre aide.

Néamoins j'ai un autre soucis, j'aimerais déclarer une variable de type string ou char avec GMP, pour ensuite la renvoyer en sortie vers un fichier texte avec
mpz_out_str();

Cependant lorsque je déclare par exemple
mpz_t texte;
mpz_init(texte);
mpz_set_str(texte, "\n", 10);

puis
*FILE fichier;
fichier = fopen("test.txt", "a");
mpz_out_str(fichier, 10, texte);

J'aimerais que la touche entrée soit insérée dans mon fichier texte.
Or au lieu de l'entrée, des nombres sont affichés à la place, et généralement toujours les mêmes (quelque chose comme 82124573214).
Comment est-ce-que je peux faire pour simplement afficher l'entrée dans mon fichier texte ? (sans passer par
fwrite
, sinon mon programme crash).
A mon avis c'est à cause de la base 10 non ?

Merci
0