示例#1
0
文件: p027.py 项目: nonette/euler
def p027(N=10**3):
    lim = 10 * N
    table = set(numty.sieve(lim))
    primes = numty.sieve(2 * N + 1)

    best = 0
    best_ab = (0, 0)

    for b in primes:
        if b > N:
            break
        for c in primes:
            a = c - b - 1
            if a > N:
                break
            count = 2
            while True:
                cand = count**2 + a * count + b
                if cand < 0:
                    break
                if cand < lim and cand not in table:
                    break
                if cand >= lim and not numty.isprime(cand):
                    break
                count += 1
            if count > best:
                best_ab = (a, b)
                best = count
    return best_ab[0] * best_ab[1]
示例#2
0
文件: p027.py 项目: nonette/euler
def p027(N = 10**3):
    lim = 10*N
    table = set(numty.sieve(lim))
    primes = numty.sieve(2*N+1)

    best = 0
    best_ab = (0,0)

    for b in primes:
        if b > N:
            break
        for c in primes:
            a = c - b - 1
            if a > N:
                break
            count = 2
            while True:
                cand = count**2+a*count+b
                if cand < 0:
                    break
                if cand < lim and cand not in table:
                    break
                if cand >= lim and not numty.isprime(cand):
                    break
                count += 1
            if count > best:
                best_ab = (a,b)
                best = count
    return best_ab[0]*best_ab[1]
示例#3
0
文件: p050.py 项目: nonette/euler
def p050(N=10 ** 6, lim=4000):
    primes = numty.sieve(lim)
    primeset = set(primes)
    bestprime = 0
    bestlen = 0
    bestbase = 0
    i = 0
    while True:
        if i + bestlen > len(primes):
            logger.error("Limit was too low!")
            return
        cand = sum(primes[i : i + bestlen])
        if cand >= N:
            break
        j = i + bestlen
        while cand < N:
            if j >= len(primes):
                logger.error("Limit was too low!")
                return
            cand += primes[j]
            j += 1
        while j > i + bestlen:
            if numty.isprime(cand):
                bestprime = cand
                bestlen = j - i
                bestbase = primes[i]
                break
            cand -= primes[j - 1]
            j -= 1
        i += 1
    logger.debug((bestlen, primes[bestbase : bestbase + bestlen]))
    return bestprime
示例#4
0
文件: p050.py 项目: nonette/euler
def p050(N=10**6, lim=4000):
    primes = numty.sieve(lim)
    primeset = set(primes)
    bestprime = 0
    bestlen = 0
    bestbase = 0
    i = 0
    while True:
        if i + bestlen > len(primes):
            logger.error('Limit was too low!')
            return
        cand = sum(primes[i:i + bestlen])
        if cand >= N:
            break
        j = i + bestlen
        while cand < N:
            if j >= len(primes):
                logger.error('Limit was too low!')
                return
            cand += primes[j]
            j += 1
        while j > i + bestlen:
            if numty.isprime(cand):
                bestprime = cand
                bestlen = j - i
                bestbase = primes[i]
                break
            cand -= primes[j - 1]
            j -= 1
        i += 1
    logger.debug((bestlen, primes[bestbase:bestbase + bestlen]))
    return bestprime
示例#5
0
文件: p087.py 项目: nonette/euler
def p087(N=5*10**7):
    primes = numty.sieve(int(math.sqrt(N)))
    squares = [p**2 for p in primes if p**2 < N]
    cubes = [p**3 for p in primes if p**3 < N]
    fourthpows = [p**4 for p in primes if p**4 < N]
    goodnums = set(a+b+c for a in squares for b in cubes for c in fourthpows if
            a+b+c < N)
    return len(goodnums)
示例#6
0
def p087(N=5 * 10**7):
    primes = numty.sieve(int(math.sqrt(N)))
    squares = [p**2 for p in primes if p**2 < N]
    cubes = [p**3 for p in primes if p**3 < N]
    fourthpows = [p**4 for p in primes if p**4 < N]
    goodnums = set(a + b + c for a in squares for b in cubes
                   for c in fourthpows if a + b + c < N)
    return len(goodnums)
示例#7
0
文件: p005.py 项目: nonette/euler
def p005(N=20):
    primes = numty.sieve(N)
    ret_val = 1
    for p in primes:
        tmp = p
        while tmp <= N:
            tmp *= p
            ret_val *= p
    return ret_val
示例#8
0
def p005(N=20):
    primes = numty.sieve(N)
    ret_val = 1
    for p in primes:
        tmp = p
        while tmp <= N:
            tmp *= p
            ret_val *= p
    return ret_val
示例#9
0
文件: p035.py 项目: nonette/euler
def p035(N=10 ** 6):
    primes = numty.sieve(N)
    primeset = set(primes)
    count = 0
    for p in primes:
        str_p = str(p)
        if all(int(str_p[n:] + str_p[:n]) in primeset for n in range(len(str_p))):
            logger.debug(p)
            count += 1
    return count
示例#10
0
文件: p046.py 项目: nonette/euler
def p046():
    lim = 10**4
    primes = numty.sieve(lim)
    table = [1, 0] * (lim / 2)
    table[1] = 1
    for n in range(int(math.sqrt(lim / 2))):
        i = 2 * n**2
        for p in primes:
            if p + i > lim:
                break
            table[p + i] = 1
    return table.index(0)
示例#11
0
文件: p046.py 项目: nonette/euler
def p046():
    lim = 10**4
    primes = numty.sieve(lim)
    table = [1,0]*(lim/2)
    table[1] = 1
    for n in range(int(math.sqrt(lim/2))):
        i = 2*n**2
        for p in primes:
            if p+i > lim:
                break
            table[p+i] = 1
    return table.index(0)
