/*--------------------------------------------------------------
 Test di primalita' di Miller 
 (implementato da Francesco Turchini)
   ---------------------------------------------------------------
 Attenzione: in questo programma usiamo i soli tipi predefinti del
   C. Per x del tipo long, il prodotto x*x mod n e'
   corretto solo per
 x < 46.340 = sqrt(2.147.483.647 = maxLongint).
 Non e' tuttavia difficile modificare l'algoritmo
   includendo la definizione di tipi numerici di
   dimensioni maggiori di longint, usando ad esempio
   record o array. 
   */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DIM 16
#define NT 10
long n;
long n2[DIM];
long b;
int sw;
int i;
int miller;
void crean2(long a)
   {
    int c;
    for (c=0;c<DIM;c++)
    {
    n2[c]= a % 2;
    a=a / 2;
    }
   }

void test(long a,long m)
   {
    long x;
    long d;
    int c;
    miller=0;
    d=1;
    c=DIM;
    while(c>=0)
    {
     x=d;
     d=(d*d)%m;
     if ((d==1)&&(x!=1)&&(x!=m-1)) miller=1;
     if (n2[c]==1) d=(d*b)%m;
     c--;
    }
    if (d!=1) miller=1;
   }

main()
   {
    int numeri=0;
    int primi=0;
    n=1;
    printf("TEST DI PRIMALITA' DI MILLER-RABIN VERSIONE C \n");
    printf(" (realizzato con Microsoft Quick C) \n");
    printf("\n");
    printf("Digitare 0 per uscire.");
    printf("\n");
    while(n!=0)
    {
     numeri++;
     srand((unsigned)time( NULL ) );
     printf("Inserisci il numero da testare: ");
     scanf("%d",&n);
     if(n!=0)
     {
      crean2(n-1);
      sw=0;
      i=0;
      b=0;
      while((i<NT)&&(sw==0))
      {
       while(b==0)
       {
        b=((rand() * n) / RAND_MAX);
       }
       test(b,n);
       if ((sw==0)&&(miller==1)) sw=1;
       else if ((sw==0)&&(miller==0)) sw=0;
       else if ((sw==1)&&(miller==0)) sw=1;
       else sw=1;
       i++;
      }
      if (sw==0) 
      { 
       printf("Primo con margine di errore inferiore a 2^-%d \n", NT);
       primi++;
      }
      else printf("Composto \n");
     }
    } 
    printf("Numeri testati: %d \n",numeri-1);
    printf("Numeri primi: %d \n",primi);
    scanf("%d");
   }

Per scaricare il sorgente C fare clic qui col destro e scegliere "Salva oggetto con nome".