#!/usr/bin/env python import primes from bisect import bisect_left, bisect_right from pe_tools import nCr, approx_int_sqrt below_n = 10 ** 8 def num_coprimes_with(p, relevant_primes): max_p = below_n / p assert p <= max_p return bisect_right(relevant_primes, max_p) - bisect_left(relevant_primes, p) if __name__ == "__main__": relevant_primes = sorted(list(filter((lambda x: x < below_n), primes.get_huge_prime_set()))) print sum( num_coprimes_with(n, relevant_primes) for n in relevant_primes[: bisect_right(relevant_primes, approx_int_sqrt(below_n))] )
#!/usr/bin/env python from primes import is_prime, get_huge_prime_set primes = get_huge_prime_set() factors = [0] * (10 ** 6 + 1) def set_factors(): for i in range(len(factors)): if i < 4 or is_prime(i): factors[i] = [i] continue for p in primes: if i % p == 0: factors[i] = [p, i/p] break set_factors() def compute_factors(n): from itertools import chain from pe_tools import approx_int_sqrt if is_prime(n): return [n] s = approx_int_sqrt(n) for p in chain(primes, xrange(max(primes), s, 2)): if n % p == 0: return [n] + get_factors(n/p) raise Exception("Failed to factor {}".format(n))