#include
<stdlib.h>
#include
<stdio.h>
#include
<math.h>
#include
<signal.h>
#include
<string.h>
#include
"mpi.h"
#include
"gmp.h"
int
main(int
argc,char *argv[]){
int
done = 0, myid, numprocs, i,check_another,result=0,not_prime,mpi_error;
char
prime_buffer[1000];
mpz_t isprime,divisor,sqroot,remainder,numprocs_z,range,my_range_top;
unsigned
long
zero=0;
unsigned
long
one=1;
unsigned
long
two=2;
int
true=1,first_time=1;
int
is_prime=1,is_not_prime=0;
double
startwtime, endwtime;
int
namelen;
char
*zero_string="0";
char
processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);
while
(!done) {
if
(myid == 0) {
strcpy(prime_buffer,zero_string);
printf("\nDo you want to test a number?\n 0= done \n 1=yes\n ");
fflush(stdout);
scanf("%d",&check_another);
not_prime=0; if
(check_another!=1)done=1;
if
(!done) {
printf("\nPlease input the number you wish to check\n");
fflush(stdout);
scanf("%s",prime_buffer);
}
startwtime = MPI_Wtime();
}
MPI_Bcast(prime_buffer, 1000, MPI_CHAR, 0, MPI_COMM_WORLD);
if
((strlen(prime_buffer) == 1)&&(prime_buffer[0]='0'))
done = 1;
else
{
if
(first_time) {
mpz_init (isprime);
mpz_init (divisor);
mpz_init(sqroot);
mpz_init(remainder);
mpz_init(numprocs_z);
mpz_init(range);
mpz_init(my_range_top);
first_time=0;
}
mpz_set_ui(numprocs_z,(unsigned
long
)numprocs);
mpz_set_str (isprime,prime_buffer, 10);
mpz_sqrt (sqroot, isprime); mpz_add_ui(sqroot,sqroot,one);
mpz_tdiv_q (range, sqroot, numprocs_z); if
(myid==(numprocs-1))
mpz_set(my_range_top,sqroot);
else
mpz_mul_ui (my_range_top,range, (unsigned
long
) (myid+1));
if
(myid==0) {
mpz_set_str(divisor,"2",10);
} else
{
mpz_mul_ui (divisor,range, (unsigned
long
) myid);
}
while
(true) {
mpz_tdiv_r (remainder, isprime, divisor); if
(mpz_cmp_ui(remainder, zero)==0) {
MPI_Send(&is_not_prime, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
break
;
}
mpz_add_ui(divisor,divisor,one);
if
(mpz_cmp(my_range_top, divisor)<0) {
MPI_Send(&is_prime, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
break
;
}
}
if
(myid == 0) {
for
(i = 0; i < numprocs; i++) {
MPI_Recv(&result,1, MPI_INT, i,0, MPI_COMM_WORLD, &status);
printf(" I heard %d from %d.\n",result,i);
fflush(stdout);
if
(result==is_not_prime) not_prime=1;
}
if
(not_prime==1)
printf("This is not a prime.\n");
else
printf("This is a prime.\n");
endwtime = MPI_Wtime();
printf("wall clock time = %f\n", endwtime-startwtime);
fflush(stdout);
}
}
}
mpi_error=MPI_Finalize();
if
(MPI_SUCCESS!=mpi_error)
return
mpi_error;
else
return
0;
}