sympy: what's wrong with this picture?

Mensanator mensanator at aol.com
Wed Mar 5 15:34:28 EST 2008


On Mar 5, 9:29 am, Nanjundi <nanju... at gmail.com> wrote:
> On Mar 4, 3:13 pm, Mensanator <mensana... at aol.com> wrote:
>
> > On Mar 4, 12:32 pm, Nanjundi <nanju... at gmail.com> wrote:
>
> > > Does seeding ( random.seed ) random with time fix this? It should.
>
> > I suppose that depends on how long it takes factorint() to
> > process a number. If the seed is reset before the next clock
> > tick, you will get the same random numbers as the previous
> > iteration.
>
> Alright, then make it constant and don't worry about the clock tick.

Reseeding with a constant always sets the sequence to the same
starting
point.

>>> for i in xrange(10):
>
> ...   f1 = random.choice(f)
> ...   print f1,
> ...   f2 = random.choice(f)
> ...   print f2,
> ...   C = f1*f2
> ...   ff = None
> ...   ff = sympy.factorint(C)
> ...   print ff
> ...   random.seed(i)
> ...
> 5573 5171 [(5171, 1), (5573, 1)]
> 8537 7673 [(7673, 1), (8537, 1)]
> 2063 8573 [(2063, 1), (8573, 1)]
> 9551 9473 [(9473, 1), (9551, 1)]
> 2909 5659 [(2909, 1), (5659, 1)]
> 2897 1789 [(1789, 1), (2897, 1)]
> 6361 7541 [(6361, 1), (7541, 1)]
> 8017 8293 [(8017, 1), (8293, 1)]
> 3671 2207 [(2207, 1), (3671, 1)]
> 2803 9629 [(2803, 1), (9629, 1)]
>
> > Frankly, I don't understand why factorint() reseeds at all.
>
> Read the doc:
> *    The rho algorithm is a Monte Carlo method whose outcome can be
> affected by changing the random seed value.  *

But that doesn't give it the right to mess with the state
of the random number generator _I'm_ using. Had I actually
known what was happening, I could have saved the state of
my random number generator s=random.getstate() and then restored
it after calling factorint(), random.setstate(s).

import sympy   # with RK's patch removed
import time
import random

f = [i for i in sympy.primerange(1000,10000)]

for i in xrange(10):
  f1 = random.choice(f)
  print f1,
  f2 = random.choice(f)
  print f2,
  C = f1*f2
  ff = None
  rs = random.getstate()
  ff = sympy.factorint(C)
  random.setstate(rs)
  print ff

5669 3863 [(3863, 1), (5669, 1)]
1973 5431 [(1973, 1), (5431, 1)]
7577 6089 [(6089, 1), (7577, 1)]
8761 4957 [(4957, 1), (8761, 1)]
4153 2719 [(2719, 1), (4153, 1)]
4999 5669 [(4999, 1), (5669, 1)]
8863 5417 [(5417, 1), (8863, 1)]
7151 7951 [(7151, 1), (7951, 1)]
7867 9887 [(7867, 1), (9887, 1)]
9283 5227 [(5227, 1), (9283, 1)]

Of course, this is new as of Python 2.4, so if factorint()
tried to save & restore state, sympy wouldn't work on Python
2.3 or earlier.

If I'm reading RK's patch correctly, he doesn't reseed the
random number generator, he creates a new random object that
maintains it's own state that can be freely seeded to any
value without disturbing the state of my random number generator.

>
> > Doesn't Random automatically initialize the seed?
> > Doesn't constantly reseeding degrade the performance of the
> > random number generator? With Robert Kern's patch, the reseeding
> > is no longer a constant, fixing the immediate symptom.
>
> Does it matter?

I was wrong. It is a constant, just not 1234. If that's what
factorint() needs, fine. As long as it maintains a seperate state
than the one I'm using.

> The factorint reseeds using a constant seed (1234).

Not now it doesn't:

@@ -92,8 +92,8 @@ def pollard_pm1(n, B=10, seed=1234):

     """
     from math import log
-    random.seed(seed + B)
-    a = random.randint(2, n-1)
+    prng = random.Random(seed + B)
+    a = prng.randint(2, n-1)
     for p in sieve.primerange(2, B):
         e = int(log(B, p))
         a = pow(a, p**e, n)

>
> > But what if _I_ wanted to make a repeatable sequence for test
> > purposes? Wouldn't factorint() destroy my attempt by reseeding
> > on every call?
>
> Repeatable sequence? save it and reuse!

As part of my resolution to tone down my attitude,
I won't even reply to that.

> Think about "What if"s doesn't get any work done.

?

>
> -N




More information about the Python-list mailing list