コード例 #1
0
ファイル: Euler92.py プロジェクト: pfhayes/euler
def goesTo89 (num) :

	if num in d :
		return d[num]
	ret = goesTo89(sum(map(lambda x : x*x,digits(num))))
	d[num] = ret
	return ret
コード例 #2
0
ファイル: Euler35.py プロジェクト: pfhayes/euler
def isCircular(n):
    try:
        return circulars[n]
    except:
        if 0 in digits(n):
            return False
        s = str(n)
        num = int(s[1:] + s[0])
        numList = [num]
        while num != n:
            s = str(num)
            num = int(s[1:] + s[0])
            numList.append(num)
        circular = True
        for i in numList:
            if not isPrime.setdefault(i, False):
                circular = False
                break
        for i in numList:
            circulars[i] = circular
        return circular
コード例 #3
0
ファイル: Euler98.py プロジェクト: pfhayes/euler
m = {}
squares = {}
lengths = {}

for word in words:
	w = list(word)
	w.sort()
	w = tuple(w)
	if w in m :
		m[w].append(word)
	else :
		m[w] = [word]

for i in range(10**5) :
	sq = i**2
	digs = digits(sq)
	if len(digs) == len(set(digs)) :
		digs = len(digs)
		if digs in squares :
			squares[digs].add(sq)
		else :
			squares[digs] = set([sq])

for key in m :
	if len(m[key]) > 1 :
		l = len(m[key][0])
		if l in lengths :
			lengths[l].append(m[key])
		else :
			lengths[l] = [m[key]]
コード例 #4
0
ファイル: Euler111.py プロジェクト: pfhayes/euler
				l = [firstDig]
				l.extend(lis)
				tabs.append(l)
		return tabs

totalSum = 0

for repeatedDigit in range(10) :
	primes = set([])
	for numRepeats in range(numlength-1,0,-1) :
		numUniques = numlength - numRepeats
		print repeatedDigit, numRepeats
		primeCount = 0
		primeSum = 0
		for i in range(10**numUniques) :
			uniqueDigs = digits(i,numUniques)
			for combo in genAllLists(numUniques,0,9) :
				digs = [repeatedDigit]*numRepeats
				for place in reversed(range(len(combo))) :
					digs[combo[place]:combo[place]] = [uniqueDigs[place]]
				if digs[0] == 0 :
					continue
				num = digitsToNum(digs)
				if num not in primes and isPrime(num) :
					#print num
					primes.add(num)
					primeCount += 1
					primeSum += num
		if primeCount > 0 :
			print "S(", numlength, ", ", repeatedDigit, ") =", primeSum
			totalSum += primeSum
コード例 #5
0
ファイル: Euler119.py プロジェクト: pfhayes/euler
from useful import digits
from math import log10

i = 2
lis = []
try :
	while (True) :
		prod = i
		while (log10(prod) < i) :
			if (sum(digits(prod)) == i) :
				lis.append(prod)
			prod *= i
		i += 1
except KeyboardInterrupt, e :
	print sorted(lis)
コード例 #6
0
ファイル: Euler70.py プロジェクト: pfhayes/euler
			ret.append(p)
			n /= p
		if n == 1 :
			return ret
	return ret + [n]

def phi(n) :
	facts = primeFactorize(n)
	if len(facts) == 1:
		return n-1
	ret = n
	for fact in facts :
		ret /= fact
		ret*= fact-1
	return ret

minVal = 100
for num in xrange(10**7,1,-1) :
	ph = phi(num)
	if float(num)/ph < minVal and int(log10(ph)) == int(log10(num)) :
		digsp = digits(ph)
		digsn = digits(num)
		for dig in digsp :
			if dig in digsn :
				digsn.remove(dig)
			else :
				break
		else :
			print num
			minVal = float(num)/ph
			print minVal
コード例 #7
0
ファイル: Euler37.py プロジェクト: pfhayes/euler
# Find the only eleven primes that are truncatable from left to right and from right to left

from useful import digits, primeList, digitsToNum

isPrime = {}
primes = primeList(1000000)

sum = 0
for p in primes :
	isPrime[p] = True
	dList = digits(p)
	satisfies = True
	for i in range(1,len(dList)) :
		if not isPrime.setdefault(digitsToNum(dList[i:]),False) :
			satisfies = False
			break
	for i in range(1,len(dList)) :
		if not isPrime.setdefault(digitsToNum(dList[:i]),False) :
			satisfies = False
			break
	if satisfies :
		print p
		sum += p

print sum
		
コード例 #8
0
ファイル: Euler80.py プロジェクト: pfhayes/euler
# Compute the irrational square roots of all n in 1 <= n <= 100 to 100 decimal places
	# The answer is the sum of all the decimal digits
	
from math import log10, sqrt
from useful import digits	

s = 0

for square in range(100) :
	if square in [0,1,4,9,16,25,36,49,64,81] :
		continue
	c = square
	p = 0
	x = int(sqrt(square))
	y = (20*p + x)*x
	p = x
	c = c - y
	for times in range(99) :
		c *= 100
		for x in range(11) :
			y = (20*p + x)*x
			if y > c :
				x -= 1
				y = (20*p + x)*x
				p = 10*p + x
				break
		c = c - y
	s += sum(digits(p))

