SHOW:
|
|
- or go back to the newest paste.
| 1 | import re | |
| 2 | ||
| 3 | #gen_primes is modified from http://stackoverflow.com/a/568618/203705 | |
| 4 | def gen_primes(start, end): | |
| 5 | ||
| 6 | # Maps composites to primes witnessing their compositeness. | |
| 7 | # This is memory efficient, as the sieve is not "run forward" | |
| 8 | # indefinitely, but only as long as required by the current | |
| 9 | # number being tested. | |
| 10 | # | |
| 11 | D = {}
| |
| 12 | ||
| 13 | # The running integer that's checked for primeness | |
| 14 | q = 2 | |
| 15 | primes = [] | |
| 16 | ||
| 17 | while q != end: | |
| 18 | if q not in D: | |
| 19 | # q is a new prime. | |
| 20 | # Yield it and mark its first multiple that isn't | |
| 21 | # already marked in previous iterations | |
| 22 | # | |
| 23 | if q >= start: | |
| 24 | primes.append(q) | |
| 25 | D[q * q] = [q] | |
| 26 | else: | |
| 27 | # q is composite. D[q] is the list of primes that | |
| 28 | # divide it. Since we've reached q, we no longer | |
| 29 | # need it in the map, but we'll mark the next | |
| 30 | # multiples of its witnesses to prepare for larger | |
| 31 | # numbers | |
| 32 | # | |
| 33 | for p in D[q]: | |
| 34 | D.setdefault(p + q, []).append(p) | |
| 35 | del D[q] | |
| 36 | ||
| 37 | q += 1 | |
| 38 | return primes | |
| 39 | ||
| 40 | def get_danish_nums(name): | |
| 41 | nums = {}
| |
| 42 | with open(name, 'r') as f: | |
| 43 | lines = f.readlines() | |
| 44 | ||
| 45 | for line in lines: | |
| 46 | vals = line.split(',')
| |
| 47 | if vals[2].strip() != 'Reserve / Reserve': | |
| 48 | if len(vals[0].strip()) == 8: | |
| 49 | start = int(re.sub(r'[a-z]','0',vals[0])) | |
| 50 | end = int(re.sub(r'[a-z]','9',vals[0])) | |
| 51 | if start == end: | |
| 52 | nums[start] = True | |
| 53 | else: | |
| 54 | for num in range(start, end+1): | |
| 55 | nums[num] = True | |
| 56 | return nums | |
| 57 | ||
| 58 | ||
| 59 | if __name__ == '__main__': | |
| 60 | print("Getting nums...")
| |
| 61 | #CSV built from spreadsheet found here: | |
| 62 | #http://www.erhvervsstyrelsen.dk/numbering_lists | |
| 63 | nums = get_danish_nums('danish_numberlist.csv')
| |
| 64 | start = min(nums) | |
| 65 | end = max(nums) | |
| 66 | ||
| 67 | print("Getting primes...")
| |
| 68 | primes = gen_primes(start,end) | |
| 69 | i = 0 | |
| 70 | print("Checking...")
| |
| 71 | for prime in primes: | |
| 72 | if nums.get(prime, False): | |
| 73 | print("%s is valid prime phone number!" % prime)
| |
| 74 | i+=1 | |
| 75 | print("%s of %s valid danish phone numbers are prime." % (i, len(nums))) |