Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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...)


David (Site web (fr) - Home page (en) - weblog)

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

ddmdllt a écrit :

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

/b/nt/ a écrit :
#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

/b/nt/ a écrit :

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

gilbert a écrit :

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)


David (Site web (fr) - Home page (en) - weblog)

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 !

/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 ?

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

ddmdllt a écrit :
gilbert a écrit :

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)

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

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)


David (Site web (fr) - Home page (en) - weblog)

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 !

ddmdllt a écrit :
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 !

/b/nt/ a écrit :

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

Le Farfadet Spatial a écrit :

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 wink


David (Site web (fr) - Home page (en) - weblog)

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 !

ddmdllt a écrit :

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

ddmdllt a écrit :
gilbert a écrit :

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)

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)