[Tutor] recursive factoring

Kirby Urner urnerk@qwest.net
Wed, 16 Jan 2002 21:31:21 -0800


Here's another approach which doesn't keep scanning
the same numbers over and over for primes.  Instead,
a sieve is run against n right off the bat, and then
isprime just uses this as a lookup list:

  class Primes:
	def __init__(self,n):
	    self.primes = sieve(n)
	def __call__(self,val):
	    if val in self.primes:
		return 1
            else:
	        return 0
	
  def factor(n):
	isprime = Primes(n)
	def getnext(n):
	   if isprime(n):
	      return [n]
           for i in range(2, math.sqrt(n)+1):
	      if isprime(i) and n%i==0:
		  return [i] + getnext(n/i)
	return getnext(n)

But of course this means you need a sieve function
as well.  Here's one:

def sieve(n):
    """
    In-place sieving of odd numbers, adapted from code
    by Mike Fletcher
    """
    candidates = range(3, n+1, 2)  # start with odds
    for p in candidates:
        if p:                   # skip zeros
	   if p*p>n: break     # done
	   for q in xrange(p*p, n+1, 2*p):  # sieving
		candidates[(q-3)/2] = 0
    return [2] + filter(None, candidates)  # [2] + remaining nonzeros

Kirby