All pastes #570404 Raw Edit

Unnamed

public cpp v1 · immutable
·published 2007-06-16 17:54 UTC
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=&primes;}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);	}}