예제 #1
0
#!/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))]
    )
예제 #2
0
#!/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))