#include #include #include #include using namespace std; #define N_MAXPRIMES 10000 #define N_MAXFACTORS 128 bool is_prime(long long n, vector* primes); int factor(long long n, int* factors); float makephi(long long n, int* uniques, int nuniques); int array_unique(int* elements, int count, int* uniques); void check_validity(long long n); int main(int argc, char *argv[]) { long long max = strtoll(argv[1], NULL, 10); //vector primes; //primes.resize(N_MAXPRIMES); //ifstream Primes("primes_up_to_10m.txt"); (void) check_validity(max); int factors[N_MAXFACTORS]; int i = 0; int uniques[N_MAXFACTORS]; int nuniques, factnum = -1; long maxphi; long long maxintphi; long long n = max; //for(n=1;n<=max;n++) { nuniques = -1; factnum = -1; factnum = factor(n, factors); /*if(factnum != 0) { cout << n <<": "; for(i=0;i<=factnum;i++) { cout << factors[i] << " "; }cout << endl; } else { cout << n << ": is prime." << endl; }*/ if(factnum != 0) { nuniques = array_unique(factors, factnum, uniques); } long long phi = (signed int) makephi(n, uniques, nuniques); cout << "phi("<* primes = 0) { long sqrtn = (long) sqrt(n)+1; int i; if(/*n > N_MAXPRIMES*/1) { for(i=2;i<=sqrtn;i++) { if(n % i == 0) { return false; } } return true; } /*else { for(i=2;primes->at(i) <= sqrtn;i++) { if(n % primes->at(i) == 0) { return false; } } return true; }*/ } int factor(long long n, int* factors) { int i = 2; long long sqrtn = (long long) sqrt(n)+1; int factnum = 0; while(i<=sqrtn && factnum <= N_MAXFACTORS) { if((n % i) == 0) { factors[factnum] = i; /*vector* c; if(1) {c=ℙ}else{c=0;}*/ if(!(is_prime((n / i)))) { n = n/i; i=2; sqrtn = (long long) sqrt(n)+1; } else { if((n/i) != 1) {factors[++factnum] = n/i;} // Duh, we already know 1 is a factor break; } factnum++; }else{i++;} } return factnum; } float makephi(long long n, int* uniques, int nuniques) { //cout << "makephi(n: "<