On Mon, Nov 24, 2008 at 10:43 PM, pong <[EMAIL PROTECTED]> wrote:
>
> I see that the ticket
>
> http://trac.sagemath.org/sage_trac/ticket/4533
>
> has been closed. Thank you for the effort, now divisors in SAGE is
> much faster!! However, the one that packed in SAGE 3.2 is still about
> 3 times slower than that in PARI. I wonder if all the improvements
> have been implemented in 3.2. or we need to wait for 3.2.1?
>
> PARI/GP (on a really old machine)
>
> for(i=1,1000, divisors(3293479734242732472))
> time = 1,433 ms.
>
> SAGE (on the same machine)
> sage: %timeit divisors(3293479734242732472)
> 100 loops, best of 3: 4.93 ms per loop
>

Quick remarks --  In pari, the runtime here is dominated by
the call to factor.  E.g., in pari you'll get the same
time if you replace divisors by factor.

Second: #4533 is *not* merged into sage-3.2.  It's only
going to appear in 3.2.1 -- that's why Michael wrote
"Merged the edited patch in Sage 3.2.1.alpha0" at the
bottom of the ticket. I think 3.2 just has the old code.
In 3.2.1 pari is about 0.61s for me on that benchmark and
sage is about 0.90s (for 1000 iterations).

I think the actual divisor enumeration code is faster in Sage, but
there is overhead doing the factorization, which is the reason
Sage is a tiny bit slower.

William


> Thanks!
>
>
>
>
> On Nov 16, 12:26 am, Robert Bradshaw <[EMAIL PROTECTED]>
> wrote:
>> On Nov 15, 2008, at 11:57 PM, pong wrote:
>>
>> > I was a bit reluctant to post this question here since "support"
>> > shouldn't mean teaching me how to write programs. But Jason Grout
>> > suggested me to post it here anyway.
>>
>> Short snippets of code (like the one below) are very useful. It's
>> hard to give a good answer without something concrete to go on. I am
>> also curious what kind of input you're giving it. (Highly composite I
>> suppose?)
>>
>> > Here is a very short script that I want to maximize the speed
>>
>> > def lspec(n):
>> >       return sorted([k if k^2 < 2*n else 2*n/k for k indivisors
>> > (odd_part(n))])
>>
>> > At first, I think I can make it faster by avoiding computing k^2 in
>> > the for loop by replacing k^2 > 2*n  by
>> > k > r where r = sqrt(RDF(2*n)) is computed once outside the for loop.
>> > However, it looks like comparing two entities of different types is
>> > veryslowin SAGE so I ended up with a slower script if a do that.
>>
>> Try setting r = (2*n).isqrt(), which is an integer. You can also
>> write 2*n//k which will do exact division (since you know the result
>> is an integer). After making these two changes it seems to run in
>> exactly the time it takes to computedivisors(odd_part(n)). The  
>> divisorsfunction looks horribly inefficient, it's probably only ever
>> been used for small inputs. I've made a ticket
>>
>> http://trac.sagemath.org/sage_trac/ticket/4533
>>
>> > Also I tried to replace k by 2*n/k only for those k indivisors
>> > (odd_part(n)) whose squares are > 2*n (instead of doing a list
>> > comprehension) but the resulting script is not any faster.
>>
>> > Thanks in advance
>>
>> > P.S. I implemented the algorithm using PARI/GP, the result is almost
>> > 200 times faster.
>>
>> That is quite the difference. Hopefully this gives us a good goal as
>> to how fast we can list thedivisorsof a number.
>>
>> - Robert
> >
>



-- 
William Stein
Associate Professor of Mathematics
University of Washington
http://wstein.org

--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-support@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sage-support
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---

Reply via email to