#1 Le 03/06/2009, à 11:11
- /b/nt/
[resolu] % (reste de division) et type long long en langage C
salut,
comment faire pour utiliser le % (reste de division) pour les types long long ( > 10^10) qui marche pas
merci
Dernière modification par /b/nt/ (Le 17/07/2009, à 12:10)
#2 Le 03/06/2009, à 11:17
- ddmdllt
Re : [resolu] % (reste de division) et type long long en langage C
Bonjour,
Quand tu dis que ça ne marche pas, es tu sur que tes deux opérandes sont long long ou est-ce que le diviseur pourrait être de type int?
(Je crois qu'il faut que ça soit du genre a % b avec a et b de type long long. Si par hasard b devait être une constante, essaie de la typer...)
Hors ligne
#3 Le 03/06/2009, à 11:20
- nicolas.sitbon
Re : [resolu] % (reste de division) et type long long en langage C
D'après la norme:
The operands of the % operator shall have integer type.
Donc cela doit marcher, montre nous ton code, précise ton système.
Hors ligne
#4 Le 03/06/2009, à 11:21
- Bigcake
Re : [resolu] % (reste de division) et type long long en langage C
En dernier recours tu peut toujours faire en dur ce que fait le %...
l'exemple suivant :
nb = nb % 347;
donnerai
nb = nb - (347 * (nb/347));
(si je ne m'abuse)
Dernière modification par Bigcake (Le 03/06/2009, à 11:21)
"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5
Hors ligne
#5 Le 03/06/2009, à 11:24
- /b/nt/
Re : [resolu] % (reste de division) et type long long en langage C
Bonjour,
Quand tu dis que ça ne marche pas, es tu sur que tes deux opérandes sont long long ou est-ce que le diviseur pourrait être de type int?
(Je crois qu'il faut que ça soit du genre a % b avec a et b de type long long. Si par hasard b devait être une constante, essaie de la typer...)
long long estPremier( long long t)
{
if (t == 1) // cas particulier
{
return 0;
}
long long i;
for ( i=2; i<t; i++) // on va tester tout les nombres entre 1 et n
{
if ( t%i == 0 ) // si ce nombre divise n
{
return 0; // n n'est pas premier
}
}
//return 1; // n est premier, car on n'a pas trouvé de diviseurs
printf(" %ld",t);
}
#6 Le 03/06/2009, à 11:48
- /b/nt/
Re : [resolu] % (reste de division) et type long long en langage C
estPremier(10000000033); // qui est un premier
donne :
attention : integer constant is too large for «long» type
Linking console executable:
Process terminated with status 0 (0 minutes, 0 seconds)
1 errors, 0 warnings
#7 Le 03/06/2009, à 11:49
- nicolas.sitbon
Re : [resolu] % (reste de division) et type long long en langage C
#include <stdio.h>
#include <stdbool.h>
#include <limits.h>
static bool is_prime(unsigned long long int number)
{
bool isPrime = true;
if(number < 2)
{
isPrime = false;
}
else
{
for(unsigned long long int i = 2; i < number; i++)
{
if(number % i == 0)
{
isPrime = false;
break;
}
}
}
return isPrime;
}
int main(void)
{
if(is_prime(3))
puts("3 est premier");
if(is_prime(ULLONG_MAX))
printf("%llu est premier\n", ULLONG_MAX);
return 0;
}
Hors ligne
#8 Le 03/06/2009, à 12:02
- /b/nt/
Re : [resolu] % (reste de division) et type long long en langage C
#include <stdio.h>
#include <stdbool.h>
#include <limits.h>
static bool is_prime(unsigned long long int number)
{
bool isPrime = true;
if(number < 2)
{
isPrime = false;
}
else
{
for (unsigned long long int i = 2; i < number; i++)
{
if(number % i == 0)
{
isPrime = false;
break;
}
}
}
return isPrime;
}
int main(int argc, char *argv[])
{
//test( m, N );
is_prime(10000000033);
return 0;
}
erreur: «for» loop initial declaration used outside C99 mode
: Dans la fonction «main» :
: integer constant is too large for «long» type
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 0 warnings
#9 Le 03/06/2009, à 12:03
- nicolas.sitbon
Re : [resolu] % (reste de division) et type long long en langage C
Tu ne compiles pas correctement, ajoute un -std=c99 à tes flags de compilation.
Hors ligne
#10 Le 03/06/2009, à 12:05
- nicolas.sitbon
Re : [resolu] % (reste de division) et type long long en langage C
#include <stdio.h> #include <stdbool.h> #include <limits.h> static bool is_prime(unsigned long long int number) { bool isPrime = true; if(number < 2) { isPrime = false; } else { for (unsigned long long int i = 2; i < number; i++) { if(number % i == 0) { isPrime = false; break; } } } return isPrime; } int main(int argc, char *argv[]) { //test( m, N ); is_prime(10000000033); return 0; }
erreur: «for» loop initial declaration used outside C99 mode
: Dans la fonction «main» :
: integer constant is too large for «long» type
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 0 warnings
de plus :
is_prime(10000000033LLU);
Hors ligne
#11 Le 03/06/2009, à 12:24
- /b/nt/
Re : [resolu] % (reste de division) et type long long en langage C
Pas d'erreur cette fois mais aucune réponse pour les grands nombres c'est comme si il met longtemps !
à l'aide.
merci
#12 Le 03/06/2009, à 12:26
- nicolas.sitbon
Re : [resolu] % (reste de division) et type long long en langage C
Pas d'erreur cette fois mais aucune réponse pour les grands nombres c'est comme si il met longtemps !
à l'aide.merci
Premièrement, il n'affiche rien si le nombre n'est pas premier, deuxièmement, oui ça prend du temps pour les grands nombres premiers, car tu as pris le pire algorithme qui soit.
Dernière modification par nicolas.sitbon (Le 03/06/2009, à 12:26)
Hors ligne
#13 Le 03/06/2009, à 12:31
- /b/nt/
Re : [resolu] % (reste de division) et type long long en langage C
Merci
#14 Le 03/06/2009, à 16:09
- /b/nt/
Re : [resolu] % (reste de division) et type long long en langage C
Existe t-il une librairie (En C) contenant un algorithme ou une fonction isPrime répondant si un nombre est premier ou non à coup sûr ?
Merci
#15 Le 03/06/2009, à 16:29
- gilbert
Re : [resolu] % (reste de division) et type long long en langage C
Tu peux prendre la racine carrée de ton nombre et diviser sa partie entière par tous les nombres premiers inférieur à elle, tu gagneras beaucoup de temps par rapport à ton algorithme piéton...
Si j'étais toi, je chercherais une solution mathématique avant de commencer à coder..
EDIT: http://fr.wikipedia.org/wiki/Crible_d%27Atkin
Dernière modification par gilbert (Le 03/06/2009, à 16:35)
Simplement moi-même..
Hors ligne
#16 Le 04/06/2009, à 16:02
- ddmdllt
Re : [resolu] % (reste de division) et type long long en langage C
Si j'étais toi, je chercherais une solution mathématique avant de commencer à coder..
http://fr.wikipedia.org/wiki/Crible_d%27Atkin
Je plussois. À tout hasard, le but est de s'exercer au C ou tu comptes faire une utilisation pratique de ce test de primalité?
(En crypto je sais que bien souvent on a affaire à des premiers tellement grand que l'on est obligé de se contenter d'un "test probabiliste de primalité", voir par exemple http://fr.wikipedia.org/wiki/Test_de_pr … ller-Rabin)
Hors ligne
#17 Le 04/06/2009, à 20:35
- Le Farfadet Spatial
Re : [resolu] % (reste de division) et type long long en langage C
Salut à tous !
Existe t-il une librairie (En C) contenant un algorithme ou une fonction isPrime répondant si un nombre est premier ou non à coup sûr ?
C'est un doublon du fil de discussion que tu as créé hier et dans lequel tu as obtenues des réponses : http://forum.ubuntu-fr.org/viewtopic.php?id=322671. Pourquoi fractionner les réponses à une même question ? C'est beaucoup moins pratique.
Pour faire court : non, il n'y en a pas. Pour plus de détails, confère les réponses que tu as obtenu dans ton précédent fil de discussion. S'il y a des choses pas claires dedans, fait part de tes interrogations, tu devrais obtenir des éclaircissements.
En tout cas, ne soit pas surpris que ton code mette tant de temps à s'exécuter. Après, je ne sais pas sur quelle architecture tu tournes, mais tu vas vite trouver les limites de la puissance de calcul des ordinateurs personnels avec des tests de primarité.
Sinon, les cribles ne sont pas vraiment appropriés pour tester la primarité.
À bientôt.
Le Farfadet Spatial
Dernière modification par Le Farfadet Spatial (Le 04/06/2009, à 20:36)
Hors ligne
#18 Le 04/06/2009, à 22:12
- gilbert
Re : [resolu] % (reste de division) et type long long en langage C
gilbert a écrit :Si j'étais toi, je chercherais une solution mathématique avant de commencer à coder..
http://fr.wikipedia.org/wiki/Crible_d%27AtkinJe plussois. À tout hasard, le but est de s'exercer au C ou tu comptes faire une utilisation pratique de ce test de primalité?
(En crypto je sais que bien souvent on a affaire à des premiers tellement grand que l'on est obligé de se contenter d'un "test probabiliste de primalité", voir par exemple http://fr.wikipedia.org/wiki/Test_de_pr … ller-Rabin)
Je ne sais pas ce que fait /b/nt/ mais vu les posts à mon avis il est plus entrain de découvrir que de réaliser une application professionnelle...
Donc autant prendre les bonnes habitudes dès le début. ça vaut généralement (si ce n'est toujours) la peine de prendre un peu plus de temps à réfléchir avant de commencer à coder. Je ne dis pas qu'il faut réinventer l'eau chaude.. mais aujourd'hui il existe tellement de librairies, api etc. que le programmeur a tendance à devenir flemmard et son travaille ne consiste plus qu'à assembler des pièces d'un puzzle...
Si on réfléchit beaucoup plus spontanément, on aura tendance à savoir bien coder et donc réaliser soi même en une poignée de lignes ce qui fait par des centaines de lignes appelant une pléthores de librairies dont on n'utilise chaque fois qu'une seule méthode...
Et je pense qu'il est essentiel de s'entrainer à adopter un style épuré et sobre dès le début en ayant recours aux librairies que lorsque l'on en a réellement besoin.
donc oui à mon avis il est important de continuellement s'exercer à perfectionner son style de programmation.
Simplement moi-même..
Hors ligne
#19 Le 04/06/2009, à 22:32
- ddmdllt
Re : [resolu] % (reste de division) et type long long en langage C
Salut à tous !
/b/nt/ a écrit :Existe t-il une librairie (En C) contenant un algorithme ou une fonction isPrime répondant si un nombre est premier ou non à coup sûr ?
(...) Pour faire court : non, il n'y en a pas.
et int mpz_probab_prime_p (mpz_t n, int reps) de gnu mp? (probabiliste, et sur un type plus général que long long)
Hors ligne
#20 Le 04/06/2009, à 22:50
- Le Farfadet Spatial
Re : [resolu] % (reste de division) et type long long en langage C
Salut à tous !
Le Farfadet Spatial a écrit :Salut à tous !
/b/nt/ a écrit :Existe t-il une librairie (En C) contenant un algorithme ou une fonction isPrime répondant si un nombre est premier ou non à coup sûr ?
(...) Pour faire court : non, il n'y en a pas.
et int mpz_probab_prime_p (mpz_t n, int reps) de gnu mp? (probabiliste, et sur un type plus général que long long)
Hé bien, tu le dis toi-même : elle est probabiliste, donc elle n'indique pas la primalité « à coup sûr. » Pour entrer plus en détail, si jamais le retour est que le nombre n'est pas premier, on est certain que c'est bien le cas. Sinon, elle indique une probabilité que le nombre soit premier --- nous sommes d'accord, la probabilité est alors généralement très forte, mais ce n'est pas « à coup sûr. »
Donc, je persiste, pour faire court : non, puisqu'on va préférer des approches probabilistes. Mais la réponse était déjà dans le fil de discussion cité.
À bientôt.
Le Farfadet Spatial
Hors ligne
#21 Le 05/06/2009, à 00:39
- Le Farfadet Spatial
Re : [resolu] % (reste de division) et type long long en langage C
Salut à tous !
Et les algorithmes ici , ne sont pas à coup sûr ?!
Si.
Maintenant, test les avec 10000000033LLU.
C'est bien parce que ces algorithmes sont trop lents qu'on leur préfère des algorithmes probabilistes.
À bientôt.
Le Farfadet Spatial
Hors ligne
#22 Le 05/06/2009, à 06:06
- ddmdllt
Re : [resolu] % (reste de division) et type long long en langage C
Hé bien, tu le dis toi-même : elle est probabiliste, donc elle n'indique pas la primalité « à coup sûr. »
Ah oui, j'ai mal lu...
Euh par contre /b/nt n'a pas vraiment créé de doublon à la base : le problème au début du topic était vraiment l'opérateur modulo (%). Même si c'est vrai que dès que notre curiosité a été attirée, il aurait pu nous dire qu'il y avait un autre topic spécifique
Hors ligne
#23 Le 05/06/2009, à 14:51
- Le Farfadet Spatial
Re : [resolu] % (reste de division) et type long long en langage C
Salut à tous !
Euh par contre /b/nt n'a pas vraiment créé de doublon à la base
En effet, j'aurais plutôt dû dire que c'était redondant, plutôt que d'utiliser le terme « doublon. » Je ne lui reprochais pas d'avoir posé la question, au contraire, mais de disperser les réponses, ce qui rend difficile de suivre où il en est.
À bientôt.
Le Farfadet Spatial
Hors ligne
#24 Le 08/06/2009, à 09:42
- /b/nt/
Re : [resolu] % (reste de division) et type long long en langage C
gilbert a écrit :Si j'étais toi, je chercherais une solution mathématique avant de commencer à coder..
http://fr.wikipedia.org/wiki/Crible_d%27AtkinJe plussois. À tout hasard, le but est de s'exercer au C ou tu comptes faire une utilisation pratique de ce test de primalité?
(En crypto je sais que bien souvent on a affaire à des premiers tellement grand que l'on est obligé de se contenter d'un "test probabiliste de primalité", voir par exemple http://fr.wikipedia.org/wiki/Test_de_pr … ller-Rabin)
Oui j'en ai fait une utilisation pratique en établissant un lien entre les premiers dans les intervalles
[n^k, (n+1)^k], je ne sais pas si ce résultat aura une application importante en mathématique, mais pour le moment il a au moins confirmé que les techniques que j'ai introduites sont solides et plausibles : En effet j'ai appliqué la théorie de la relativité restreinte d'Einstein pour démontrer de nombreux conjectures avec cette théorie.
Ci-joint le code qui me donne raison, et que je souhaiterai que quelqu'un améliore pour qu'il soit utilisable pour les grands nombres en utilisant la librairie gmp.
/* Code simple écris et amélioré par M.S Le jeudi 4 juin 2009 à 10:47
Test éffectué jusqu'au N = 1000000000000000000 , et pour k =2,3,4,5,6
*/
#include <iostream>
#include <gmpxx.h>
using namespace std;
#include <math.h>
#include "/usr/local/include/gmp.h"
#define k 2
#define s 1 // s impair supérieur ou égale à 1
unsigned long long int N =1000000000000000000LLU;
unsigned long int m=138LLU ;/* m = n(k)= 138 Si k=2. Pour 3,4,5,6 prenez n(k)=1, et
pour les autres cas n(k) est à définir */
unsigned long long int puissance( unsigned long long int a, unsigned long long int b)
{
unsigned long long int i; unsigned long long int P = a;
for (i=1; i<b ; i++)
{P=P*a;
}
return P;
}
static bool IsPrime(unsigned int t)
{
if (t < 2) return false;
if (t < 4) return true;
if (t % 2 == 0) return false;
const unsigned int iMax = (int)sqrt(t) + 1;
unsigned int i;
for (i = 3; i <= iMax; i += 2)
if (t % i == 0)
return false;
return true;
}
unsigned long long int test( unsigned long int m , unsigned long long int T)
{
unsigned long int n=3; unsigned long int p=5 ;
for (n= m; puissance(n,k) < T; n++ ){
for (p = puissance(n,k); p< T; p++ ){
if ( IsPrime(p) )
{
if( puissance(n,k) < T &&p < puissance(n+1,k) &&
IsPrime(puissance(n+1,k)-puissance(n,k)-s+p ) ){
cout<<" OK pour "<<n<< " voici des exemples "<<p<< ", "<<
puissance(n+1,k)- puissance(n,k)-s+p <<endl;
n++;
p= puissance(n,k);
}
}
}
cout<<" The End "<< endl;
break;
}
}
int main (int argc, char **argv)
{
test(m,N);
return 0;
}
Dernière modification par /b/nt/ (Le 08/06/2009, à 10:33)
#25 Le 08/06/2009, à 10:13
- /b/nt/
Re : [resolu] % (reste de division) et type long long en langage C
On peut aussi modifier le code ci-dessus pour tester un autre résultat que j'ai démontré :
Le résultat est le suivant : On sait que la "conjecture de De Polignac" disait que tout entier pair >=2 est la différence entre deux nombres premiers d'une infinité de façons:
2*n = q-p , avec q et p premiers
conjecture que j'ai démontré, et j'ai même démontré :
2*n = q-p avec p<= 2*n, et q et p premiers
un code peut tester facilement ce résultat.
Dernière modification par /b/nt/ (Le 08/06/2009, à 10:23)