示例#12
0
文件: p035.py 项目: nonette/euler
def p035(N=10**6):
    primes = numty.sieve(N)
    primeset = set(primes)
    count = 0
    for p in primes:
        str_p = str(p)
        if all(
                int(str_p[n:] + str_p[:n]) in primeset
                for n in range(len(str_p))):
            logger.debug(p)
            count += 1
    return count
示例#13
0
文件: p051.py 项目: nonette/euler
def p051(N=6,target=8):
    primes = numty.sieve(10**N)
    primes = [str(p) for p in primes if len(str(p)) == N]
    primeset = set(primes)
    masks = [bin(x)[2:].zfill(N)  for x in range(1,2**N-1)]
    for prime in primes:
        for mask in masks:
            if len(set(''.join(b for a,b in zip(mask,prime) if a=='0'))) == 1:
                family = [''.join((b if a == '1' else str(i)) for a,b in zip(mask, prime)) for i in range(10)]
                family = [p for p in family if p in primeset]
                if len(family) == target:
                    logger.debug(family)
                    return prime
示例#14
0
def decomps(N):
    decomps = [[] for n in range(N)]
    primes = set(numty.sieve(N))
    for n in range(2,N):
        decomps[n].append([n])
        if n in primes:
            continue
        for k in range(2,n):
            if k > n/2:
                break
            if n % k == 0:
                decomps[n] += [[k]+v for v in decomps[n/k] if 
                        all(k<=f for f in v)]
    return decomps
示例#15
0
文件: p060.py 项目: nonette/euler
def gengraph(N):
    primes = numty.sieve(N)
    graph = defaultdict(list)
    for i in xrange(len(primes)):
        p = primes[i]
        for j in xrange(i):
            q = primes[j]
            if (p+q)%3 == 0:
                continue
            pq = int(str(p)+str(q))
            qp = int(str(q)+str(p))
            if numty.isprime(pq) and utils.isprime(qp):
                    graph[p].append(q)
                    graph[q].append(p)
    return graph
示例#16
0
文件: p070.py 项目: nonette/euler
def p070():
    primes = numty.sieve(10 ** 4)
    best = (1000, 0)
    for i, p in enumerate(primes):
        if p < 1000:
            continue
        for q in primes[i - 1 :: -1]:
            n = p * q
            if n > 10 ** 7:
                continue
            phi = (p - 1) * (q - 1)
            if sorted(str(phi)) == sorted(str(n)):
                cand = (1.0 * n / phi, n)
                if cand < best:
                    best = cand
    return best[1]
示例#17
0
def p070():
    primes = numty.sieve(10**4)
    best = (1000,0)
    for i,p in enumerate(primes):
        if p < 1000:
            continue
        for q in primes[i-1::-1]:
            n = p*q
            if n > 10**7:
                continue
            phi = (p-1)*(q-1)
            if sorted(str(phi)) == sorted(str(n)):
                cand = (1.0*n/phi, n)
                if cand < best:
                    best = cand
    return best[1]
示例#18
0
def p051(N=6, target=8):
    primes = numty.sieve(10**N)
    primes = [str(p) for p in primes if len(str(p)) == N]
    primeset = set(primes)
    masks = [bin(x)[2:].zfill(N) for x in range(1, 2**N - 1)]
    for prime in primes:
        for mask in masks:
            if len(set(''.join(b for a, b in zip(mask, prime)
                               if a == '0'))) == 1:
                family = [
                    ''.join((b if a == '1' else str(i))
                            for a, b in zip(mask, prime)) for i in range(10)
                ]
                family = [p for p in family if p in primeset]
                if len(family) == target:
                    logger.debug(family)
                    return prime
示例#19
0
文件: p049.py 项目: nonette/euler
def p049():
    found = 1487

    primes = numty.sieve(10 ** 4)
    table = defaultdict(list)
    for p in primes:
        str_p = str(p)
        if len(str_p) < 4:
            continue
        table["".join(sorted(str_p))].append(p)
    for key in table:
        if len(table[key]) >= 3:
            cands = sorted(table[key])
            for b in cands:
                for a in cands:
                    if a >= b:
                        break
                    if 2 * b - a in cands:
                        if a == found:
                            continue
                        return str(a) + str(b) + str(2 * b - a)
示例#20
0
def p049():
    found = 1487

    primes = numty.sieve(10**4)
    table = defaultdict(list)
    for p in primes:
        str_p = str(p)
        if len(str_p) < 4:
            continue
        table[''.join(sorted(str_p))].append(p)
    for key in table:
        if len(table[key]) >= 3:
            cands = sorted(table[key])
            for b in cands:
                for a in cands:
                    if a >= b:
                        break
                    if 2*b-a in cands:
                        if a == found:
                            continue
                        return str(a)+str(b)+str(2*b-a)
示例#21
0
文件: p010.py 项目: nonette/euler
def p010(N=2*10**6):
    return sum(numty.sieve(2*10**6))
示例#22
0
文件: p010.py 项目: nonette/euler
def p010(N=2 * 10**6):
    return sum(numty.sieve(2 * 10**6))
示例#23
0
## What is the first number that can be written as the sum of primes in over
#  5000 different ways?

import lib.numty as numty

table = numty.sieve(5000)
cache = {}
def primep(n, i):
    if n == 0:
        return 1
    if i < 0:
        return 0
    p = table[i]
    if (n,p) not in cache:
        cache[(n,p)] = sum(primep(n-p*k, i-1) for k in range(n/p+1))
    return cache[(n,p)]

def primepartitions(n):
    if n > table[-1]:
        raise ValueError("n=%d unexpectedly larger than largest summand %d" % (n, table[-1]))
    return primep(n,n)

def p077():
    for n in range(5000):
        if primepartitions(n) > 5000:
            return n