Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from bisect import bisect_left
- print('Generating 99,999 prime numbers... (Takes about 10 seconds)\n')
- #-----------------------------------------------------------------------
- def prime_list(n):
- sieve = [True] * n
- for i in xrange(3, int(n ** 0.5) + 1, 2):
- if sieve[i]:
- sieve[i * i::2 * i]=[False]*((n - i * i - 1) / (2 * i) + 1)
- return [2] + [i for i in xrange(3, n, 2) if sieve[i]]
- biggest_prime = 1299721 # The 100,001st prime
- second_to_biggest_prime = 1299709
- list_of_primes = prime_list(biggest_prime)
- def take_closest(the_list, num):
- pos = bisect_left(the_list, num)
- if pos == 0:
- return the_list[0]
- if pos == len(the_list):
- return the_list[-1]
- before = the_list[pos - 1]
- after = the_list[pos]
- if after - num < num - before:
- return after
- else:
- return before
- def prime_info(num):
- if num == 1:
- return 0, 2, 'None', 2 # 2 is the first prime, No previous prime, next prime is 2
- if num == 2:
- return 1, 3, 'None', 3
- number_of_prime = 0
- nth_prime_number = 0
- previous_prime = 0
- next_prime = 0
- if num > 99999:
- nth_prime_number = 'Unavailable'
- else:
- nth_prime_number = list_of_primes[num - 1]
- if num < second_to_biggest_prime: # The last prime before the biggest_prime
- if num in list_of_primes:
- number_of_prime = list_of_primes.index(num) + 1
- previous_prime = list_of_primes[number_of_prime - 2]
- next_prime = list_of_primes[number_of_prime]
- else:
- prime = take_closest(list_of_primes, num)
- if num > prime:
- previous_prime = prime
- index = list_of_primes.index(previous_prime) + 1
- next_prime = list_of_primes[index]
- else:
- next_prime = prime # Because the prime is greater than num
- index = list_of_primes.index(next_prime) - 1
- previous_prime = list_of_primes[index]
- else:
- previous_prime = 'Unavailable'
- next_prime = 'Unavailable'
- return number_of_prime, nth_prime_number, previous_prime, next_prime
- #-----------------------------------------------------------------------
- for i in range(1, 1000):
- prime_num, nth_prime, previous_prime, next_prime = prime_info(i)
- print('\n\nNumber: ' + str(i))
- print('Prime #' + str(i) + ' is ' + str(nth_prime))
- the_nth_prime = nth_prime
- two_sum = i + nth_prime
- print('The sum of these two numbers is ' + str(two_sum))
- prime_num, nth_prime, previous_prime, next_prime = prime_info(two_sum)
- if str(nth_prime) == 'Unavailable': exit()
- print('Prime #' + str(two_sum) + ' is ' + str(nth_prime))
- answer = nth_prime
- if len(str(answer)) > len(str(two_sum)):
- shortened = str(answer)[:len(str(two_sum))]
- if shortened == str(the_nth_prime):
- raw_input(' Yes! ' + str(i) + ' self resolves!')
- # The results for this program are 261, 262, and 263
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement