예제 #1
0
from primes import mr
import time
from itertools import permutations
import string

START = time.time()

#sum from 1 to 8 = 36, sum from 1 to 9 is 45, so if we went from 1 to 8 or 1 to 9, it would be divisible by 3.
permutation = permutations(['1', '2', '3', '4', '5', '6', '7'], 7)
maxz = 0
for perm in permutation:
    n = int(string.join(perm, ''))
    if n > maxz and mr(n):
        maxz = n
print maxz
print "Time Taken:", time.time() - START
예제 #2
0
import time
from primes import mr
start = time.time()

lst = [i**3 for i in xrange(1,578)]

candidates = set()
for i in xrange(1,len(lst)):
    for j in xrange(i-1,-1,-2):
        candidates.add(lst[i]-lst[j])
        if lst[i] -lst[j] > 10**6:
            break
print len(candidates)
count = 0
for val in candidates:
    if mr(val):
        count+= 1
print count
print "Time Taken: ", time.time() - start

"""
~/Desktop/python_projects/proj_euler $python prob131.py
4527
173
Time Taken:    0.131557941437

We only need to go up to 577

n^2(n+p)

n is cube (since n+p can't turn n^2 into a cube)
예제 #3
0
import time
START = time.time()
from primes import mr

mult = 1111111111
successes = set()
sumz = 0
for big_dig in xrange(9,0,-1):
    n = big_dig * mult
    for dig in xrange(0,10):
        for diff in xrange(big_dig-9,big_dig+1):
            m = n - diff*10**dig
            if mr(m) and m > 10**9:
                successes.add(big_dig)
                sumz += m
print "Digits we've seen:", successes
print "Time taken:", time.time() - START

for big_dig in xrange(9,0,-1):
    if big_dig in successes:
        continue
    n = big_dig * mult
    for dig,dig2 in ((a,b) for a in xrange(10) for b in xrange(a)):
        for diff,diff2 in ((d1,d2) for d1 in xrange(big_dig-9,big_dig+1) for d2 in xrange(big_dig-9,big_dig+1)):
            m = n - diff*10**dig - diff2*10**dig2
            if mr(m) and m > 10**9:
                successes.add(big_dig)
                sumz += m

print "Digits we've seen:", successes
print "Time taken:", time.time() - START
예제 #4
0
import time
START = time.time()
from primes import mr

sumz = 0
count = 0
SIZE = 150 * 10**6
not_p = [11, 17, 19, 21, 23]

for i in xrange(3, 28):
    a = i**2
    if all([mr(k) for k in [a + 1, a + 3, a + 7, a + 9, a + 13, a + 27]]):
        count += 1
        sumz += i
        print i

for i in xrange(30, SIZE, 10):
    if i % 3 == 0 or i % 7 == 0 or i % 13 == 0:
        continue
    a = i**2
    if all([mr(k) for k in [a + 1, a + 3, a + 7, a + 9, a + 13, a + 27]]):
        if not any([mr(a + j) for j in not_p]):
            count += 1
            sumz += i
            print i

print sumz, count
print "Time Taken:", time.time() - START
"""
676333270 12
Time Taken: 226.555887938
예제 #5
0
from primes import mr
import time
START = time.time()
#the four diagonals are 4n^2-2n+1, 4n^2+1,4n^2+2n+1,
# and (2n+1)^2

count = 0
for i in range(1, 100000):
    a = 4 * i * i + 1
    j = 2 * i
    count += mr(a + j) + mr(a) + mr(a - j)
    if count * 1.0 / (4 * i + 1) < .1:
        break

print j + 1, count / (j * 2.0 + 1)
print "Time taken:", time.time() - START
"""

LOL. I revisited this problem on 1/20/2013. I ran it with the original prime checking algorithm, then I ran it with the miller rabin primality test.

Original time: 
Time taken: 31.7114129066
New time:
Time taken: 0.593687772751
looks like I cleaned up my code a bit more since then haha... 3/25/14
Time taken: 0.185644865036
"""
예제 #6
0
a_lst = range(-1, -1000, -2)
b_lst = primes[12:168]

a_lst2 = []
b_lst2 = []

maxz = 0
for a in a_lst:
    for b in b_lst:
        n = 1
        while True:
            if n**2 + n * a + b < 0:  # We're no longer dealing with positive composite numbers
                break
            elif not mr(
                    n
            ):  # Honestly, I don't remember why I had this condition...
                n += 1
            elif mr(n**2 + n * a + b):  #If the result is a prime, keep going
                n += 1
            else:
                break
        if 40 < n:
            maxz = n - 1
            #print maxz, a, b
            a_lst2 += [a]
            b_lst2 += [b]

#print 'ON TO PHASE 2. YAY!'
maxz = 0
max_values = (0, 0)
예제 #7
0
import time, string
START = time.time()
from itertools import permutations
from primes import mr

digits = [str(i) for i in range(1, 10)]

prime_sets = [set() for i in range(10)]
SIZE_LIM = 9

