Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Problemi con questo codice...

    Ciao a tutti,
    premetto che da qualche mese mi sto cimentando nell'utilizzo di C dopo una buona esperienza (universitaria) con la programmazione in Pascal.
    Detto questo, mi trovo in difficoltà proprio con un progetto che devo presentare per un esame: il codice che posto dovrebbe essere perfettamente funzionate, il solo difetto che ho riscontrato è che inizialmente stampa a video 2 volte consecutivamente la stessa identica cosa all'interno del ciclo while con condizione (esito == 0).
    Help Me!!!

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    #define DIM 64

    int binario(int);
    long int esponenziazione(int,int,int);
    long int potenza(int, int);

    int n, k, s, a, i, j, l, esito;
    int vet[DIM];
    long int riduz, p, t, aux;

    void main()
    {
    for(i=0;i<DIM;i++)
    {
    vet[i]=0;
    }
    do
    {
    printf("Introduci due numeri naturali n,k > 1: ");
    scanf("%d %d", &n, &k);
    } while (n<2 || k<2);
    esito=0;
    while (esito==0)
    {
    long int limite = potenza(10,n-1);
    srand(time(NULL));
    do
    {
    p = limite+rand()%(9*limite);
    } while (p%2 == 0);
    printf("Il test verra' effettuato sul valore %d\n", p);
    s = 0;
    t = p-1;
    while (t%2 == 0)
    {
    t = (t)/2;
    s++;
    }
    for (i=1; i<=k; i++)
    {
    a = 2+rand()%(p-2);
    aux = esponenziazione(a,t,p);
    if ((aux == 1) || (aux == p-1))
    {
    esito=1;
    }
    else
    {
    j = 1;
    while ((j<=s) && (esito == 0))
    {
    aux = (potenza(aux,2))%p;
    if (aux == p-1)
    {
    esito=1;
    }
    j++;
    }

    }
    if (esito == 0)
    {
    printf("Il valore %d per a=%d e' non primo.\n", p, a);
    }
    else
    {
    printf("Il valore %d per a=%d e' primo.\n", p, a);
    }
    }
    getchar();
    }
    getchar();
    }


    int binario(int esponente)
    {
    int i=0;
    while(esponente != 0)
    {
    if((esponente%2)==0)
    {
    vet[i]=0;
    }
    else
    {
    vet[i]=1;
    }
    esponente=esponente/2;
    i++;
    }
    printf("%d\n", i);
    return i;
    }


    long int potenza(int b, int e)
    {
    long int pot=b;

    if (e == 0)
    {
    pot=1;
    }

    else if (e > 1)
    {
    while (e>1)
    {
    pot = pot*b;
    e--;
    }
    }
    return pot;
    }


    long int esponenziazione(int base, int esponente, int modulo)
    {
    int y=1;
    int i=l;
    while (i>=0)
    {
    y = (potenza(y,2)*potenza(base,vet[i]))%modulo;
    i = i--;
    }
    return y;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    39
    Ma ti scrive 2 volte cosa??
    Il test verrà effettuato sul valore?

    comunque prova a mettere la srand fuori dalla while, l'inizializzazione sarebbe meglio farla una volta sola per programma!

  3. #3

    risposta

    Praticamente una volta entrato nel while con condizione (esito==0) il programma, sinteticamente, dovrebbe generare un numero casuale e su questo effettuare un test di primalità (Rabin-Miller), appunto per verificare se il numero è primo o meno.
    Se questo non è un numero primo il programma rientra nel while e genera un nuovo numero finchè esito=1 (il numero è primo).
    Nota che alla fine del while ho messo un getchar() per capire se il programma effettivamente rientra nel ciclo; ma questo non avviene la prima volta, cioè: genera il numero, effettua i testi, se il numero è primo si ferma se non lo è rientra nel while ignorando il getchar() (?????) e rieffettuando il test sullo stesso numero, dopodichè si "ferma" al getchar().

    Ho portato il comando srand(time(NULL)) come mi hai consigliato: l'unico cambiamento è che adesso non effettua il test sullo stesso numero ma lo cambia, comunque sempre ignorando il getchar(); ed è questa la cosa che non capisco!!!

    Posto il nuovo codice corretto:


    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    #define DIM 64

    int binario(int);
    long int esponenziazione(int,int,int);
    long int potenza(int, int);

    int base, esponente, modulo, n, k, s, a, i, j, l, esito;
    int vet[DIM];
    long int riduz, p, t, aux;

    void main()
    {
    srand(time(NULL));
    for(i=0;i<DIM;i++)
    {
    vet[i]=0;
    }
    do
    {
    printf("Introduci due numeri naturali n,k > 1: ");
    scanf("%d %d", &n, &k);
    } while (n<2 || k<2);
    esito=0;
    while (esito==0)
    {
    long int limite = potenza(10,n-1);
    do
    {
    p = limite+rand()%(9*limite);
    } while (p%2 == 0);
    printf("Il test verra' effettuato sul valore %d\n", p);
    s = 0;
    t = p-1;
    while (t%2 == 0)
    {
    t = (t)/2;
    s++;
    }
    printf("T-S = %d-%d\n", t,s);
    l = binario(t);
    i=1;
    while (i<=k && esito==0)
    {
    a = 2+rand()%(p-2);
    aux = esponenziazione(a,t,p);
    printf("Questo e' AUX al primo tentativo: %d\n", aux);
    if ((aux == 1) || (aux == p-1))
    {
    esito=1;
    printf("Esito e' 1 al primo tentativo\n");
    }
    else
    {
    j = 2;
    while ((j<=s) && (esito == 0))
    {
    aux = (potenza(aux,2))%p;
    printf("Questo e' AUX al %d tentativo: %d\n", j, aux);
    if (aux == p-1)
    {
    esito=1;
    printf("Esito e' 1 al %d tentativo\n",j);
    }
    j++;
    }

    }
    if (esito == 0)
    {
    printf("Il valore %d per a=%d e' non primo.\n", p, a);
    }
    else
    {
    printf("Il valore %d per a=%d e' primo.\n", p, a);
    }
    i++;
    }
    getchar();
    }
    getchar();
    }


    int binario(int esponente)
    {
    int i=0;
    while(esponente != 0)
    {
    vet[i] = esponente%2;
    esponente=esponente/2;
    i++;
    }
    return (i-1);
    }



    long int potenza(int b, int e)
    {
    long int pot=b;

    if (e == 0)
    {
    pot=1;
    }

    else if (e > 1)
    {
    while (e>1)
    {
    pot = pot*b;
    e--;
    }
    }
    return pot;
    }


    long int esponenziazione(int base, int esponente, int modulo)
    {
    int y=1;
    int i=l;
    while (i>=0)
    {
    y = (potenza(y,2)*potenza(base,vet[i]))%modulo;
    i--;
    }
    return y;
    }


    Grazie mille per l'aiuto!

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    ciao,

    il codice lo devi inserire tra i tag code e /code altrimenti non si capisce quasi nulla

  5. #5

    codice

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define DIM 64
    
    int binario(int);
    long int esponenziazione(int,int,int);
    long int potenza(int, int);
    
    int base, esponente, modulo, n, k, s, a, i, j, l, esito;
    int vet[DIM];
    long int riduz, p, t, aux;
    
    void main()
    {
       srand(time(NULL));
       for(i=0;i<DIM;i++)
       {
          vet[i]=0;
       }
       do
       {
          printf("Introduci due numeri naturali n,k > 1: ");
          scanf("%d %d", &n, &k);
       } while (n<2 || k<2);
       esito=0;
       while (esito==0)
       {
          long int limite = potenza(10,n-1);
          do
          {
             p = limite+rand()%(9*limite);
          } while (p%2 == 0);
          printf("Il test verra' effettuato sul valore %d\n", p);
          s = 0;
          t = p-1;
          while (t%2 == 0)
          {
             t = (t)/2;
             s++;
          }
          printf("T-S = %d-%d\n", t,s);
          l = binario(t);
          i=1;
          while (i<=k && esito==0)
          {
             a = 2+rand()%(p-2);
             aux = esponenziazione(a,t,p);
             printf("Questo e' AUX al primo tentativo: %d\n", aux);
             if ((aux == 1) || (aux == p-1))
             {
                esito=1;
                printf("Esito e' 1 al primo tentativo\n");
             }
             else
             {
                j = 2;
                while ((j<=s) && (esito == 0))
               {
                  aux = (potenza(aux,2))%p;
                  printf("Questo e' AUX al %d tentativo: %d\n", j, aux);
                  if (aux == p-1)
                 {
                    esito=1;
                    printf("Esito e' 1 al %d tentativo\n",j);
                 }
                 j++;
               }
            }
            if (esito == 0)
            {
               printf("Il valore %d per a=%d e' non primo.\n", p, a);
            }
            else
            {
               printf("Il valore %d per a=%d e' primo.\n", p, a);
            }
            i++;
          }
          getchar();
       }
    getchar();
    }
    
    
    int binario(int esponente)
    {
       int i=0;
       while(esponente != 0)
       {
          vet[i] = esponente%2;
          esponente=esponente/2;
          i++;
       }
       return (i-1);
    }
    
    
    long int potenza(int b, int e)
    {
       long int pot=b;
    
       if (e == 0)
       {
          pot=1;
       }
       else if (e > 1)
       {
          while (e>1)
         {
            pot = pot*b;
            e--;
         }
       }
       return pot;
    }
    
    
    long int esponenziazione(int base, int esponente, int modulo)
    {
       int y=1;
       int i=l;
       while (i>=0)
       {
          y = (potenza(y,2)*potenza(base,vet[i]))%modulo;
          i--;
       }
       return y;
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.