def perms (l) : if len(l) is 7 : if isPrime(digitsToNum(l)) : print "\t", l sys.exit(0) else : print l for i in range(7,0,-1) : if i in l : continue perms(l+[i])
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)
def number(theDigs) : #global depth if len(theDigs) == 0 : #print depth return 1 s = 0 for digs2 in powerset(theDigs) : if digs2: count = 0 for digs in allArrangements(digs2) : num = digitsToNum(digs) if isPrime(num) : count += 1 if count > 0 : #for f in range(depth) : # print " ", #print digs, num #depth.append(num) next = [x for x in theDigs if x not in digs] #print num, next s += count * number(next) #depth = depth[:-1] return s
# 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
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]] for key in reversed(sorted(lengths.keys())) : maxNum = 0 for wordset in lengths[key] : word1, word2 = wordset[:2] for square in squares[len(word1)] : squareDigs = digits(square) lis = [squareDigs[word2.index(char)] for char in word1] if lis[0] == 0 : continue num = digitsToNum(lis) if num in squares[len(word1)] : maxNum = max([maxNum,num,square]) print maxNum
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 break print totalSum
def numify(self,lis) : ret = [] for l in lis : ret.extend(digits(l)) return digitsToNum(ret)
from useful import PrimeList, digitsToNum primes = PrimeList(1000000) print "Done primes!" # Tried 5-digit numbers... didn't work. # Contruct all 6-digit numbers that have 3 digits in common. numdigs = 6 for i in range(10) : for j in range(10) : for l in range(10): for pos1 in range(numdigs) : for pos2 in range(numdigs) : for pos3 in range(numdigs) : numcomps = 0 digs = [] for k in range(10) : digs = [k for x in range(numdigs)] digs[pos1] = i digs[pos2] = j digs[pos3] = l if digs[0] == 0 or digitsToNum(digs) not in primes : numcomps += 1 if numcomps > 2 : break if numcomps <= 2: print pos1, i, pos2, j, pos3, l, digs print "Done!"
# 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