示例#1
0
def get_candidates(limit):
    """Returns a list of candidate values for a and b.  a and b should always
    be 1, -1, a prime or a negative prime.
    """
    candidate_primes = list(takewhile(lambda n: n <= limit, gen_primes()))

    return [1] + candidate_primes + [-1] + [-x for x in candidate_primes]
示例#2
0
def solve(limit, search_delta=0.3):
    lower = int(sqrt(limit) * (1 - search_delta))
    upper = int(sqrt(limit) * (1 + search_delta))
    primes = list(ibetween(gen_primes(), lower, upper))

    info(f"Searching using prime factors {lower} < p < {upper}")

    result_n, result_q = None, inf

    for factors in combinations(primes, 2):
        n = prod(factors)

        if n > limit:
            continue

        phi_n = phi(n)

        if is_permutation(n, phi_n):
            q = n / phi_n

            if q < result_q:
                result_n, result_q = n, q

            info(f"n = {n}\tphi(n) = {phi_n}\tn/phi(n) = {q}")

    return result_n
示例#3
0
def solve(limit):
    """Returns the sum of all primes below limit.

    >>> solve(10)
    17
    """
    return sum(takewhile(lambda p: p < limit, gen_primes()))
示例#4
0
def solve():
    four_digit_primes = set(ibetween(gen_primes(), LOWER, UPPER))

    for prime in four_digit_primes:
        prime_permutations = digit_permutations(prime) & four_digit_primes
        terms_of_three = combinations(prime_permutations, 3)

        for terms in terms_of_three:
            if equidistant(terms):
                result = join_digits(terms)
                if result != EXCLUDE:
                    return result
示例#5
0
def largest_prime_factor(n):
    """
    >>> largest_prime_factor(13195)
    29
    """
    largest_factor = 0
    limit = sqrt(n)

    for p in takewhile(lambda p: p < limit, gen_primes()):
        if n % p == 0:
            largest_factor = p

    return largest_factor
示例#6
0
def solve(target):
    truncatable_primes = set()
    primes = dropwhile(lambda p: p in EXCLUDE, gen_primes())

    for p in primes:
        if len(truncatable_primes) == target:
            break

        truncations_p = truncations(p)
        if all(map(is_prime, truncations_p)):
            info(f"{p} = {truncations_p}")
            truncatable_primes.add(p)

    return sum(truncatable_primes)
示例#7
0
def solve(group_size=4, limit=1000):
    primes = list(takewhile(lambda n: n < limit, gen_primes()))
    pairs = prime_pairs(primes)
    lowest_sum = math.inf

    for prime in primes:
        groups = make_groups(
            frozenset([prime]), pairs[prime], group_size, pairs)

        for group in groups:
            if sum(group) < lowest_sum:
                lowest_sum = sum(group)

    return lowest_sum
示例#8
0
def solve(limit):
    """Returns the numbers of circular primes below limit.

    >>> solve(100)
    13
    """
    primes = takewhile(lambda n: n < limit, gen_primes())
    count = 0

    for p in primes:
        if all(map(is_prime, rotations(p))):
            info(p)
            count += 1

    return count
示例#9
0
def solve(target=5):
    n = 0
    ways = 0
    prime = gen_primes()
    primes = (next(prime), )

    while ways < target:
        n += 1

        while primes[0] < n:
            primes = (next(prime), ) + primes

        ways = partitions(n, primes)

    return n
示例#10
0
def solve():
    masks = defaultdict(set)

    for prime in gen_primes():
        digits = str(prime)

        for masked_digit in set(digits):
            masked = digits.replace(masked_digit, "x")

            for replaced_digit in range(10):
                candidate = int(masked.replace("x", str(replaced_digit)))

                # Discard leading zeros
                if len(str(candidate)) != len(masked):
                    continue

                if is_prime(candidate):
                    masks[masked].add(candidate)

            if len(masks[masked]) >= TARGET:
                return min(masks[masked])
示例#11
0
def solve(limit=50):
    numbers = set()
    primes = list(takewhile(lambda p: p < sqrt(limit), gen_primes()))

    for a in primes:
        a2 = a**2

        for b in primes:
            b3 = b**3

            ab = a2 + b3

            for c in primes:
                c4 = c**4
                abc = ab + c4

                if abc >= limit:
                    break

                info(f"{abc} = {a}^2 + {b}^3 + {c}^4")
                numbers.add(abc)

    return len(numbers)
示例#12
0
import itertools
from common.primes import gen_primes, is_prime

LIMIT = 1_000_000

primes = list(itertools.takewhile(lambda p: p < LIMIT, gen_primes()))

longest = 0
result = 0

for start in range(0, len(primes)):
    prime_slice = primes[start:]
    total = 0

    for length, prime in enumerate(prime_slice, 1):
        total += prime

        if total >= LIMIT:
            break

        if length > longest and is_prime(total):
            longest = length
            result = total

print(result)
示例#13
0
def solve(target):
    return nth(gen_primes(), target)
示例#14
0
import itertools
from common.primes import gen_primes, is_prime

limit = 10_000
PRIMES = list(itertools.takewhile(lambda n: n < limit, gen_primes()))


def is_twice_square(n):
    """Returns whether n is twice a square

    >>> is_twice_square(2 * (3 ** 2))
    True

    >>> is_twice_square(2 * (4 ** 2))
    True
    """
    return ((n / 2) ** 0.5).is_integer()


def is_prime_plus_twice_square(n):
    """Returns whetner n can be written as a prime plus two times a square
    """
    for prime in PRIMES:
        if prime >= i:
            break

        if is_twice_square(i - prime):
            return True

    return False