*
Hi
Nun dass fertige funktionierende Programm:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <stdint.h>
#include <stdio.h>
typedef enum {false,true} bool;
int jobsize = 50000;
int anzproz = 50;
bool debug = false;
unsigned long long primecandidate;
bool isprime(long long number);
int main(int argc, char* const argv[]) {
if(argc<2){
printf("Usage: fac <NUMBER>\n");
exit(1);
}
primecandidate = strtoull(argv[1],NULL,10);
if (primecandidate > UINT64_MAX ){
printf("Usage: fac <NUMBER>\n");
exit(1);
}
pid_t fork_res[anzproz];
pid_t wait_res;
FILE * file;
file = fopen("fact","wa");
unsigned long long min;
unsigned long long max;
unsigned long long i = 2;
unsigned long l = 0;
printf("Begin of factorization: %s\n",argv[1]);
bool last = false;
while(i*i <= primecandidate && !last){
min = i;
max = min + jobsize + 1;
if(max*max > primecandidate){
max = (unsigned long)(sqrt(primecandidate));
last = true;
}
if (debug)
printf("Job from %llu to %llu\n",min,max);
fork_res[l] = fork();
if(fork_res[l]==0)
{
if (debug)
printf("New fork-process, calcing number: %llu\n",primecandidate);
while (min <= max){
if (debug){
printf("Check %llu %llu\n",min,primecandidate);
sleep(1);
}
if (isprime(min) && primecandidate%min==0){
primecandidate = primecandidate/min;
printf("Found factor: %llu\n",min);
fprintf(file,"%llu\n",min);
} else {
if (min==2) min = 3;
else min += 2;
}
}
if (debug){
printf("Job done\n");
sleep(1);
}
exit(0);
} else if (fork_res[l] == -1) {
perror("Fork:");
}
if(l == anzproz){
if (debug)printf("wait\n");
int m;
for (m = 0; m <= l; ++m){
int status;
waitpid(fork_res[m],&status,0);
}
l = 0;
if (debug)printf("end wait\n");
} else {
++l;
}
i = max;
}
int m;
for (m = 0; m < l; ++m){
int status;
waitpid(fork_res[m],&status,0);
}
fclose(file);
file = fopen("fact","r");
char puf[30];
while(fgets(puf, 30, file)){
primecandidate = primecandidate/strtoull(puf,NULL,10);
}
fclose(file);
if(debug)
printf("Mainloop finished\n");
printf("Last factor %llu\n",primecandidate);
exit(0);
}
bool isprime(long long number) {
if (number <= 3) return true;
if ((number % 2) == 0) return false;
long l;
for (l = 5; l * l <= number; l+=2)
if ((number % l) == 0) return false;
return true;
}