Re: [sage-support] Re: Quaternions, how to speed up computation

2018-11-19 Thread Kolen Cheung
Thanks. This answer my question and I put the tip 
in https://groups.google.com/d/msg/sage-support/NFtI5XqjQWg/sz5WPcFMAgAJ

On Monday, November 19, 2018 at 3:58:50 AM UTC-8, John Cremona wrote:
>
> I recommend importing anything you need from sage.all since the details of 
> where everything is might change in time.  This works perfectly well:
>
> $ sage -python  # so we use Sage's python not my system-wide one
> Python 2.7.15 (default, Nov  2 2018, 14:32:42) 
> [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> from sage.all import PolynomialRing, QQ
> >>> R = PolynomialRing(QQ,'x')
> >>> x = R.gen()
> >>> f = x^3+1 # no good as no preparser
> Traceback (most recent call last):
>   File "", line 1, in 
>   File "sage/structure/element.pyx", line 944, in 
> sage.structure.element.Element.__xor__ 
> (build/cythonized/sage/structure/element.c:9006)
> RuntimeError: Use ** for exponentiation, not '^', which means xor
> in Python, and has the wrong precedence.
>
> # Now we can work with this:
>
> >>> f = x**3+1  # that's better
> >>> f.factor()
> (x + 1) * (x^2 - x + 1)
>
> Another thing I do is to put my commands into a .py file and run pyflakes 
> on it, as that reveals what things need to be imported.  Then import them 
> all from sage.all.
>
> John Cremona
>
> On Mon, 19 Nov 2018 at 11:48, Kolen Cheung  > wrote:
>
>> Thank you both for the answers. However, I’m still stuck:
>>
>> Focusing on just translating the first line: R. = QQ[]
>>
>> In sage,
>>
>> >>> preparse("R. = QQ[]")"R = QQ['x']; (x,) = R._first_ngens(1)">>> 
>> >>> import_statements(QQ)# ** Warning **: several names for that object: Q, 
>> >>> QQfrom sage.rings.rational_field import Q>>> import_statements(R)from 
>> >>> sage.rings.qqbar import QQx
>>
>> Immediately I have a question: how come the import_statements of QQ is ... 
>> import Q, and the import statement of R is ... import QQx? In either 
>> case the namespace in question is not imported. Does it mean ... import 
>> Q as QQ and ... import QQx as R respectively?
>>
>> Then I’ve a problem: In sage, I can import them using these import 
>> statements. But when entering these 2 import statements in Python,
>>
>> >>> from sage.rings.rational_field import Q
>> ---
>> ImportError   Traceback (most recent call last)
>>  in ()
>> > 1 from sage.rings.rational_field import Q
>>
>> /usr/lib/python2.7/site-packages/sage/rings/rational_field.py in ()
>>  62 _long_type = int
>>  63 
>> ---> 64 from .rational import Rational
>>  65 from .integer import Integer
>>  66 
>>
>> /usr/lib/python2.7/site-packages/sage/rings/rational.pyx in init 
>> sage.rings.rational (build/cythonized/sage/rings/rational.c:40976)()
>>  94 
>>  95 
>> ---> 96 import sage.rings.real_mpfr
>>  97 import sage.rings.real_double
>>  98 from libc.stdint cimport uint64_t
>>
>> /usr/lib/python2.7/site-packages/sage/rings/real_mpfr.pyx in init 
>> sage.rings.real_mpfr (build/cythonized/sage/rings/real_mpfr.c:44298)()
>> > 1 r"""
>>   2 Arbitrary Precision Real Numbers
>>   3 
>>   4 AUTHORS:
>>   5 
>>
>> /usr/lib/python2.7/site-packages/sage/rings/complex_number.pxd in init 
>> sage.libs.mpmath.utils (build/cythonized/sage/libs/mpmath/utils.c:8831)()
>>   4 from .real_mpfr cimport RealNumber
>>   5 
>> > 6 cdef class ComplexNumber(sage.structure.element.FieldElement):
>>   7 cdef mpfr_t __re
>>   8 cdef mpfr_t __im
>>
>> /usr/lib/python2.7/site-packages/sage/rings/complex_double.pxd in init 
>> sage.rings.complex_number 
>> (build/cythonized/sage/rings/complex_number.c:24212)()
>>   8 
>>   9 
>> ---> 10 cdef class ComplexDoubleField_class(sage.rings.ring.Field):
>>  11 pass
>>  12 
>>
>> /usr/lib/python2.7/site-packages/sage/rings/complex_double.pyx in init 
>> sage.rings.complex_double 
>> (build/cythonized/sage/rings/complex_double.c:24230)()
>>  96 from cypari2.convert cimport new_gen_from_double, 
>> new_t_COMPLEX_from_double
>>  97 
>> ---> 98 from . import complex_number
>>  99 
>> 100 from .complex_field import ComplexField
>>
>> ImportError: cannot import name complex_number
>> >>> from sage.rings.qqbar import QQx
>> ---
>> ImportError   Traceback (most recent call last)
>>  in ()
>> > 1 from sage.rings.qqbar import QQx
>>
>> /usr/lib/python2.7/site-packages/sage/rings/qqbar.py in ()
>> 512 rich_to_bool, richcmp_not_equal,
>> 513 op_EQ, op_NE)
>> --> 514 from sage.rings.real_mpfr import RR
>> 515 from sage.rings.real_mpfi import RealIntervalField, RIF, 
>> is_RealIntervalFieldElement, RealIntervalField_class
>> 516 from 

Re: [sage-support] Re: Quaternions, how to speed up computation

2018-11-19 Thread Kolen Cheung


I wonder why for me the result is

>>> import_statements(QQ)
# ** Warning **: several names for that object: Q, QQ from 
sage.rings.rational_field import Q

On Monday, November 19, 2018 at 4:05:55 AM UTC-8, Dima Pasechnik wrote:

On Mon, Nov 19, 2018 at 11:58 AM John Cremona  > wrote: 
> > 
> > I recommend importing anything you need from sage.all since the details 
> of where everything is might change in time.  This works perfectly well: 
> > 
> > $ sage -python  # so we use Sage's python not my system-wide one 
> > Python 2.7.15 (default, Nov  2 2018, 14:32:42) 
> > [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 
> > Type "help", "copyright", "credits" or "license" for more information. 
> > >>> from sage.all import PolynomialRing, QQ 
> > >>> R = PolynomialRing(QQ,'x') 
> > >>> x = R.gen() 
> > >>> f = x^3+1 # no good as no preparser 
> > Traceback (most recent call last): 
> >   File "", line 1, in  
> >   File "sage/structure/element.pyx", line 944, in 
> sage.structure.element.Element.__xor__ 
> (build/cythonized/sage/structure/element.c:9006) 
> > RuntimeError: Use ** for exponentiation, not '^', which means xor 
> > in Python, and has the wrong precedence. 
> > 
> > # Now we can work with this: 
> > 
> > >>> f = x**3+1  # that's better 
> > >>> f.factor() 
> > (x + 1) * (x^2 - x + 1) 
> > 
> > Another thing I do is to put my commands into a .py file and run 
> pyflakes on it, as that reveals what things need to be imported.  Then 
> import them all from sage.all. 
>
> you can also find out exactly what you need to import: 
>
> sage: import_statements("QQ") 
> from sage.rings.rational_field import QQ 
>
>
> > 
> > John Cremona 
> > 
> > On Mon, 19 Nov 2018 at 11:48, Kolen Cheung  > wrote: 
> >> 
> >> Thank you both for the answers. However, I’m still stuck: 
> >> 
> >> Focusing on just translating the first line: R. = QQ[] 
> >> 
> >> In sage, 
> >> 
> >> >>> preparse("R. = QQ[]") 
> >> "R = QQ['x']; (x,) = R._first_ngens(1)" 
> >> >>> import_statements(QQ) 
> >> # ** Warning **: several names for that object: Q, QQ 
> >> from sage.rings.rational_field import Q 
> >> >>> import_statements(R) 
> >> from sage.rings.qqbar import QQx 
> >> 
> >> Immediately I have a question: how come the import_statements of QQ is 
> ... import Q, and the import statement of R is ... import QQx? In either 
> case the namespace in question is not imported. Does it mean ... import Q 
> as QQ and ... import QQx as R respectively? 
> >> 
> >> Then I’ve a problem: In sage, I can import them using these import 
> statements. But when entering these 2 import statements in Python, 
> >> 
> >> >>> from sage.rings.rational_field import Q 
> >> 
> --- 
> >> ImportError   Traceback (most recent call 
> last) 
> >>  in () 
> >> > 1 from sage.rings.rational_field import Q 
> >> 
> >> /usr/lib/python2.7/site-packages/sage/rings/rational_field.py in 
> () 
> >>  62 _long_type = int 
> >>  63 
> >> ---> 64 from .rational import Rational 
> >>  65 from .integer import Integer 
> >>  66 
> >> 
> >> /usr/lib/python2.7/site-packages/sage/rings/rational.pyx in init 
> sage.rings.rational (build/cythonized/sage/rings/rational.c:40976)() 
> >>  94 
> >>  95 
> >> ---> 96 import sage.rings.real_mpfr 
> >>  97 import sage.rings.real_double 
> >>  98 from libc.stdint cimport uint64_t 
> >> 
> >> /usr/lib/python2.7/site-packages/sage/rings/real_mpfr.pyx in init 
> sage.rings.real_mpfr (build/cythonized/sage/rings/real_mpfr.c:44298)() 
> >> > 1 r""" 
> >>   2 Arbitrary Precision Real Numbers 
> >>   3 
> >>   4 AUTHORS: 
> >>   5 
> >> 
> >> /usr/lib/python2.7/site-packages/sage/rings/complex_number.pxd in init 
> sage.libs.mpmath.utils (build/cythonized/sage/libs/mpmath/utils.c:8831)() 
> >>   4 from .real_mpfr cimport RealNumber 
> >>   5 
> >> > 6 cdef class ComplexNumber(sage.structure.element.FieldElement): 
> >>   7 cdef mpfr_t __re 
> >>   8 cdef mpfr_t __im 
> >> 
> >> /usr/lib/python2.7/site-packages/sage/rings/complex_double.pxd in init 
> sage.rings.complex_number 
> (build/cythonized/sage/rings/complex_number.c:24212)() 
> >>   8 
> >>   9 
> >> ---> 10 cdef class ComplexDoubleField_class(sage.rings.ring.Field): 
> >>  11 pass 
> >>  12 
> >> 
> >> /usr/lib/python2.7/site-packages/sage/rings/complex_double.pyx in init 
> sage.rings.complex_double 
> (build/cythonized/sage/rings/complex_double.c:24230)() 
> >>  96 from cypari2.convert cimport new_gen_from_double, 
> new_t_COMPLEX_from_double 
> >>  97 
> >> ---> 98 from . import complex_number 
> >>  99 
> >> 100 from .complex_field import ComplexField 
> >> 
> >> ImportError: cannot import name complex_number 
> >> >>> from sage.rings.qqbar import QQx 
> >> 
> --- 
> >> ImportError

Re: [sage-support] Re: Quaternions, how to speed up computation

2018-11-19 Thread Dima Pasechnik
On Mon, Nov 19, 2018 at 11:58 AM John Cremona  wrote:
>
> I recommend importing anything you need from sage.all since the details of 
> where everything is might change in time.  This works perfectly well:
>
> $ sage -python  # so we use Sage's python not my system-wide one
> Python 2.7.15 (default, Nov  2 2018, 14:32:42)
> [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> from sage.all import PolynomialRing, QQ
> >>> R = PolynomialRing(QQ,'x')
> >>> x = R.gen()
> >>> f = x^3+1 # no good as no preparser
> Traceback (most recent call last):
>   File "", line 1, in 
>   File "sage/structure/element.pyx", line 944, in 
> sage.structure.element.Element.__xor__ 
> (build/cythonized/sage/structure/element.c:9006)
> RuntimeError: Use ** for exponentiation, not '^', which means xor
> in Python, and has the wrong precedence.
>
> # Now we can work with this:
>
> >>> f = x**3+1  # that's better
> >>> f.factor()
> (x + 1) * (x^2 - x + 1)
>
> Another thing I do is to put my commands into a .py file and run pyflakes on 
> it, as that reveals what things need to be imported.  Then import them all 
> from sage.all.

you can also find out exactly what you need to import:

sage: import_statements("QQ")
from sage.rings.rational_field import QQ


>
> John Cremona
>
> On Mon, 19 Nov 2018 at 11:48, Kolen Cheung  wrote:
>>
>> Thank you both for the answers. However, I’m still stuck:
>>
>> Focusing on just translating the first line: R. = QQ[]
>>
>> In sage,
>>
>> >>> preparse("R. = QQ[]")
>> "R = QQ['x']; (x,) = R._first_ngens(1)"
>> >>> import_statements(QQ)
>> # ** Warning **: several names for that object: Q, QQ
>> from sage.rings.rational_field import Q
>> >>> import_statements(R)
>> from sage.rings.qqbar import QQx
>>
>> Immediately I have a question: how come the import_statements of QQ is ... 
>> import Q, and the import statement of R is ... import QQx? In either case 
>> the namespace in question is not imported. Does it mean ... import Q as QQ 
>> and ... import QQx as R respectively?
>>
>> Then I’ve a problem: In sage, I can import them using these import 
>> statements. But when entering these 2 import statements in Python,
>>
>> >>> from sage.rings.rational_field import Q
>> ---
>> ImportError   Traceback (most recent call last)
>>  in ()
>> > 1 from sage.rings.rational_field import Q
>>
>> /usr/lib/python2.7/site-packages/sage/rings/rational_field.py in ()
>>  62 _long_type = int
>>  63
>> ---> 64 from .rational import Rational
>>  65 from .integer import Integer
>>  66
>>
>> /usr/lib/python2.7/site-packages/sage/rings/rational.pyx in init 
>> sage.rings.rational (build/cythonized/sage/rings/rational.c:40976)()
>>  94
>>  95
>> ---> 96 import sage.rings.real_mpfr
>>  97 import sage.rings.real_double
>>  98 from libc.stdint cimport uint64_t
>>
>> /usr/lib/python2.7/site-packages/sage/rings/real_mpfr.pyx in init 
>> sage.rings.real_mpfr (build/cythonized/sage/rings/real_mpfr.c:44298)()
>> > 1 r"""
>>   2 Arbitrary Precision Real Numbers
>>   3
>>   4 AUTHORS:
>>   5
>>
>> /usr/lib/python2.7/site-packages/sage/rings/complex_number.pxd in init 
>> sage.libs.mpmath.utils (build/cythonized/sage/libs/mpmath/utils.c:8831)()
>>   4 from .real_mpfr cimport RealNumber
>>   5
>> > 6 cdef class ComplexNumber(sage.structure.element.FieldElement):
>>   7 cdef mpfr_t __re
>>   8 cdef mpfr_t __im
>>
>> /usr/lib/python2.7/site-packages/sage/rings/complex_double.pxd in init 
>> sage.rings.complex_number 
>> (build/cythonized/sage/rings/complex_number.c:24212)()
>>   8
>>   9
>> ---> 10 cdef class ComplexDoubleField_class(sage.rings.ring.Field):
>>  11 pass
>>  12
>>
>> /usr/lib/python2.7/site-packages/sage/rings/complex_double.pyx in init 
>> sage.rings.complex_double 
>> (build/cythonized/sage/rings/complex_double.c:24230)()
>>  96 from cypari2.convert cimport new_gen_from_double, 
>> new_t_COMPLEX_from_double
>>  97
>> ---> 98 from . import complex_number
>>  99
>> 100 from .complex_field import ComplexField
>>
>> ImportError: cannot import name complex_number
>> >>> from sage.rings.qqbar import QQx
>> ---
>> ImportError   Traceback (most recent call last)
>>  in ()
>> > 1 from sage.rings.qqbar import QQx
>>
>> /usr/lib/python2.7/site-packages/sage/rings/qqbar.py in ()
>> 512 rich_to_bool, richcmp_not_equal,
>> 513 op_EQ, op_NE)
>> --> 514 from sage.rings.real_mpfr import RR
>> 515 from sage.rings.real_mpfi import RealIntervalField, RIF, 
>> is_RealIntervalFieldElement, RealIntervalField_class
>> 516 from sage.rings.complex_field import