for num_dig in range(1, SIZE_LIM):
    for perm in permutations(digits, num_dig):
        next_num = int(string.join(perm, ''))
        if mr(next_num):
            prime_sets[num_dig].add(next_num)
    print num_dig, len(prime_sets[num_dig])

prime_lst = sorted(prime_sets)
print "Time Taken:", time.time() - START


def get_next(seen, max_size, last_seen):
    if max_size == 0 and len(seen) == 9:
        return 1
    elif max_size == 0:
        return 0
    sumz = 0
    for prime in prime_sets[max_size]:
        if prime > last_seen:  #Since we're not requiring that the num_digs goes down, we still need some ordering to avoid double counting.
            continue
        new_set = set(seen)
예제 #8
0
import time, string
START = time.time()
from itertools import permutations
from primes import mr


digits = [str(i) for i in range(1,10)] 

prime_sets = [set() for i in range(10)]
SIZE_LIM = 9

for num_dig in range(1,SIZE_LIM):
    for perm in permutations(digits,num_dig):
        next_num = int(string.join(perm,''))
        if mr(next_num):
            prime_sets[num_dig].add(next_num)
    print num_dig, len(prime_sets[num_dig])

prime_lst = sorted(prime_sets)
print "Time Taken:", time.time() - START

def get_next(seen,max_size, last_seen):
    if max_size == 0 and len(seen) == 9:
        return 1
    elif max_size == 0:
        return 0
    sumz = 0
    for prime in prime_sets[max_size]:
        if prime > last_seen:  #Since we're not requiring that the num_digs goes down, we still need some ordering to avoid double counting.
            continue
        new_set = set(seen) 
예제 #9
0
import time
from primes import mr
start = time.time()

lst = [i**3 for i in xrange(1, 578)]

candidates = set()
for i in xrange(1, len(lst)):
    for j in xrange(i - 1, -1, -2):
        candidates.add(lst[i] - lst[j])
        if lst[i] - lst[j] > 10**6:
            break
print len(candidates)
count = 0
for val in candidates:
    if mr(val):
        count += 1
print count
print "Time Taken: ", time.time() - start
"""
~/Desktop/python_projects/proj_euler $python prob131.py
4527
173
Time Taken:    0.131557941437

We only need to go up to 577

n^2(n+p)

n is cube (since n+p can't turn n^2 into a cube)
p+n is cube
예제 #10
0
from primes import mr
import time
START = time.time()
#the four diagonals are 4n^2-2n+1, 4n^2+1,4n^2+2n+1,
# and (2n+1)^2

count = 0
for i in range(1,100000):
    a = 4 * i*i +1
    j = 2* i
    count += mr(a+j) + mr(a) + mr(a-j)
    if count * 1.0 / (4*i+1) < .1:
        break
        
print j+1, count / (j*2.0+1)
print "Time taken:", time.time() - START


"""

LOL. I revisited this problem on 1/20/2013. I ran it with the original prime checking algorithm, then I ran it with the miller rabin primality test.

Original time: 
Time taken: 31.7114129066
New time:
Time taken: 0.593687772751
looks like I cleaned up my code a bit more since then haha... 3/25/14
Time taken: 0.185644865036
"""
예제 #11
0
a_lst = range(-1,-1000,-2)
b_lst = primes[12:168] 


a_lst2 = []
b_lst2 = []

maxz = 0
for a in a_lst:
    for b in b_lst:
        n = 1
        while True:
            if n**2 + n*a + b < 0: # We're no longer dealing with positive composite numbers
                break
            elif not mr(n): # Honestly, I don't remember why I had this condition...
                n+=1
            elif mr(n**2 + n*a + b): #If the result is a prime, keep going
                n+=1
            else: break
        if 40 < n: 
            maxz = n-1
            #print maxz, a, b
            a_lst2 += [a]
            b_lst2 += [b]

#print 'ON TO PHASE 2. YAY!'
maxz = 0
max_values = (0,0)
for i in range(0,len(a_lst2)):
    n = 1
예제 #12
0
import sys

size = 10**6
if len(sys.argv) > 1:
    size = int(sys.argv[1])


lst = bitarray('0' * (size+1))

count = 0

for i in xrange(2,size+1):
    if i%10240 == 0:
        print i
    if lst[i] == 0:
        if not mr(2*i*i - 1):
            if i < size//500:
                a = set(factor(2*i**2-1)[:-1])
                for j in a:
                    for k in xrange((-i)%j+j,size+1,j):
                        lst[k] = 1
                    for k in xrange(i,size+1,j):
                        lst[k] = 1
            count +=1
    else:
        count +=1

print size -1 - count
print "Time Taken:", time.time() - start

예제 #13
0
from primes import mr
import time
from itertools import permutations
import string


START = time.time()

#sum from 1 to 8 = 36, sum from 1 to 9 is 45, so if we went from 1 to 8 or 1 to 9, it would be divisible by 3.
permutation = permutations(['1','2','3','4','5','6','7'],7)
maxz = 0
for perm in permutation:
    n = int(string.join(perm, ''))
    if n > maxz and mr(n):
        maxz = n
print maxz
print "Time Taken:", time.time() -START