Example #1
0
def solve():
    longestLength = 0
    smallestMember = None
    seen = set()
    sieve(10**6)
    for n in xrange(2, 1000001):
        if n in seen:
            continue
        chainIndices = {n: 0}
        i = 0
        while n > 1:
            n = aliquot(n)
            i += 1
            if n > 1000000: break
            # This ^^ technically doesn't comply with a _prima facie_
            # interpretation of the problem, but it makes the program terminate
            # in under a minute with the correct answer, so...
            if n in chainIndices:
                i2 = chainIndices[n]
                if i - i2 > longestLength:
                    chain = [m for m,j in chainIndices.iteritems() if j >= i2]
                    if all(m <= 1000000 for m in chain):
                        longestLength = i - i2
                        smallestMember = min(chain)
                break
            elif n in seen:
                break
            seen.add(n)
            chainIndices[n] = i
    return smallestMember
Example #2
0
def solve():
    sieve(500)
    P = [Fraction(2 if isPrime(i) else 1, 3) for i in xrange(1, 501)]
    N = [1 - p for p in P]
    state = [Fraction(1, 500)] * 500
    for primal in [P if c == 'P' else N for c in 'PPPPNNPPPNPPNPN']:
        state = jump(map(operator.mul, state, primal))
    return sum(state)
Example #3
0
def solve():
    sieve(12000)
    cache = [0,0,0,0] + [None] * 12001
    qty = 0
    for d in xrange(4, 12001):
        cache[d] = twixtQty(d) - sum(cache[div] for div in divisors(d)
                                                if div != d)
        qty += cache[d]
    return qty
Example #4
0
def solve():
    factors = [0] * 20
    accum = 1
    sieve(20)
    for i in xrange(1, 21):
        for p,k in factor(i):
            if k > factors[p-1]:
                accum *= p ** (k - factors[p-1])
                factors[p-1] = k
    return accum