print s
コード例 #9
0
ファイル: Euler56.py プロジェクト: pfhayes/euler
# Find the maximum possible sum of digits for a^b, with a,b < 100

from useful import digits

maxA, maxB, maxSum = 0,0,0

for a in range (100) :
	for b in range(100) :
		s = sum(digits(a**b))
		maxSum = max([s,maxSum])
		if s == maxSum :
			maxA = a
			maxB = b

print maxSum, a, b
コード例 #10
0
ファイル: Euler134.py プロジェクト: pfhayes/euler
answer = 0

def get_sol(a,b,c) :
  (x, y) = extended_gcd(a,b)
  return (x*c, y*c)

def extended_gcd(a,b) :
  if b == 0 :
    return (1,0)
  q = a / b
  r = a % b
  (s, t) = extended_gcd(b, r)
  return (t, s - q*t)

for i in xrange(len(primes)) :
  p1 = primes[i]
  p2 = primes[i+1]
  if p1 > 1000000 :
    break
  digs = len(digits(p1))
  a = -(10**digs)
  b = p2
  c = p1
  (solx, soly) = get_sol(a,b,c)
  n = int(soly/a) + 1
  realy = soly - a * n
  solution = p2 * realy
  answer += solution

print answer
コード例 #11
0
ファイル: Euler40.py プロジェクト: pfhayes/euler
# Find the 1th,10th,100th,...,1000000th digits of the decimal 
# 0.1234567891011121314...

count = 1
num = 1
ret = []

from math import log10
from useful import digits

while (count <= 1000001) :
	for dig in digits(num) :
		if count in [1,10,100,1000,10000,100000,1000000] :
			ret.append(dig)
		count += 1
	num += 1

print ret
コード例 #12
0
ファイル: Euler60.py プロジェクト: pfhayes/euler
cands1 = set([frozenset([3])])
cands2 = set([frozenset([3])])

def makesPrimes(a,b) :
	if isPrime(a * 10**(int(log10(b))+1) + b) and isPrime(b * 10**(int(log10(a))+1) + a) :
		return True
	return False

count = 0

#Reconnaissance
for p in primes[2:] :
	#print p
	toAdd = set([])
	toRemove = set([])
	pool = sum(digits(p)) % 3
	if pool == 1 :
		targetSet = cands1
	else :
		targetSet = cands2
	for cand in targetSet :
		works = set([])
		for prime in cand :
			if makesPrimes(prime,p) :
				works.add(prime)
		if len(works) == len(cand) :
			toRemove.add(cand)
			toAdd.add(frozenset(cand | set([p])))
		else :
			toAdd.add(frozenset(works | set([p])))
		if len(cand) == search :
コード例 #13
0
ファイル: Euler104.py プロジェクト: pfhayes/euler
#Find the first Fibonacci number whose first and last nine digits are pandigital

from useful import digits

last1 = 1
last2 = 1
first1 = 1
first2 = 1
term = 3
lotsOfDigs = 10**15
while(True):
	lastCurr = (last1 + last2) % 10**9
	firstCurr = (first1 + first2)
	if firstCurr >= lotsOfDigs :
		firstCurr /= 10
		first2 /= 10
	last9 = digits(lastCurr)
	first9 = digits(firstCurr)[:9]
	print term, firstCurr
	if 0 not in first9 and len(first9) == 9 and len(set(first9)) == 9 and 0 not in last9 and len(last9) == 9 and len(set(last9)) == 9:
		print term
		break
	last1 = last2
	last2 = lastCurr
	first1 = first2
	first2 = firstCurr
	term += 1
コード例 #14
0
ファイル: Euler65.py プロジェクト: pfhayes/euler
# Find the sum of the digits in the numerator of the 100th convergent of e

from useful import digits

def convergent(n) :
	if n == 1 :
		return (2,1)
	def recurseUpToN(step) :
		if step % 3 == 0 :
			val = 2*(step/3)
		else :
			val = 1
		if step == n :
			return (1,val)
		else :
			next = recurseUpToN(step+1)
			tup = (val * next[1] + next[0], next[1])
			return (tup[1],tup[0])
	ret = recurseUpToN(2)
	return (2 * ret[1] + ret[0],ret[1])

tup = convergent(100)
print tup

print sum(digits(tup[0]))
コード例 #15
0
ファイル: Euler38.py プロジェクト: pfhayes/euler
# Find the largest number that can be produced by taking an integer and
# multiplying it by numbers 1..n such that the concatenated products form
# a 9-pandigital

from math import log10
from useful import digits

maxNum = 0

for i in range(10, 10000):
    num = i
    count = 2
    while num < 10 ** 8:
        newDigs = i * count
        num *= 10 ** int(log10(newDigs) + 1)
        num += newDigs
        count += 1
    digs = digits(num)
    if len(digs) == 9 and len(set(digs)) == 9 and 0 not in digs:
        print i, count, num
        maxNum = max((maxNum, num))

