Exemple #1
0
def prob27():
	sieve = prime.prime_table(10**4)
	D = {}
	for a in range(-999, 999, 2):
		for b in range(a + 2, 1000):
			if  (a*a - 4*b >= 0):
				continue
			num_primes = 0
			for n in range(0, b):
				temp = n*n + a*n + b
				if (temp < 2):
					break
				elif (temp == 2):
					num_primes += 1
				else:
					if (temp%2 == 1 and sieve[int((temp-1)/2)]):
						num_primes += 1
					else:
						D[(a,b)] = num_primes
						break
	max_primes = 0
	max_term = (0, 0)
	for i,j in D:
		if (D[(i,j)] > max_primes):
			max_primes = D[(i, j)]
			max_term = (i, j)

	return [max_term]
Exemple #2
0
def prob37():
	sieve = prime_table(10**6)
	# the set of truncatable primes
	h = set()
	n = 11
	while len(h) < 11:
		truncatable = True
		l = str(n)
		for i in range (1, len(l) + 1):
			left_num = int(l[:i])
			right_num = int(l[len(l) - i:])
			left_index = (left_num - 1) // 2
			right_index = (right_num - 1) // 2
			# check for prime
			if not (left_num > 1 and right_num > 1 and sieve[left_index] and sieve[right_index]):
				truncatable = False
				break

		# if n is truncatable, add it to h
		if truncatable:
			h.add(n)

		# increase n by 2
		n += 2
		if (l[len(l) - 1] == 3):
			n += 2

	return (sum(i for i in h), h)
Exemple #3
0
def prob21(limit):
	cache = []
	miss = [0, 1, 2]
	sieve = prime.prime_table(limit+1)

	# 1. Prime numbers are not amicable numbers
	for i in range(1, len(sieve)):
		if (sieve[i] == True):
			miss.append(2*i+1)

	for i in range(3, limit+1):
		# 2. Find i in cache and miss
		if not (i in cache or i in miss):
			# 3. Compute sum of divisors for i
			p = sum_of_divisors(i)

			if (i != p and i == sum_of_divisors(p)):
				cache.append(i)
				if (p not in cache):
					cache.append(p)
				print("result: ", i, p)
			else:
				if (p != i):
					miss.append(i)
					miss.append(p)
				else:
					miss.append(i)

	return sum(i for i in cache)
Exemple #4
0
def prob23():
    limit = 20162
    s = 0
    abn = set()
    prime_sieve = prime.prime_table(limit)
    for n in range(1, limit):
        if is_abundant(n, prime_sieve):
            abn.add(n)
        if not any((n-a in abn) for a in abn):
            s += n
    return s
Exemple #5
0
def prob12():
	n = 3					# triangle number = n*(n+1)/2
	D[n] = 2				# number of divisors
	sieve = prime.prime_table(1000)	# the prime table
	MIN_DIVISORS = 500
	count = 0

	while count <= MIN_DIVISORS:
		n += 1
		n1 = n
		if (n1%2 ==0):
			n1 /= 2
		D[n1] = 1
		for i in range(0, len(sieve)):
			if sieve[i] == False:
				continue
			if i == 0:
				prime = 2
			else:
				prime = 2 * i + 1
			if (prime*prime) > n1:
				Dn1 *= 2
				break

			exponent = 1
			while n1 % (prime) == 0:
				n1 /= prime
				exponent += 1
			# if a number can be factorized as A = p1^k1 * p2^k2 * p3^k3 ... where
			# p1, p2, p3.. is prime then it has (k1 + 1)*(k2 + 1)*(k3 + 1) ... divisors
			if exponent > 1:
				Dn1 *= exponent
			if n1 == 1:
				break

			count = D[n]*D[n1]
			D[n] = D[n1]

	return int(n*(n-1)/2)
Exemple #6
0
def prob35(limit):
	# there are 13 circular primes below 1,000,000
	num_cprimes = 13
	sieve = prime_table(limit)

	for n in range(111, limit - 1, 2):
		l = str(n)
		if not any(d in ("0","2","4","5","6","8") for d in l):
			num_digits = len(l)
			is_cprime = True
			for i in range(0, num_digits):
				# shift the string 1 digit to the left
				l = l[1:] + l[:1]
				# index in the prime table
				index = (int(l) - 1) // 2
				if (sieve[index] == False):
					is_cprime = False
					break;
			if is_cprime:
				# h.add(n)
				num_cprimes += 1

	return num_cprimes
Exemple #7
0
 def extend_primes(self, to, step):
     name = 'prime'
     display_name = '素数'
     _ptable = prime_table(to)
     ptable = [n for i, n in enumerate(_ptable) if (i+1)%step==0]
     self.append(Sequence(name, display_name, step, ptable, NamedNumber))