Ejemplo n.º 1
0
def main():
    # We should not count N itself per problem requirement, so might as
    # well subtract 1 since otherwise all calculations only involve N-1.
    n = N - 1
    primes = primesieve.primes(math.sqrt(n))
    squares = [p * p for p in primes]
    n_squares = len(squares)
    q = collections.deque()
    # (next_index, current_length, current_product)
    #
    # next_index is the index of the next acceptable square factor,
    # current_length is the current number of square factors already in,
    # current_product is the product of all current square factors.
    q.append((0, 0, 1))
    count = 0
    while q:
        next_index, current_length, current_product = q.popleft()
        quotient = n // current_product
        # Inclusion-exclusion principle
        count += pow(-1, current_length) * quotient
        for i in range(next_index, n_squares):
            s = squares[i]
            if s > quotient:
                break
            q.append((i + 1, current_length + 1, current_product * s))
    print(count)
Ejemplo n.º 2
0
def method1(n):
    primes = primesieve.primes(n)
    primes_set = set(primes)
    n_primes = len(primes)
    q = collections.deque()
    q.append((0, 0, 1))
    # aggregate_count = 0
    total = 0
    while q:
        min_index, psum, pprod = q.popleft()
        rsum = n - psum
        if rsum in primes_set:
            # aggregate_count += 1
            total = (total + rsum * pprod) % MODULUS
        half_rsum = rsum // 2
        i = min_index
        while i < n_primes and (p := primes[i]) <= half_rsum:
            new_psum = psum
            new_pprod = pprod
            for count in range(1, rsum // p - 1):
                new_psum += p
                new_pprod = (new_pprod * p) % MODULUS
                q.append((i + 1, new_psum, new_pprod))
            if rsum % p == 0:
                # rsum = (rsum // p - 2) * p + 2p, with 2p remaining.
                # aggregate_count += 1
                total = (total + new_pprod * p * p) % MODULUS
            else:
                # rsum = (rsum // p - 2) * p + r, where p < r < 2p.
                new_psum += p
                new_pprod = (new_pprod * p) % MODULUS
                q.append((i + 1, new_psum, new_pprod))
            i += 1
Ejemplo n.º 3
0
def part2(program):
    b = 105700
    c = 122700
    step = 17

    primes = primesieve.primes(b, c)
    comps = [k for k in range(b, c + 1, step) if k not in primes]

    return len(comps)
Ejemplo n.º 4
0
def main():
    primes = primesieve.primes(3, LIMIT)
    single_factor_combos = []
    for p in reversed(primes):
        combos = find_prime_factor_combos(p)
        if combos:
            single_factor_combos.insert(0, (p, [set()] + combos))
    fat_combos = find_fat_combos(single_factor_combos)
    find_result_combos(fat_combos)
Ejemplo n.º 5
0
def count_as_sums_of_primes(n, less_than):
    if (n, less_than) in count_mem:
        return count_mem[(n, less_than)]
    output = 0
    for m in primes(min(n, less_than)):
        output += count_as_sums_of_primes(n - m, m)
    if n == 0:
        output += 1
    count_mem[(n, less_than)] = output
    return output
Ejemplo n.º 6
0
def main():
    max_length = int(sys.argv[1]) if len(sys.argv) > 1 else 10000
    validate(max_length)

    start = int(rank * (max_length / size))
    end = int(rank * (max_length / size) + (max_length / size))

    primes = np.array(primesieve.primes(start, end), dtype=np.long)

    gather_and_print(primes)
Ejemplo n.º 7
0
def main():
    primes = primesieve.primes(N)
    s = 1
    for p in primes:
        vp = 0
        n = N
        while n >= p:
            n //= p
            vp += n
        s *= 1 + pow(p, 2 * vp, MODULUS)
        s %= MODULUS
    print(s)
Ejemplo n.º 8
0
def gen_prime(min, max):
    """
  Eratosthenes sieve http://code.activestate.com/recipes/117119/
  https://github.com/hickford/primesieve-python 
  """
    prime_list = primesieve.primes(min, max)
    while (not prime_list):
        min = max
        max += 100
        prime_list = generate_primes(min, max)
    n = randint(0, len(prime_list) - 1)
    return prime_list[n]
Ejemplo n.º 9
0
def minsqrsum(n, maxtry=8):
    """Return a list n+1 long; array[n] is the least number of squares of primes or 1
    to sum to n, or 0 if more than maxtry are required."""
    last = floor(sqrt(n))
    facs = [0, 1] + list(primesieve.primes(last))
    numsum = [0] * (n + 1)
    for nums in combinations_with_replacement(facs, maxtry):
        val = sum(x**2 for x in nums)
        if val <= n:
            notzero = sum(1 for x in nums if x)
            if not numsum[val] or notzero < numsum[val]:
                numsum[val] = notzero
    return numsum
Ejemplo n.º 10
0
def calculate_pseudofortunates(N):
    primes = primesieve.primes(int(pow(N, 0.5)))
    n_primes = len(primes)
    admissibles = []
    q = collections.deque()
    q.append((1, 0))
    while q:
        n, i = q.popleft()
        if i < n_primes:
            p = primes[i]
            i += 1
            while (n := n * p) < N:
                admissibles.append(n)
                q.append((n, i))
Ejemplo n.º 11
0
def main():
    primes = primesieve.primes(999983)
    total = 0
    for k in range(len(primes) - 1):
        p = primes[k]
        q = primes[k + 1]
        pq = p * q
        for n in range(p * (p + 1), q * q, p):
            if n != pq:
                total += n
        for n in range(q * (q - 1), p * p, -q):
            if n != pq:
                total += n
    print(total)
Ejemplo n.º 12
0
def main():
    limit = 1000
    primes = primesieve.primes(limit // 2)
    n = len(primes)
    small_multipliers = []
    for i in range(n - 1):
        p = primes[i]
        if p**3 <= limit:
            small_multipliers.append(p**3)
        for j in range(i + 1, n):
            q = primes[j]
            if p * q <= limit:
                small_multipliers.append(p * q)
    small_multipliers.sort()
    print(len(small_multipliers), small_multipliers)
Ejemplo n.º 13
0
def prime_divisors(n: int):
    """Returns the prime divisors of a number, except 1.
    
        EX: prime_divisors(12) -> [2,3]
            prime_divisors(17) -> [17]
        - n   : The number to find the divisors of.
        
    prime_divisors(n: int) -> list"""
    divisors_ = divisors(n)[1:]
    primes_ = ps.primes(2,n+1) # Can be optimized by setting second limit to sqrt(n)
                               # I need an isprime() function first so that n can be tested
                               # for primality in a more efficient way
    pdivisors_ = [d for d in divisors_ if d in primes_] # Might be faster than searching for 
                                                        # p in divisors_
    return pdivisors_
Ejemplo n.º 14
0
def count(n):
    primes = primesieve.primes(n)
    sum_counts = collections.defaultdict(int)
    sum_counts[0] = 1
    for i, p in enumerate(primes):
        if (i + 1) % 100 == 0:
            print(f"progress: {i+1}-th prime")
        prev_sums = sorted(sum_counts.keys(), reverse=True)
        for prev_sum in prev_sums:
            sum_counts[prev_sum + p] = (sum_counts[prev_sum + p] +
                                        sum_counts[prev_sum]) % MODULUS
    total_count = 0
    for sum_, count in sum_counts.items():
        if miller_rabin.miller_rabin(sum_):
            total_count = (total_count + count) % MODULUS
    return total_count
Ejemplo n.º 15
0
def method3_non_recursive(n):
    primes = primesieve.primes(n)
    SS = [[1]]
    S = [1]
    for k in range(1, n + 1):
        if k % 5_000 == 0:
            print(f"progress: {k}")
        SSk = []
        pi = sympy.primepi(k)
        for i in range(pi):
            p = primes[i]
            SSkmp = SS[k - p]
            SSk.append(((SSk[i - 1] if i > 0 else 0) + p *
                        (SSkmp[i] if i < len(SSkmp) else
                         (SSkmp[-1] if SSkmp else 0))) % MODULUS)
        SS.append(SSk)
        S.append(SSk[pi - 1] if pi >= 1 else 0)
Ejemplo n.º 16
0
def method3(n):
    primes = primesieve.primes(n)

    # S[k, i] is the sum of numbers whose prime factor sum is k and
    # whose prime factors are among the primes[0], primes[1], ...,
    # primes[i].
    @functools.lru_cache(maxsize=None)
    def S(k, i):
        if k == 0:
            return 1
        if i < 0:
            return 0
        p = primes[i]
        if k < p:
            return S(k, i - 1)
        else:
            return (S(k, i - 1) + p * S(k - p, i)) % MODULUS

    return [S(k, sympy.primepi(k) - 1) for k in range(n + 1)]
Ejemplo n.º 17
0
def random_hdf5_params():
    factors = np.concatenate((primesieve.primes(28), [2, 2])).astype(int)
    n_dims = np.random.randint(2, 8)
    axes = np.ones(n_dims, dtype=int)

    for f in factors:
        axis = np.random.randint(0, n_dims)
        axes[axis] *= f

    sig_dims = np.random.randint(1, n_dims)

    chunking = np.zeros(n_dims, dtype=int)

    while np.prod(chunking) < 4096 or np.prod(chunking) > 128 * 1024 * 1024:
        for d in range(n_dims):
            # Distribution with heavy skew towards small chunk sizes
            chunking[d] = int(np.exp(np.random.uniform(0, np.log(axes[d]))))

    return (factors, axes, chunking, sig_dims)
Ejemplo n.º 18
0
def method2(n):
    primes = primesieve.primes(n)
    n_primes = len(primes)
    S = [1]
    for k in range(1, n + 1):
        s = 0
        q = collections.deque()
        q.append((0, k, 1, -1))
        while q:
            min_index, rsum, pprod, sign = q.popleft()
            if min_index > 0:
                s = (s + sign * pprod * S[rsum]) % MODULUS
            for i in range(min_index, n_primes):
                p = primes[i]
                if p > rsum:
                    break
                q.append((i + 1, rsum - p, (pprod * p) % MODULUS, -sign))
        S.append(s)
    return S
Ejemplo n.º 19
0
def main():
    limit = 1_000_000_000_000
    primes = primesieve.primes(pow(limit, 1 / 2))
    squbes = set()
    for q in primes:
        q3 = pow(q, 3)
        if q3 * 4 > limit:
            break
        for p in primes:
            if p == q:
                continue
            n = p * p * q3
            if n > limit:
                break
            s = str(n)
            if "200" not in s:
                continue
                squbes.add(n)
            length = len(s)
            failed = False
            for i in range(length):
                ss = [ch for ch in s]
                d = s[i]
                if i == 0:
                    replacements = set("123456789")
                elif i == length - 1:
                    replacements = set("1379")
                else:
                    replacements = set("0123456789")
                replacements.discard(d)
                for dd in replacements:
                    ss[i] = dd
                    nn = int("".join(ss))
                    if miller_rabin.miller_rabin(nn):
                        failed = True
                        break
                if failed:
                    break
            if not failed:
                squbes.add(n)

    for i, n in enumerate(sorted(squbes)):
        print(i + 1, n)
Ejemplo n.º 20
0
def search_row(n):
    # (n+k)-th row: (n+k-1)(n+k)/2 + 1 to (n+k+1)(n+k)/2
    # (n-2)-th to (n+2)-th row: (n-2)(n-3)/2 + 1 to (n+2)(n+3)/2
    primes = primesieve.primes((n - 2) * (n - 3) // 2 + 1,
                               (n + 2) * (n + 3) // 2)

    rows = {
        row_num: [False for _ in range(row_num)]
        for row_num in range(n - 2, n + 3)
    }
    row_starts = {}

    row_start = (n - 2) * (n - 3) // 2 + 1
    row_num = n - 2
    row_starts[row_num] = row_start

    nth_row_prime_coords = []
    for p in primes:
        if p >= row_start + row_num:
            row_start = row_start + row_num
            row_num += 1
            row_starts[row_num] = row_start
        rows[row_num][p - row_start] = True
        if row_num == n:
            nth_row_prime_coords.append(p - row_start)

    elligible_primes = []
    x = n
    for y in nth_row_prime_coords:
        p = row_starts[x] + y
        for (dx1, dy1), (dx2, dy2) in possible_extensions:
            x1 = x + dx1
            y1 = y + dy1
            x2 = x + dx2
            y2 = y + dy2
            if not (0 <= y1 < x1 and 0 <= y2 < x2):
                continue
            if rows[x1][y1] and rows[x2][y2]:
                elligible_primes.append(p)
                break

    return elligible_primes
Ejemplo n.º 21
0
def decimal_terminates(numerator: int, denominator: int):
    """Returns True if a fraction terminates.
    
    decimal_terminates(numerator: int, denominator: int) -> bool"""

    ## Concept: All simplified fractions whose denominators have any prime factors other than
    ##          1, 2, or 5 are non-terminating in base 10.

    # Auto-simplify the fraction unless it is very large
    n = Fraction(numerator, denominator).denominator
    # Check for prime factors other than 1, 2, or 5 in the denominator
    if n <= 2:
        primes = [3, 7]
    if n > 2:
        primes = [3, 7] + [p for p in ps.primes(10, n + 1)]
        # If sqrt limit is used, the function excludes the case that n is prime

    # If any of the primes evenly divides n, return False (denom isn't terminating)
    if any([not n % p for p in primes]):
        return False
    return True  # Return true by default
Ejemplo n.º 22
0
def main():
    global primes, factorizations, appearances
    prime_bound = int(math.sqrt(bound))
    primes = primesieve.primes(prime_bound)
    prime_index = {p: i for i, p in enumerate(primes)}
    appearances = [[] for _ in primes]
    for i, p in enumerate(primes):
        factorization = []
        for q, e in sorted(sympy.ntheory.factorint(p - 1).items(),
                           reverse=True):
            factorization.append((prime_index[q], q, e))
            appearances[prime_index[q]].append((i, p, e))
        factorizations.append(factorization)

    for i, p in enumerate(primes):
        orphans = {j: e % 3 for j, _, e in factorizations[i] if e % 3 != 0}
        n = p * p
        while n < bound:
            search(n, i, orphans)
            n *= p * p * p

    global results
    count = len(results)
    sorted_results = sorted(results)
    s = collections.deque()
    s.append((1, -1))
    while s:
        n, i = s.pop()
        if n != 1:
            results.add(n)
        for j in range(i + 1, count):
            prod = n * sorted_results[j]
            if prod >= bound:
                break
            if math.gcd(n, sorted_results[j]) == 1:
                s.append((prod, j))
    # print(sorted(results))
    print(sum(results))
Ejemplo n.º 23
0
def main():
    limit = int(math.sqrt(N))
    primes = primesieve.primes(limit)
    is_composite = [True] * (limit + 1)
    is_composite[1] = False
    for p in primes:
        is_composite[p] = False
    is_power = [False] * (limit + 1)
    total = 0
    for a in range(2, limit + 1):
        if is_power[a]:
            continue
        a_is_composite = is_composite[a]
        b = 2
        n = a * a
        while n <= N:
            if a_is_composite or is_composite[b]:
                total += n
            if n <= limit:
                is_power[n] = True
            b += 1
            n *= a
    print(total - 16)
Ejemplo n.º 24
0
def main():
    total = 0
    primes = set(primesieve.primes(BOUND))
    for g in range(2, BOUND // 4 + 1):
        root = int(math.sqrt(g))
        if root * root == g:
            if root % 2 == 0 and root == int(math.sqrt(root))**2:
                print(f"progress: {g}")
            continue
        for c0 in range(2, int(math.sqrt((BOUND - 1) / g)) + 1):
            c = g * c0 * c0 - 1
            if not c in primes:
                continue
            for a0 in range(1, c0):
                if math.gcd(a0, c0) != 1:
                    continue
                a = g * a0 * a0 - 1
                if not a in primes:
                    continue
                b = g * a0 * c0 - 1
                if not b in primes:
                    continue
                total += a + b + c
    print(total)
Ejemplo n.º 25
0
# the OG project is looking at ranges of .1M = 100,000
SIZE = 100000
rem_threshold = 2 * (SIZE // 100)
extra_threshold = 40

# [0, SIZE], [SIZE, 2*SIZE], [2*SIZE, 3*SIZE]
# don't have to work about overlap with ] and [ because SIZE is composite
counts = [[0, 0] for _ in range(0, STOP, SIZE)]

# I want this to contain all primes without factors
# Ideally we'd do something in two passes, or one combined pass
# to avoid adding then removing all primes but that's hard to write.
unfactored = [set() for _ in range(0, STOP, SIZE)]

for prime in primesieve.primes(0, STOP):
    interval = prime // SIZE
    counts[interval][0] += 1
    unfactored[interval].add(prime)

##### Handle Numbers with factors (and mersenne primes) #####

with open(factor_fn) as f:
    last_m = 0
    for line in f:
        raw = line.split(",")
        m, k = int(raw[0]), int(raw[1])
        if m > STOP:
            break

        assert pow(2, m, 2 * m * k + 1) == 1
Ejemplo n.º 26
0
def is_powerful(n):
    for p in primesieve.primes(n):
        if n%p==0 and n%int(math.pow(p,2))!=0:
            return False
    return True
Ejemplo n.º 27
0
from primesieve import primes

p = primes(1000000)
index = 0
ans = 1
while ans * p[index] <= 1000000:
    ans = ans * p[index]
    index = index + 1
print(ans)
Ejemplo n.º 28
0
def test_converter_3():
    primes_test = primes(990000000, 999999999)
    for n in primes_test:
        assert to_number(num2words(n, lang="es")) == n
Ejemplo n.º 29
0
15 = 3 × 5

The first three consecutive numbers to have three distinct prime factors are:

644 = 2² × 7 × 23
645 = 3 × 5 × 43
646 = 2 × 17 × 19.

Find the first four consecutive integers to have four distinct prime factors each. What is the first of these numbers?
'''

import primesieve

limit = 100000

primes = primesieve.primes(limit)


def get_distinct_prime_factors(n, primes):
    result = 1
    for p in primes:
        if p * p > n:
            break
        f = False
        while n % p == 0:
            f = True
            n = n // p
        if f:
            result += 1
    return result
Ejemplo n.º 30
0
#! python3
# $ pip3 install primesieve
# Answer: 17427258 in 0m1.190s unix time (time python3 pe187.py)
import primesieve
n = 10**8
sqrt_n = 10**4
primes = primesieve.primes(n/2)
end = len(primes) - 1
start = 0
result = 0
for p in primes:
    if sqrt_n < p:
        break
    while n < primes[end] * p:
        end -= 1
    result += end - start + 1
    start += 1
print(result)
 def test_prime_given(self):
     self.cases(function=lambda n: primes_of_n(n, ls_prime=primes(100)))
Ejemplo n.º 32
0
    number = [i for i in str(number)]
    l = len(number)
    low = l - 1
    while low > 0:
        if number[low] > number[low - 1]:
            for high in reversed(range(low, l)):
                if number[high] > number[low - 1]:
                    number[high], number[low - 1] = number[low -
                                                           1], number[high]
                    number[low:] = number[low:][::-1]
                    return int(''.join(number))
        low -= 1
    return 0


prime_numbers = primes(1000, 9999)
visited = set()
selected_primes = {}

for p in prime_numbers:
    if p in visited:
        continue
    c = [p]
    visited.add(p)
    n = p
    while True:
        n = find_next_permutation(n)
        if n < 1000:
            break
        if n in prime_numbers:
            c.append(n)