Yes, you can incorporate this code into Sage if you like.

Alex

On Wed, Aug 13, 2008 at 2:44 AM, William Stein <[EMAIL PROTECTED]> wrote:

> On Wed, Aug 13, 2008 at 2:25 AM, Alex Mendes da Costa
> <[EMAIL PROTECTED]> wrote:
> > Hi,
> >
> > I'm using cython to wrap DJB's primegen library
> > (http://cr.yp.to/primegen.html).
>
> Are you going to contribute this code and the wrapper
> to Sage (http://sagemath.org)?  I've wanted to add
> primegen to Sage for a long time -- in fact, I asked
> DJB about its license on a panel discussion and
> in his response he released primegen under a public
> domain license.
>
>  -- William
>
> >
> > Here's my pyx file:
> >
> > cdef extern from "primegen.h":
> >     ctypedef unsigned long uint32
> >     ctypedef unsigned long long uint64
> >
> >     ctypedef struct primegen:
> >         uint32 buf[16][2048]
> >         uint64 p[512]
> >         int num
> >         int pos
> >         uint64 base
> >         uint64 L
> >
> >     void primegen_init(primegen* pg)
> >     uint64 primegen_next(primegen* pg)
> >     uint64 primegen_peek(primegen* pg)
> >     uint64 primegen_count(primegen* pg, uint64 to)
> >     void primegen_skipto(primegen* pg, uint64 to)
> >
> > cdef class PrimeGen:
> >     cdef primegen pg
> >
> >     def __new__(self):
> >         primegen_init(&self.pg)
> >
> >     def next(self):
> >         return primegen_next(&self.pg)
> >
> >     def peek(self):
> >         return primegen_peek(&self.pg)
> >
> >     def count(self, uint64 to):
> >         return primegen_count(&self.pg, to)
> >
> >     def skipto(self, uint64 to):
> >         primegen_skipto(&self.pg, to)
> >
> > Notice that the class has a method called "next".  This means that it
> should
> > be usable as an iterator.  Here's what happens if I try to do that:
> >
> > Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17)
> > [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
> > Type "help", "copyright", "credits" or "license" for more information.
> >>>> from primegen import PrimeGen
> >>>> class C:
> > ...   def __iter__(self):
> > ...     return PrimeGen()
> > ...
> >>>> for i in C():
> > ...   print i
> > ...
> > Traceback (most recent call last):
> >   File "<stdin>", line 1, in <module>
> > TypeError: __iter__ returned non-iterator of type 'primegen.PrimeGen'
> >
> > How come this doesn't work?  The generated class definitely has the
> "next"
> > method required by the iterator protocol.
> >
> >>>> p = PrimeGen()
> >>>> dir(p)
> > ['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__',
> > '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
> > '__setattr__', '__str__', 'count', 'next', 'peek', 'skipto']
> >
> > Thanks,
> > Alex
> > _______________________________________________
> > Cython-dev mailing list
> > [email protected]
> > http://codespeak.net/mailman/listinfo/cython-dev
> >
> >
>
>
>
> --
> William Stein
> Associate Professor of Mathematics
> University of Washington
> http://wstein.org
> _______________________________________________
> Cython-dev mailing list
> [email protected]
> http://codespeak.net/mailman/listinfo/cython-dev
>
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to