#include #include #include int is_prime(int n) { if(n <= 1) { return -1; } int i; for(i = 2; i <= sqrt(n); i++) { if(n % i == 0) { return 0; } } return 1; } float euler_f(int n) { int last_prime = 0, i = 2; float e = n; while(n != 1) { if(n % i == 0 && is_prime(i)) { if(last_prime != i) { e = e * (1.0 - 1.0 / i); last_prime = i; } n = n / i; } else { i += 1; } } return e; } int main(int argn, char ** argv) { int number = atoi(argv[1]); int bound = atoi(argv[2]); int i; printf("Numbers that match: "); for(i = 1; i < bound; i ++) { if(euler_f(i) == number) { printf("%d, ", i); } } printf("\n"); return 0; } // The Euler function φ: N → N is a mapping associating to each positive integer n the number φ(n), which is the number of integers that are relatively prime to n. // For example φ(6) = 2 because only 1 and 5 are relatively prime to 6. // The formula for finding such a number is the following: // given n, φ(n) = n * (1 - 1 / P1) * ... * (1 - 1 / Pi), P1 to Pi being the set of prim factors of n