[Edu-sig] Hello from a CS Teacher

Kirby Urner pdx4d@teleport.com
Fri, 11 Feb 2000 17:31:41 -0800

At 07:07 PM 02/11/2000 -0600, Dustin James Mitchell wrote:
>On Fri, 11 Feb 2000, Kirby Urner wrote:
>>    while len(primes)<nbprimes:
>>        if addprime(i): primes.append(i)
>>        # skip even numbers (only 2 is prime)
>>        if i==2: i=i+1
>>        else:    i=i+1
>Shouldn't the latter be i=i+2, to go to the next odd number?

Dustin --

Yes, exactly, good eye!  The algorithm still worked, but
less efficiently.

Below is a variant which computes all prime numbers _up to
a maximum_ i.e. get2max().  

With this one in place, I'm able to do getfactors(), which 
lists all the prime factors of a number.

I also threw in isprime(), which answers whether any number 
is a prime number (1 means yes, 0 means no).


>>> seive.getfactors(10981)
[79, 139]
>>> seive.isprime(99901)
>>> seive.getfactors(30012)
[2, 2, 3, 41, 61]
>>> 2*2*3*41*61

I'm not claiming this is the most efficient or super-elegant
implementation of getfactor().  If others have pointers as
to how to improve these examples (to put Python in a good 
light), I'm happy to hear them.  But I'm not looking for a
lot of error checking on the passed parameters.  Yes you 
can crash these algorithms if you pass out-of-context 
values, but no, I'm not interested in cluttering up the
code based on the "naive user from hell" model.


primes = [2]    # dynamic list of primes

def get2max(maxnb):
   # return list of primes
   # maxnb = number not to exceed on list
   global primes  # keep at module level 
   while primes[-1]>maxnb:
       primes = primes[:-1]
   while i<=maxnb:
       if addprime(i): primes.append(i)
       if i==2: i=i+1
       else:    i=i+2
   return primes

def isprime(n):
    global primes  # keep at module level
    retval = 0
    primes = get2max(n)
    if n in primes: retval = 1
    return retval
def getfactors(n):
   global primes  # keep at module level
   # return list containing prime factors of a number
   primefactors = []
   primes = get2max(n)
   while not (n in primes):
       for i in primes:
           if n%i == 0: # no remainder
               n = n/i
   return primefactors