コード例 #1
0
ファイル: p70.py プロジェクト: bwo/euler
from math import log10
from eulertools import sieve

limit = 10 ** 7
primes = set(sieve(limit))

def totients():
    tots = [1] * (limit+1)
    for p in primes:
        tots[p] = p - 1
        for i in range(2,1+limit/p):
            j = p * i
            while i % p == 0:
                tots[j] *= p
                i /= p
            tots[j] *= (p-1)
    return tots
    
def isperm(n, m):
#    if not -1 < int(log10(n)) - int(log10(m)) < 1: return False
    s = str(n)
    t = list(str(m))
    if len(s) != len(t): return False
    ## surprisingly, this is faster than sorted(str(n)) == sorted(str(m))
    ## there's an O(n) method too, which is also slower than this.
    try:
        for c in s:
            t.remove(c)
    except ValueError:
        return False
    return not t
コード例 #2
0
ファイル: p41.py プロジェクト: bwo/euler
from eulertools import sieve, isprime, permute
primes = list(sieve(31622))
tonum = lambda ds: reduce(lambda a,b :10*a+b, ds, 0)

def main():
    for i in range(9, 2, -1):
        digits = range(i,0,-1)
        pandigitals = permute(tuple(digits))
        for p in pandigitals:
            if p[-1] % 2 == 0: continue
            t = tonum(p)
            if isprime(t, primes):
                print t
                return
if __name__ == '__main__': main()
コード例 #3
0
ファイル: p12.py プロジェクト: bwo/euler
from eulertools import sieve
from itertools import count
from operator import mul
from collections import defaultdict
primes = list(sieve(1000000))

def divisors(n):
    def _numdivisors(n, acc):
        if n == 1: return acc
        for p in primes:
            if n % p == 0:
                while n % p == 0:
                    acc[p] += 1
                    n /= p
                return _numdivisors(n,acc)
    c = divisors.cache.get(n, None)
    if c: return c
    d= _numdivisors(n,defaultdict(lambda: 1))
    if not d: d = 1
    else: d = reduce(mul, d.values())
    divisors.cache[n] = d
    return d
divisors.cache = {}

def tridivisors(i):
    if i % 2 == 0:
        di = divisors(i/2) 
        diplus = divisors(i+1)
    else:
        di = divisors(i)
        diplus = divisors((i+1)/2)
コード例 #4
0
ファイル: p58.py プロジェクト: bwo/euler
from itertools import count
import sys, math
from eulertools import sieve
from sets import Set
SIZE=99001 # a guess
def evens():
    i = 2
    while 1:
        yield i
        i += 2
primes = list(sieve(SIZE))
def checkprime(n):
    sn = int(math.sqrt(n))
    if sn > SIZE:
        print "too small!"
        sys.exit(0)
    for p in primes:
        if n == p: return 1
        if n % p == 0:
            return 0
    return 1
tot = 1
pcount = 0
i = 1
evens = evens().next
while 1:
    e = evens()
    tot += 4
    i += e
    pcount+=checkprime(i)
    i += e
コード例 #5
0
ファイル: p21.py プロジェクト: bwo/euler
from sets import Set
from eulertools import sieve, cachesumdiv
divisors = list(sieve(10000))
primes = Set(sieve(10000))

sumdivisors = lambda n: cachesumdiv(n, divisors)-n
amicable = []
skips = Set()
for n in range(1,10000):
    if n in skips or n in primes: continue
    sn = sumdivisors(n)
    if sn <= 10000 and sn != n and sumdivisors(sn) == n:
        amicable.append(n+sn)
        skips.add(sn)
print sum(amicable)
コード例 #6
0
ファイル: p35.py プロジェクト: bwo/euler
from eulertools import sieve, isprime
from sets import Set
primes = Set(sieve(1000000))

def rotate(n):
    toint = lambda ds: reduce(lambda a,b: 10*a+b, ds, 0)
    digits = [int(c) for c in str(n)]
    rotations = len(digits) - 1
    for i in range(rotations):
        digits = digits[1:] + [digits[0]]
        yield toint(digits)
seen = Set()
for p in primes:
    if p in seen: continue
    rotations = list(rotate(p))
    for r in rotations:
        if r not in primes:
            break
    else:
        seen.add(p)
        seen.update(rotations)
print len(seen)
コード例 #7
0
ファイル: p23.py プロジェクト: bwo/euler
from eulertools import sieve, cachesumdiv, fast_conjoin as conjoin
from sets import Set
from itertools import count
primes = list(sieve(29000))
sumdivs = lambda n: cachesumdiv(n, primes)

def abundants():
    for i in count(1):
        if i > 28123: break
        sd = sumdivs(i) - i
        if sd > i:
            yield i

abundants = list(abundants())
possibilities = [False]*28124
for i in abundants:
    for j in abundants:
        if i + j > 28123: break
        possibilities[i+j] = True
sum = 0
for i in range(len(possibilities)):
    if not possibilities[i]: sum += i
print sum
コード例 #8
0
ファイル: p49.py プロジェクト: bwo/euler
from eulertools import sieve
from sets import ImmutableSet as Set
from collections import defaultdict
d = defaultdict(lambda: [])
digits = lambda n: [int(c) for c in str(n)]
primes = [x for x in sieve(10000) if x > 1000]
digitset = [Set(digits(p)) for p in primes]
for (p,dig) in zip(primes,digitset):
##    if len(dig) == 4:
    d[dig].append(p)
exclude = (1487, 4817, 8147)
for (p,dig) in zip(primes, digitset):
    if len(d[dig]) >= 3:
        ps = sorted(d[dig])
        while ps:
            p, ps = ps[0], ps[1:]
            for p2 in ps:
                if 2*p2-p in ps:
                    print "%s%s%s" % (p, p2, 2*p2-p)