ccgousset
Messages postés150Date d'inscriptionsamedi 1 août 2009StatutMembreDernière intervention 4 mars 2023 19 déc. 2011 à 12:46
Merci Pgl10 je cherche mais ai beaucoup de mal a trouver (gmpxx.h et vc) chou blanc en fait. A plus Merci.
pgl10
Messages postés382Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention 1 mai 202411 18 déc. 2011 à 20:19
Ccgousset : Je ne connais pas bien les gmpxx.h et gmpxx.lib. J'utilise avec Visual C++ 6.0 la version 4.1.2 de GMP citée dans la description. Cette version vient avec gmp.h et gmp.lib qui n'ont aucun problème de compilation ou de link edit. C'est une version plus ancienne, mais on trouve assez facilement sur Internet des documentations pour cette version. Et mon C++ est en fait principalement du C, les parties spécifiques du C++ ne sont guère utilisées ici. Désolé de ne dire rien de mieux.
ccgousset
Messages postés150Date d'inscriptionsamedi 1 août 2009StatutMembreDernière intervention 4 mars 2023 17 déc. 2011 à 23:18
Jai vu ton dernier source sur les carac accentués c'est malin. Ma question utilise tu gmp avec vc6++ et en mode cpp (avecx gmpxx.h et les librairies ...xx.lib ou ...xx.dll si oui connais tu l'astuce pour faire marcher gmpxx.h et vc++. Voila a plus et Merci le Gpl.
smaida
Messages postés10Date d'inscriptionmercredi 31 décembre 2008StatutMembreDernière intervention12 décembre 2011 6 déc. 2010 à 21:58
* #include <stdio.h>
* #include <stdlib.h>
* #include <gmp.h>
* int main (int argc, char *argv[]) { // décomposition d'un entier n quelconque
* mpz_t n,i,ii,q; // en produit de nombres premiers
* unsigned int s,t[]={4,2,4,2,4,6,2,6};
* mpz_init(n);
* mpz_init(i);
* mpz_init(ii);
* mpz_init(q);
* // lecture du nombre n à décomposer
* if(argc==2) gmp_sscanf(argv[1],"%Zd",n);
* else {
* input: printf("\nEntrez un nombre entier plus grand que 1 : ");
* gmp_scanf("%Zd",n);
* if(mpz_cmp_si(n,2)<0) goto input; // if(n<2) goto input
* }
* s=2;
* // est-ce que s divise n une ou plusieurs fois ?
* prems : if(mpz_cmp_ui(n,s)==0) goto fin; // si n = s
* if(mpz_divisible_ui_p(n,s)) { // si s divise n
* mpz_div_ui(q,n,s); // q = n / s
* gmp_printf("\n\n %Zd = %Zd * %d",n,q,s);
* mpz_set(n,q); // n = n / s
* goto prems;
* }
* if(s==2) {s=3; goto prems;}
* if(s==3) {s=5; goto prems;}
* s=0;
* mpz_set_si(i,7); // i = 7
* mpz_set_si(ii,49); // ii = 49
* // à partir de i, calcul du plus petit diviseur i de n ( i sera premier )
* boucle: for(;;) { // pour chaque valeur de i
* if(mpz_cmp(ii,n)>0) goto fin; // if(i*i>n) : donc n est premier
* if(mpz_divisible_p(n,i)!=0) { // si i divise n
* mpz_div(q,n,i); // q = n / i
* gmp_printf("\n\n %Zd = %Zd * %Zd",n,q,i);
* mpz_set(n,q); // n = n / i
* goto boucle;
* }
* else { // si i ne divise pas n on devrait prendre pour i le nombre
* mpz_add_ui(i,i,t[s++]); // premier suivant, mais il n'est pas connu. Donc, on prend
* if(s==8) s=0; // l'entier suivant en évitant les multiples de 2, 3 et 5
* mpz_mul(ii,i,i); // ii = i * i
* }
* }
* fin: gmp_printf("\n\n %Zd est premier\n\n\n",n);
* mpz_clear(n);
* mpz_clear(i);
* mpz_clear(ii);
* mpz_clear(q);
* system("pause");
* return 0;
* }
pgl10
Messages postés382Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention 1 mai 202411 29 nov. 2010 à 17:41
Pour ceux qui voudraient approfondir, il est probablement utile de préciser que GMP possède des fonctions spécialisées et des programmes optimisés de démonstrations pour divers problèmes parmi lesquels : factorize, pour factoriser un grand entier, isprime, pour la primalité d'un grand entier et primes, pour afficher les nombres premiers compris entre deux grands entiers.
pgl10
Messages postés382Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention 1 mai 202411 29 nov. 2010 à 13:39
Merci à Nicolas SOREL (Nix) pour avoir coupé en morceaux le très grand nombre ci-dessus et avoir rétabli la présentation habituelle.
A noter que les tests de primalité exacts ou probabilistes sont bien sûr voisins du sujet traité ici mais en général ils ne font pas la décomposition en facteurs premiers. Ces deux problèmes sont sont complémentaires mais différents.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 28 nov. 2010 à 23:30
Oui ça la casse aussi chez moi, je ne m'attendais pas à ça. Si un admin pouvait mettre quelques retours chariots dans mon commentaire pour rétablir la mise en page, ce serait gentil.
Encore une fois je ne critiquais pas ton code mais je te proposais des idées dans la continuité de ce source, c'est tout :p
Cordialement, Bacterius !
pgl10
Messages postés382Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention 1 mai 202411 28 nov. 2010 à 23:26
=> POP70 : merci pour cet aimable commentaire.
=> BACTERIUS : le test de primalité de Miller-Rabin avec gmp est disponible à http://en.literateprograms.org/Miller-Rabin_primality_test_(C,_GMP). Je l'ai compilé. Chez moi, le grand nombre écrit ci-dessus est détecté composite. Je suppose qu'on peut aussi le trouver ailleurs et notamment sur cppfrance avec NTL. Par contre je signale que la publication de ce grand nombre casse la mise en page habituelle de la page Internet Explorer actuelle. J'avais déjà indiqué que mon petit logiciel diviseurs.exe n'était pas fait pour faire un bon test de primalité, comme ceux de Miller-Rabin, de AKS ou d'autres, mais seulement d'exercice pour utiliser gmp. Ceci dit merci pour les remarques pour lesquelles je suis d'accord. Bye, pgl10
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 28 nov. 2010 à 22:50
@Pop70 : Pour info voici un exemple de nombre utilisé en cryptographie, par RSA (et encore, c'est un petit) :
Ce que je suggère à Pgl10 est d'essayer d'implémenter à présent le test de primalité de Miller-Rabin avec gmp (assez simple), et ensuite pour un vrai challengé tenter d'implémenter le crible quadratique : http://fr.wikipedia.org/wiki/Crible_quadratique. C'est juste une suggestion évidemment mais ça donne un bon défi très satisfaisant quand on l'atteint.
Cordialement, Bacterius !
pop70
Messages postés181Date d'inscriptionmardi 6 avril 2010StatutMembreDernière intervention 7 janvier 201210 28 nov. 2010 à 15:45
Ouhou ! Ce code est posté pile au bon moment !
Je viens de déposer une question sur le forum pour savoir comment manipuler de très grands nombres, et je trouve la réponse 2mn plus tard (GMP) :)
D'ailleurs si je cherchais de à faire de très grands nombres, c'est pour essayer de faire un petit programme de cryptage RSA expliqué sur un site.
Pour valeur d'exemple il donne un produit de 2 nombres premiers égal à 283189. Puis ils disent que dans la pratique, il faut des nombres bien plus grands, car celui-ci peut-être rapidement décomposé... Il font bien de le dire, j'ai testé ton programme est en moins d'1/10 de seconde il l'a décomposé en 503x563.
Vraiment bravo! Je pense que ce code va m'être bien utile et à beaucoup d'autre aussi.
De plus, il est très bien commenté, et ça facilite grandement la lecture, surtout lorsqu'on ne connait pas encore, comme moi, la librairie GMP.
19 déc. 2011 à 12:46
18 déc. 2011 à 20:19
17 déc. 2011 à 23:18
6 déc. 2010 à 21:58
* #include <stdlib.h>
* #include <gmp.h>
* int main (int argc, char *argv[]) { // décomposition d'un entier n quelconque
* mpz_t n,i,ii,q; // en produit de nombres premiers
* unsigned int s,t[]={4,2,4,2,4,6,2,6};
* mpz_init(n);
* mpz_init(i);
* mpz_init(ii);
* mpz_init(q);
* // lecture du nombre n à décomposer
* if(argc==2) gmp_sscanf(argv[1],"%Zd",n);
* else {
* input: printf("\nEntrez un nombre entier plus grand que 1 : ");
* gmp_scanf("%Zd",n);
* if(mpz_cmp_si(n,2)<0) goto input; // if(n<2) goto input
* }
* s=2;
* // est-ce que s divise n une ou plusieurs fois ?
* prems : if(mpz_cmp_ui(n,s)==0) goto fin; // si n = s
* if(mpz_divisible_ui_p(n,s)) { // si s divise n
* mpz_div_ui(q,n,s); // q = n / s
* gmp_printf("\n\n %Zd = %Zd * %d",n,q,s);
* mpz_set(n,q); // n = n / s
* goto prems;
* }
* if(s==2) {s=3; goto prems;}
* if(s==3) {s=5; goto prems;}
* s=0;
* mpz_set_si(i,7); // i = 7
* mpz_set_si(ii,49); // ii = 49
* // à partir de i, calcul du plus petit diviseur i de n ( i sera premier )
* boucle: for(;;) { // pour chaque valeur de i
* if(mpz_cmp(ii,n)>0) goto fin; // if(i*i>n) : donc n est premier
* if(mpz_divisible_p(n,i)!=0) { // si i divise n
* mpz_div(q,n,i); // q = n / i
* gmp_printf("\n\n %Zd = %Zd * %Zd",n,q,i);
* mpz_set(n,q); // n = n / i
* goto boucle;
* }
* else { // si i ne divise pas n on devrait prendre pour i le nombre
* mpz_add_ui(i,i,t[s++]); // premier suivant, mais il n'est pas connu. Donc, on prend
* if(s==8) s=0; // l'entier suivant en évitant les multiples de 2, 3 et 5
* mpz_mul(ii,i,i); // ii = i * i
* }
* }
* fin: gmp_printf("\n\n %Zd est premier\n\n\n",n);
* mpz_clear(n);
* mpz_clear(i);
* mpz_clear(ii);
* mpz_clear(q);
* system("pause");
* return 0;
* }
29 nov. 2010 à 17:41
29 nov. 2010 à 13:39
A noter que les tests de primalité exacts ou probabilistes sont bien sûr voisins du sujet traité ici mais en général ils ne font pas la décomposition en facteurs premiers. Ces deux problèmes sont sont complémentaires mais différents.
28 nov. 2010 à 23:30
Encore une fois je ne critiquais pas ton code mais je te proposais des idées dans la continuité de ce source, c'est tout :p
Cordialement, Bacterius !
28 nov. 2010 à 23:26
=> BACTERIUS : le test de primalité de Miller-Rabin avec gmp est disponible à http://en.literateprograms.org/Miller-Rabin_primality_test_(C,_GMP). Je l'ai compilé. Chez moi, le grand nombre écrit ci-dessus est détecté composite. Je suppose qu'on peut aussi le trouver ailleurs et notamment sur cppfrance avec NTL. Par contre je signale que la publication de ce grand nombre casse la mise en page habituelle de la page Internet Explorer actuelle. J'avais déjà indiqué que mon petit logiciel diviseurs.exe n'était pas fait pour faire un bon test de primalité, comme ceux de Miller-Rabin, de AKS ou d'autres, mais seulement d'exercice pour utiliser gmp. Ceci dit merci pour les remarques pour lesquelles je suis d'accord. Bye, pgl10
28 nov. 2010 à 22:50
13506641086599522334960321627880 596993888147560566702752448 514385152651060485953383394028715 0571909441798207282164471 5513736804197039641917430 46496589274256239341020864383202110 37295872576235850964311056407350150818 75106765946292055636855294752135 008528794163773285339061097505 44334999811150056977236890927563
Ce que je suggère à Pgl10 est d'essayer d'implémenter à présent le test de primalité de Miller-Rabin avec gmp (assez simple), et ensuite pour un vrai challengé tenter d'implémenter le crible quadratique : http://fr.wikipedia.org/wiki/Crible_quadratique. C'est juste une suggestion évidemment mais ça donne un bon défi très satisfaisant quand on l'atteint.
Cordialement, Bacterius !
28 nov. 2010 à 15:45
Je viens de déposer une question sur le forum pour savoir comment manipuler de très grands nombres, et je trouve la réponse 2mn plus tard (GMP) :)
D'ailleurs si je cherchais de à faire de très grands nombres, c'est pour essayer de faire un petit programme de cryptage RSA expliqué sur un site.
Pour valeur d'exemple il donne un produit de 2 nombres premiers égal à 283189. Puis ils disent que dans la pratique, il faut des nombres bien plus grands, car celui-ci peut-être rapidement décomposé... Il font bien de le dire, j'ai testé ton programme est en moins d'1/10 de seconde il l'a décomposé en 503x563.
Vraiment bravo! Je pense que ce code va m'être bien utile et à beaucoup d'autre aussi.
De plus, il est très bien commenté, et ça facilite grandement la lecture, surtout lorsqu'on ne connait pas encore, comme moi, la librairie GMP.
Encore une fois Merci pgl10 !