print maxNum
コード例 #16
0
ファイル: Euler43.py プロジェクト: pfhayes/euler
# Find the sum of all 0 to 9 pandigital primes where
# d2-4 is divisible by 2, d3-5 is divisible by 3, d4-6 is divisible by 5
# and so on through the primes

from useful import digits, primeList, digitsToNum

primes = primeList(18)
sum = [0]

def satisfies(threeDigs, primeIndex, allDigsSoFar) :
	if primeIndex == 0 :
		if threeDigs % 2 == 0 and len(set(allDigsSoFar)) == 9 :
			count = 0
			while (count < 10)  :
				if count not in allDigsSoFar :
					break
				count += 1
			val = digitsToNum([count] + allDigsSoFar)
			print val
			sum[0] += val
	lastTwoDigs = threeDigs/10
	for i in range(10) :
		if (i * 100 + lastTwoDigs) % primes[primeIndex-1] == 0 and i not in allDigsSoFar :
			satisfies(i*100+lastTwoDigs, primeIndex-1, [i] + allDigsSoFar)

for j in range(6,59) :
	digs = digits(j*17,3)
	if len(set(digs)) == 3:
		satisfies(j*17,6,digs)

print sum
コード例 #17
0
ファイル: Euler185.py プロジェクト: pfhayes/euler
d[3041631117224635] = 3
d[1841236454324589] = 3
d[2659862637316867] = 2

"""
d[90342] = 2
d[70794] = 0
d[39458] = 2
d[34109] = 1
d[51545] = 2
d[12531] = 1
"""

digits_map = {}
for key in d :
  digits_map[key] = digits(key)

seq = [set([0,1,2,3,4,5,6,7,8,9]) for x in xrange(16)]
keys = []

# Build the list of keys, with keys with fewer correct entries
# coming first
for key in d :
  if d[key] == 0 :
    digs = digits_map[key]
    for i in xrange(len(digs)) :
      seq[i].discard(digs[i])
  elif d[key] == 1 :
    keys.append(key)
for key in d :
  if d[key] == 2 :
コード例 #18
0
ファイル: Euler68.py プロジェクト: pfhayes/euler
	def numify(self,lis) :
		ret = []
		for l in lis :
			ret.extend(digits(l))
		return digitsToNum(ret)
コード例 #19
0
ファイル: Euler55.py プロジェクト: pfhayes/euler
# Find the number of Lychrel numbers below 10000

from useful import digits, isPali, digitsToNum

count = 0
for i in range(10000) :
	sum = i
	for j in range(50) :
		l = digits(sum)
		l.reverse()
		sum += digitsToNum(l)
		if isPali(sum) :
			break
	else :
		print i
		count += 1

print count
		
コード例 #20
0
ファイル: Euler49.py プロジェクト: pfhayes/euler
# Find the only other 3-term, 4-digit arithmetic sequence where all terms are prime and all terms
# contain the same digits
# One is 1487, 4817, 8147

from useful import digits, primeList

primes = primeList(10000)
nums = {}

for p in primes :
	digs = digits(p)
	digs.sort()
	dT = tuple(digs)
	val = nums.setdefault(dT, [0,[]]) 
	val[0] += 1
	val[1].append(p)
	nums[dT] = val

for k in nums.keys() :
	if nums[k][0] >= 3 :
		this = nums[k][1]
		this.sort()
		for i in range(len(this)) :
			for j in range(i+1,len(this)) :
				for k in range(j+1, len(this)) :
					if this[j] - this[i] == this[k] - this[j] :
						print this[i], this[j], this[k]
						

コード例 #21
0
ファイル: Euler32.py プロジェクト: pfhayes/euler
# Find all numbers x that can be factored into x=ab such that x, a, and b contain each digit 1 through 9 exactly once.

# Let us generate all 4 or 5-digit numbers that are composed of unique digits.

from useful import primeFactorize, digits
				
sum = 0
for i in range (1000, 10000) :
	dList = digits(i)
	if (len(set(dList)) != len(dList) or 0 in dList) :
		continue
	factors = primeFactorize(i)
	for j in range(2**len(factors)) :
		num1 = 1
		num2 = 1
		for k in range(len(factors)) :
			if j/(k+1) == 1 :
				num1 *= factors[k]
			else :
				num2 *= factors[k]
		allDigits = dList + digits(num1) + digits(num2)
		if (len(allDigits) == 9 and len(set(allDigits)) == 9 and 0 not in allDigits) :
			print i, num1, num2, "!"
			sum += i
			break

print sum
コード例 #22
0
ファイル: Euler62.py プロジェクト: pfhayes/euler
# Find the smallest cube for which 5 permutations of its digits are cubes

perms = {}

from useful import digits

count = 1
while True :
	num = count**3
	cub = digits(num)
	cub.sort()
	cub = tuple(cub)
	l = perms.setdefault(cub,[0,num])
	l[0] += 1
	if l[0] >= 5 :
		print l
		break
	perms[cub] = l
	count += 1