On Wednesday, December 5, 2012 4:37:35 PM UTC, Volker Braun wrote:
>
> All the time is spent in Matrix_cyclo_dense.__init__ where a (nrows*ncols, 
> Q1092.degree()) rational matrix is constructed by first creating a list of 
> all nrows*ncols*Q1092.degree() entries:
>
>         elif isinstance(entries, list):
>             # This code could be made much faster using Cython, etc.
>             if coerce:
>                 K = parent.base_ring()
>                 entries = [K(a) for a in entries]
>             entries = sum([a.list() for a in entries], [])         
>  <-------- all the time spent here
>         self._n = int(self._base_ring._n())
>         self._matrix = Matrix_rational_dense(MatrixSpace(QQ, 
> self._nrows*self._ncols, self._degree),
>                                             entries, copy=False, 
> coerce=False).transpose()
>
>  
Thanks for the diagnosis!   I had forgotten that there was special code for 
matrices over cyclotomic fields, but it seems strange that the special code 
makes creating such a matrix a lot slower.  Perhaps I would be better off 
defining my field *not* as a cyclotomic field!

John
 

>
> On Wednesday, December 5, 2012 3:27:18 PM UTC, John Cremona wrote:
>>
>>
>>
>> On Wednesday, December 5, 2012 1:56:55 PM UTC, Jason Grout wrote:
>>>
>>> On 12/5/12 7:46 AM, John Cremona wrote: 
>>> > I don't know why this takes so long: 
>>> > 
>>> > I have a field F (a snumber field of high degree, 288 in fact) and 
>>> > want to create a 100x100 matrix over F from a list of 100 lists of 100 
>>> > elements of F, while I will call "entries".  If I do 
>>> > 
>>> > M = Matrix(entries) 
>>> > 
>>> > which certainly works fine with smaller examples, then I get tired of 
>>> > waiting (after 10 or 15 minutes) and cannot even interrupt with 
>>> > Ctrl-C.  But if I do 
>>> > 
>>> > M = copy(MatrixSpace(F,100).zero_matrix()) 
>>> > for i in range(100): 
>>> >     for j in range(100): 
>>> >        M[i,j] = entries[i,j] 
>>> > 
>>> > it works in a few seconds.  So what is going wrong with the first 
>>> (simpler) way? 
>>>
>>> If you just do Matrix(entries), it tries to guess the right base ring 
>>> (using the Sequence() command, IIRC).  In the second example, you are 
>>> explicitly telling Sage the base ring.  I wonder if that is what is 
>>> going on.  To check, can you try doing: 
>>>
>>> matrix(F, entries) 
>>>
>>>
>> That is slow too.  Try
>>
>>
>> Q1092.<z>=CyclotomicField(1092)
>> entries = [[Q1092.zero_element() for i in range(100)] for j in range(100)]
>> M=Matrix(Q1092,entries)
>>
>> which takes a long time (*) and cannot be interrupted with Ctrl-C.
>>
>> John
>>
>> (*) I have not yet had the patience to wait until it completes!
>>
>>  
>>
>>> Thanks, 
>>>
>>> Jason 
>>>
>>>
>>>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-support" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
Visit this group at http://groups.google.com/group/sage-support?hl=en.


Reply via email to