rendered paste body#include <iostream>#include <math.h>#include <fstream>#include <vector>using namespace std;#define N_MAXPRIMES 10000#define N_MAXFACTORS 128bool is_prime(long long n, vector<signed int>* 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<signed int> 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("<<n<<") = "<<phi<<endl; //} return 1;}bool is_prime(long long n, vector<signed int>* 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<signed int>* 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: "<<n<<", factnum: "<<nuniques<<")\n"; float result = n; float divisor; int i; if(nuniques == -1) {if(n!=1){return (n-1);}else{return 1;}} for(i=0;i<=nuniques;i++) { divisor = (float) (1-((float) 1/((float) uniques[i]))); //cout << result << "*" << divisor << endl; result = (float) ((float)result * (float)divisor); // cout << "Result so far: " << result << endl; } return (float) result;}int array_unique(int* elements, int count, int* uniques) { int i,j = 0; int uniquecount = -1; bool error = false; for(i=0;i<=count;i++) { error = false; for(j=0;j<=uniquecount;j++) { if(elements[i] == uniques[j]) { error = true; } } if(!error) { uniquecount +=1; uniques[uniquecount] = elements[i]; } } return uniquecount;}void check_validity(long long n) { if(n<0) { cout << "Error: Negative number.\n"; exit(1); }else if(n==1) { cout << n << ": is a unit.\n"; exit(1); }else if(n==0) { cout << n << ": is a zero-divisor.\n"; exit(1); }}