Example #5
0
def solve():
    sieve(10**6)
    mdrs = [None] * 10**6
    mdrs[0] = 0  # to emulate the omission of 1 from factorizations
    accum = 0
    for n in xrange(2, 10**6):
        val = max(droot(d) + mdrs[n // d - 1] for d in divisors(n) if d != 1)
        accum += val
        mdrs[n-1] = val
    return accum
Example #6
0
def solve():
    n = 28123
    sieve(n+1)
    summable = set()
    abundant = []
    for i in xrange(1, n+1):
        if aliquot(i) > i:
            abundant.append(i)
            summable.update(i+j for j in abundant if i+j <= n)
    return n*(n+1) // 2 - sum(summable)
Example #7
0
def solve():
    sieve(10000)
    cache = {}
    accum = 0
    for i in xrange(2, 10001):
        j = aliquot(i)
        if j < i and cache.get(j) == i:
            accum += i + j
        elif j > i:
            cache[i] = j
    return accum
Example #8
0
def solve():
    sieve(1000)
    qty = 2  # 2 and 5
    for p in xrange(3, 1000000, 2):
        pstr = str(p)
        if (
            all(c in "1379" for c in pstr)
            and isPrime(p, presieve=False)
            and all(isPrime(int(pstr[i:] + pstr[:i]), presieve=False) for i in range(1, len(pstr)))
        ):
            qty += 1
    return qty
Example #9
0
def solve():
    sieve(10**7)
    new = [(d,d) for d in range(1, 10)]
    accum = 0
    for _ in xrange(12):
        newer = []
        for n,s in new:
            for d in xrange(10):
                n2 = n*10 + d
                s2 = s + d
                q,r = divmod(n2, s2)
                if r == 0:
                    newer.append((n2, s2))
                    if isPrime(q, presieve=False):
                        for e in [1,3,7,9]:
                            m = n2 * 10 + e
                            if isPrime(m, presieve=False):
                                accum += m
        new = newer
    return accum
Example #10
0
import sys
from eulerlib import sieve

P = sieve(1000000)
S = set(P)


def rotate(s, I):
    d = 0
    for n in xrange(1 if 0 in I else 0, 10):
        C = [c for c in s]
        for i in I:
            C[i] = str(n)
        if int(''.join(C)) in S:
            d += 1
    return d


for p in P:
    s = str(p)
    for d in set(s):
        I = []
        for i in xrange(len(s)):
            v = -1
            if s[i] == d:
                I.append(i)
                v = rotate(s, I)
            if v == 8:
                print s
                found = True
                sys.exit(0)
Example #11
0
from eulerlib import sieve

N = 10000
M = 100000000
primes = sieve(N)
prime_set = set(sieve(M))


def concat(a, b):
    return int(str(a) + str(b))


def get_concat_sets(n):
    if n == 0:
        return []
    elif n == 1:
        return [[n] for n in primes]

    concat_sets = []
    prev_sets = get_concat_sets(n - 1)
    for s in prev_sets:
        for p1 in primes[primes.index(max(s)) + 1:]:
            found = True
            for p2 in s:
                if concat(p1, p2) not in prime_set or concat(
                        p2, p1) not in prime_set:
                    found = False
                    break
            if found:
                concat_sets.append(s + [p1])
Example #12
0
from eulerlib import sieve

N = 1000000
P = sieve(N)
S = set(P)

m = -1
p = -1
for i in xrange(len(P)):
	s = 0
	j = i
	while s < N and j < len(P):
		s += P[j]
		j += 1
		if s in S and j-i > m:
			m = j-i
			p = s

print p
Example #13
0
import sys; sys.path.insert(1, sys.path[0] + '/..')
from eulerlib import factor, modInverse, cross, sieve

def I(n):
    terms = []
    for (p,k) in factor(n):
        if p % 2 == 0 and k>1:
            residues = (1, -1, (1<<k-1)-1, (1<<k-1)+1)
        else:
            residues = (1, -1)
        pk = p**k
        coef = n // pk * modInverse(n // pk, pk)
        terms.append(map(lambda x: x*coef, residues))
    return max(filter(lambda x: x != n-1, (sum(res) % n for res in cross(*terms))))

sieve(2 * 10**7)
#print sum(I(i) for i in xrange(3, 20000001))
for i in xrange(3, 20000001):
    print '%d\t%d' % (i, I(i))
Example #14
0
from eulerlib import sieve

N = 10000
M = 100000000
primes = sieve(N)
prime_set = set(sieve(M))

def concat(a,b):
	return int(str(a)+str(b))

def get_concat_sets(n):
	if n == 0:
		return []
	elif n == 1:
		return [[n] for n in primes]

	concat_sets = []
	prev_sets = get_concat_sets(n-1)
	for s in prev_sets:
		for p1 in primes[primes.index(max(s))+1:]:
			found = True
			for p2 in s:
				if concat(p1,p2) not in prime_set or concat(p2,p1) not in prime_set:
					found = False
					break
			if found:
				concat_sets.append(s + [p1])

	return concat_sets

Example #15
0
def solve():
    sieve(1000000)
    return sum(totient(n) for n in xrange(2, 1000001))
Example #16
0
import sys
from eulerlib import sieve

P = sieve(1000000)
S = set(P)

def rotate(s,I):
	d = 0
	for n in xrange(1 if 0 in I else 0, 10):
		C = [c for c in s]
		for i in I: 
			C[i] = str(n)
		if int(''.join(C)) in S:
			d += 1
	return d

for p in P:
	s = str(p)
	for d in set(s): 
		I = []
		for i in xrange(len(s)):
			v = -1
			if s[i] == d:
				I.append(i)
				v = rotate(s,I)
			if v == 8:
				print s
				found = True
				sys.exit(0)	

Example #17
0
from eulerlib import sieve

N = 100000
S = [2 * n * n for n in xrange(N)]
P = set(sieve(N))
C = [n for n in xrange(9, N, 2) if n not in P]

for n in C:
    satisfied = False
    for s in S:
        if n - s in P:
            satisfied = True
            break
    if not satisfied:
        print n
        break
Example #18
0
def solve():
    sieve(10 ** 6)  # just a guess
    return sum(islice(answers(), 25))
Example #19
0
from eulerlib import sieve, cmpf

N = 1000000
prime_factors = [[], [(1, 1)]] + [[] for n in xrange(N - 1)]
phi = [0, 1] + [-1 for n in xrange(N - 1)]
all_primes = sieve(N)
sub_primes = [p for p in all_primes if p <= N / 2]

#calculate prime factors
for p in sub_primes:
    n = p
    while n <= N:
        m = n
        s = 0
        while m % p == 0:
            s += 1
            m /= p

        prime_factors[n].append((p, s))
        n += p

#calculate Euler Phi function
for p in all_primes:
    n = p
    prev = phi[1]
    while n <= N:
        phi[n] = n - n / p
        prev = n
        n *= p

Example #20
0
from eulerlib import sieve 

P = set(sieve(10000))


def isperm(a,b):
	s1 = set(str(a))
	s2 = set(str(b))
	return s1 == s2 

for n0 in xrange(1000,10000):
	if n0 not in P: 
		continue

	for i in xrange(1,10000):
		n1 = n0 + i
		n2 = n1 + i
		if n1 > 9999 or n2 > 9999:
			break

		if n1 in P and n2 in P and isperm(n0,n1) and isperm(n0,n2):
			print n0,n1,n2,i
Example #21
0
def solve():
    n = 10001
    sieve(ceil(n*log(n) + n*log(log(n))))
    return nth(primeIter(), n-1)
Example #22
0
from eulerlib import sieve 

N = 100000
S = [2*n*n for n in xrange(N)]
P = set(sieve(N))
C = [n for n in xrange(9,N,2) if n not in P]

for n in C:
	satisfied = False
	for s in S:
		if n-s in P:
			satisfied = True
			break
	if not satisfied:
		print n
		break
Example #23
0
from eulerlib import sieve, cmpf

N = 1000000
prime_factors = [[],[(1,1)]] + [[] for n in xrange(N-1)]
phi = [0,1] + [-1 for n in xrange(N-1)]
all_primes = sieve(N)
sub_primes = [p for p in all_primes if p <= N/2]

#calculate prime factors
for p in sub_primes:
	n = p
	while n <= N:
		m = n
		s = 0
		while m % p == 0:
			s += 1
			m /= p

		
		prime_factors[n].append((p,s))
		n += p

#calculate Euler Phi function
for p in all_primes:
	n = p
	prev = phi[1]
	while n <= N:
		phi[n] = n - n/p
		prev = n
		n *= p
Example #24
0
from eulerlib import sieve
P = set(sieve(1000000))


def iscircular(n):
    s = str(n)
    for i in xrange(len(s)):
        if int(s[i:] + s[:i]) not in P:
            return False
    return True


N = [n for n in xrange(1000000) if iscircular(n)]
print len(N)
Example #25
0
def solve():
    sieve(10**8)  # A 9-pandigital cannot be prime.
    return primeSets(set("123456789"))