-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patheuler23.py
More file actions
101 lines (72 loc) · 2.02 KB
/
euler23.py
File metadata and controls
101 lines (72 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from math import sqrt
import numpy
import cPickle
def gentriangle(x):
return (x*(x+1))/2
def numpy_sieve(limit):
is_prime = numpy.ones(limit + 1, dtype=numpy.bool)
for n in xrange(2, int(limit**0.5 + 1.5)):
#print n
if is_prime[n]:
is_prime[n*n::n] = 0
return numpy.nonzero(is_prime)[0][2:]
numpy_primes = numpy_sieve(1000)
def test_factor(n,p,factor_list):
count = 0
while True:
if n%p == 0:
count +=1
n = n / p
else:
if count != 0:
factor_list.append((p,count))
break
return n
def prime_factors(n):
factor_list = []
primes = numpy_primes
#other_primes = [1,7,11,13,17,19,23,29]
for p in [p for p in primes if p < (n**0.5+1)]:
n = test_factor(n, p, factor_list)
#print n
#print p
if n == 1:
return factor_list
factor_list.append((n,1))
return factor_list
def factors(n):
factors = prime_factors(n)
#print factors
all = [1]
for p,e in factors:
prev = all[:]
pn = 1
for i in range(e):
pn *= p
all.extend([a*pn for a in prev])
all.sort()
return all
#print is_divisor
#print numpy.nonzero(is_divisor)
return numpy.nonzero(is_divisor)[0][0:]
def isAbundantNumber(x):
y = sum(factors(x)[:-1])
return y > x
#abundantNumbers = numpy.array([x for x in xrange(12,28123) if isAbundantNumber(x)])
#output = open('euler23data.pkl', 'wb')
#cPickle.dump(abundantNumbers,output)
input = open('euler23data.pkl', 'rb')
abundantNumbers = cPickle.load(input)
abundantNumbersSet = frozenset(abundantNumbers)
def testForPair(x):
for y in abundantNumbers:
if y > x:
return False
elif (x-y) in abundantNumbersSet:
return True
return False
results = []
for x in xrange(1,28123):
if not testForPair(x):
results.append(x)
print sum(results)