After learning about Smith numbers today I cooked up this script fairly quickly. There are many places where it could be optimized and cleaned up but that wasn’t really the point – I just needed something that was accurate, and I’m pretty sure this is.
It also helped me to learn about the ulimit command after running it with a HUGE number that had taken up about 7GB of swap before I had to kill the process remotely via SSH…
#!/usr/bin/python
# smith number detector - TWS 1-12-13
def detectSmith(num):
  if(sumFactors(num) == sumDigits(num)):
    return True
  else:
    return False
# calculate the sum of the factors
def sumFactors(num):
  factorList = factors(num)
  sum = 0
  for factor in factorList:
    if factor > 9:
      # if a number (base ten) has multiple digits it has to be broken down
      sum = sum + sumDigits(factor)
    else:
      sum = sum + factor
  return sum
# sum the digits in a number with two or more
def sumDigits(num):
  sum = 0  
  if num > 9:
    while num > 9:
      sum = sum + num % 10
      num = num / 10
    sum = sum + num
    return sum
  else:
    # should never reach this
    return num
def factors(num):
  primeFactorList = []
  factor = lowestPrimeFactor(num)
  currentNum = num
  while factor != -1:
    primeFactorList.append(factor)
    currentNum = currentNum / factor
    factor = lowestPrimeFactor(currentNum)
  if(currentNum != num):
    # preventing returning the number passed in
    primeFactorList.append(currentNum)
  return primeFactorList
def lowestPrimeFactor(num):
  for x in range(2, (num / 2) + 1):
    if(num % x == 0):
      return x
  return -1
for number in range(1, 1000):
  if(detectSmith(number)):
    print "The number", number, "is a Smith number."

