On 20/07/2006 1:58 AM,

(E-Mail Removed) wrote:

> Hi,

>

> I'm new at python as I just started to learn it, but I found out

> something weird. I have wrote a little program to compute Mersenne

> number:

>

> # Snipet on

> def is_prime n:
Syntax error. Should be:

def is_prime n:

> for i in range(2, n):

> if (n % i) == 0:

> return 0

> else:

> return 1

>

> for a in range(2, 10000000):

> if (is_prime(a) and is_prime(2**a-1))
Syntax error (missing

> print 2**a-1, " is a prime number"

> # Snipet off

>

> This program raise MemoryError. But this one:

>

> # Snipet on

> def is_prime n:

> for i in range(2, n):

> if (n % i) == 0:

> return 0

> return 1 # the change is here

>

> for a in range(2, 10000000):

> if (is_prime(a) and is_prime(2**a-1))

> print 2**a-1, " is a prime number"

> # Snipet off

>

> Does not! Why ??
Neither of the above compiles without error. You may regard this as a

novel suggestion (it's not), but try pasting the actual code that you ran.

When corrected, the versions are functionally equivalent. They give the

same result: on my box, they fell over trying to do

is_prime(536870911), in particular trying to do range(536870911). If

successful, that would produce a list of approx 0.5G elements. On a

32-bit box, that's about 2GB of pointers to objects. Each object has a

reference count, a pointer to its type, and its value -- another 6GB.

Total about 8GB. Use xrange() to avoid the memory grab.

HTH,

John