#!/usr/bin/python2.4 def product(numbers): total = 1 for number in numbers: total *= number return total def pairOff(firstPart, secondParts): pairs = [] for part in secondParts: if type(part) is list: pairs.append([firstPart] + part) else: pairs.append([firstPart, part]) return pairs def makeCombos(elements): combos = [] rElements = list(elements) for element in elements: combos.append([element]) rElements.remove(element) combos += pairOff(element, makeCombos(rElements)) return combos def combinations(elements): combos = [] for element in elements: combos.append([element]) currentSet = list(combos) for length in range(len(elements)): lastSet = currentSet currentSet = [] for element in elements: for firstPart in lastSet: if (firstPart.count(element) < length) and (firstPart.count(element) < elements.count(element)): print firstPart +[element] currentSet.append(firstPart +[element]) combos += currentSet return combos def primeFactors(number): if number == 1: return [1] else: factor = 2 while factor <= number: if (number % factor) == 0: return [factor] + primeFactors(number/factor) factor += 1 return [] def properFactors(number): propFacts = factors(number) propFacts.remove(number) return propFacts def factors(number): facts = [] primeFacts = primeFactors(number) comboPrimeFacts = makeCombos(primeFacts) for combo in comboPrimeFacts: facts.append(product(combo)) facts = list(set(facts)) facts.sort() return facts for number in [15, 220, 381654729, 36, 8128, 284, 386451729, 28]: print print str(number) + ":" attributes = [] pFacts = properFactors(number) strPFacts = [] for pFact in pFacts: strPFacts.append(str(pFact)) factSum = sum(pFacts) print "\tdetermining factor sum:", "+".join(strPFacts), " = ", factSum if number > factSum: attributes.append("C: deficient") elif number < factSum: attributes.append("A: abundant") elif number == factSum: attributes.append("B: perfect") pFactsOfFactSum = properFactors(factSum) factSumOfFactSum = sum(pFactsOfFactSum) strPFactsOfFactSum = [] for otherFact in pFactsOfFactSum: strPFactsOfFactSum.append(str(otherFact)) print "\tdetermining amicability:", "+".join(strPFactsOfFactSum), " = ", factSumOfFactSum if (factSumOfFactSum == number) and (number != factSum): attributes.append("E: amicable with " + str(factSum)) if len(str(number)) == 9: isDelectable = 1 for digit in range(1,10): isDelectable *= str(number).count(str(digit)) if isDelectable == 1: for digit in range(1,10): isDelectable += (int(str(number)[:digit]) % digit) if isDelectable == 1: attributes.append("D: delectable!") print "\t" + "; ".join(attributes)