[Tutor] Generate Prime Numbers

Mirage Web Studio cmgcomsol at gmail.com
Sat May 30 20:14:38 CEST 2015


On 2015-05-29 11:18 PM, Alan Gauld wrote:
> On 29/05/15 16:28, George wrote:
>
>> Below is a sample code i created.
>>
>> Can i better it any way?
>
> Of course. There is always improvements that can be made.
> But in your case there are quite a few!
>
>> def IsDivisibleBy3(number):#string variable
>>      v=0
>>      for c in number:
>>          v=v+int(c)
>>      if v%3==0:
>>          return True
>>      else:
>>          return False
>
> def IsDivisibleBy3(number):#string variable
>     return not int(number) % 3
>
>> def IsDivisibleBy7(number):#string variable
>
> See above, but maybe better still
>
> def isDivisibleByN(number, N):
>    return not int(number)%N
>
>> def IsPrime(number):
>
> Google for the "sieve of eratosthenes"
> Or look it up on wikipedia.
>
> That will give one of several possible
> improvements to your algorithm.
>
>> primelist=[]
>>
>> for i in range (11,200000,2):
>>      number=str(i)
>>      print "checking ",i
>>
>>      if IsPrime(number):
>
> Note, you are starting with a number, then converting
> it to a string then in your functions converting it
> back to a number.
> That's crazy!
>
> Also where do you store the primes less than 11?
> ie. 1,3,5,7
>
> HTH

Hello,

I thank u all for the replies.  I have checked  sieve of Eratosthenes 
and have at first devised a solution using class-object, thinking it 
easier, but it proved to be slower than my basic algorithm which i 
submitted earlier,  results were my algorithm processed 100 thousand 
numbers in 80 or so sec but class based algorithm produced same result 
in about 230 sec. After putting some thought i used dict for a change 
with the sieve method and am able to produce primes for 1 million nos in 
about 10 sec, which is better than both earlier algorithms.  I am 
submitting both.

My query is does using classes slowed it or the python hardcoded 
algorithm for dicts was better?
and
if you had to implement the sieve algorithm how would u have done it.

Thank u


George

---------------------
class based algorithm
---------------------

import time

starttime=time.time()

class Number:
     def __init__(self,number,p=None,n=None):
         self.no=number
         self.marked=None
         self.p=p
         self.n=n


node=Number(2,None,None)
start=node

counter=1
for i in range(3,110000):
     counter+=1
     newnode=Number(i,node)
     node.n=newnode
     node=newnode

node=start


while start != None:
     if start.marked==True:
         start=start.n
         continue
     else:
         newprime = start.no
         print ("\nNewPrime",newprime,"\nMarking no:")
         tmpnode=start
         while tmpnode !=None:
             for i in range (newprime):
                 tmpnode=tmpnode.n
                 if tmpnode==None:
                     break
             if tmpnode==None:
                 break
             #print ( tmpnode.no, end=" ")
             tmpnode.marked=True
     start=start.n

print ("primes")
counter=0
while node!=None:
     if not node.marked:
         counter+=1
         print(node.no)

     node=node.n

print("--- %s seconds ---" % (time.time() - starttime), counter)


---------------------------
dict based algorithm
-------------------------



import time

starttime=time.time()

max=6000000

nodict={}

for i in range(2,max):
     nodict[i]=0

for no in sorted(nodict.keys()):
     x=no+no
     while x<max:
         nodict[x]=1
         x+=no

counter=0
for no in sorted(nodict.keys()):
     if nodict[no]==0:
         counter+=1
         print ("prime",no)

print("--- %s seconds ---" % (time.time() - starttime), counter)

---
This email has been checked for viruses by Avast antivirus software.
http://www.avast.com



More information about the Tutor mailing list