Let's continue the discussion on the trac ticket (your link did work),
ideally there should be alink back from there to this thread too.

Make a new branch from the trac develop branch (currently at
6.2.beta5), not the master (still at 6.1.1).  Sorry for not
recognising your name as a seasoned contributor!

John

On 26 March 2014 14:13,  <martin.vgag...@gmx.net> wrote:
> On Wednesday, March 26, 2014 1:32:13 PM UTC+1, John Cremona wrote:
>>
>> You should definitely open a trac ticket.
>
>
> I just opened #16014 for this. And would make this a link to
> http://trac.sagemath.org/ticket/16014 if the Google Groups editor weren't
> too broken to let me do so...
>
>> Don't expect that if you
>> post some code as text on a ticket that someone else will magically do
>> the right thing though!  If you have not before contributed to Sage
>> you can make this your chance to learn how that works, and people will
>> help.
>
>
> I've submitted a couple of patches, e.g. for #13608 and #14239, and the one
> for #14403 which even got committed.
>
> But I'll take that opportunity to come to grips with the new git-based
> workflow. After pulling recent changes into my existing git checkout, I'm
> currently running "./sage --upgrade", and hope that after that and a "./sage
> -b" I have an up-to-date snapshot of the current sage master which I can
> then use as the basis for this contribution. If I should rather start from a
> released version, and avoid updating prior to contribution, please tell me
> so and also let me know why that's preferred.
>
>>
>> I would separate out two things here: one is a generic computation of
>> discriminants of univariate polynomials of degree d, the result being
>> a polynomial in d+1 variables (the generic coefficients) over ZZ (that
>> is correct -- there's a unique map from ZZ to any other ring).  This
>> should be part of the current invariant_theory module, though when I
>> just looked at that it only appeared to implement invariants for
>> binary forms of degrees 2 and 4 (not 3) as well as some ternary stuff.
>
>
> Uh... I had never seen that module before. But the way I see it, one would
> have to encode the degree of the polynomial into the name of some
> identifier, which would be possible if I did some case distinction as you
> indicated, but which feels weird nevertheless.
>
>>
>>  As a stop-gap, a global function generic_univariate_discriminant(deg)
>> whose output is a polynomial in ZZ[a0,a1,...,ad] and which caches its
>> results would do.
>
>
> Sounds more reasonable to me. Would you suggest that global to be in
> invariant_theory nevertheless, or rather in polynomial_element.pyx where it
> is used?
>
>>
>> Then your function should be a method for the class which is already
>> computing your discriminants, namely
>> sage.rings.polynomial.polynomial_element.Polynomial_generic_dense
>> but as there is already a discriminant function there you don't need a
>> new function, just special case code to catch small degrees (up to 3
>> or 4 at least) which gets the generic expression and substitutes
>> coefficients.
>
>
> I wonder whether doing the case distinction on degree is really the right
> thing to do. On the one hand, if the computation already takes ages for
> degree 3, it will be even worse for higher degrees. On the other hand, this
> computation is only bad due to the fact that the determinant computation on
> big polynomials is so expensive. If the base ring were just some finite
> field or some such, then I doubt we'd have to worry. So I wonder whether it
> might make more sense to do the case distinction based on the underlying
> ring. And in that case, I'm far from sure which cases should be handled
> which way. I guess I'd start by only detecting polynomial rings, and wait
> for other use cases to report problems. I don't know the most appropriate
> way to check whether a ring is a polynomial ring. Is some form of isinstance
> check the right way to do this, or should I combine checks is_PolynomialRing
> and is_MPolynomialRing?
>
> Perhaps I could also add an argument "algorithm" to the discriminant method.
> It would default to None (meaning auto-selection) but could be used to force
> either direct computation or substitution. So possible values might be
> "direct" and "substitution", perhaps others later on as well. That way,
> users could try alternatives to work out when a given method is faster than
> a different one, and could file bug reports requesting a change of default
> for certain cases.
>
>> This would be as simple as
>>
>> if f.degree()<5:
>>     return generic_univariate_discriminant(f.list())
>>
>> As for the generic function, something like
>>
>> def generic_univariate_discriminant(d):
>>    R = PolynomialRing(ZZ,d,names='a')
>>    a = R.gens()
>>    if d==1: return 1
>>   if d==2: return a[1]^2 - 4*a[0]*a[2]
>>
>>    if d==3: return a[1]**2*a[2]**2 - 4*a[0]*a[2]**3 - 4*a[1]**3*a[3] +
>> 18*a[0]*a[1]*a[2]*a[3] - 27*a[0]**2*a[3]**2
>>
>> (and so on) would do.
>
>
> Hmmm... If we do the case distinction not on degree but on base ring, this
> doesn't look as attractive. Plus my own code would have been particularly
> efficient for sparse polynomials of high degree, since it would only do the
> generic computation for the non-zero terms. Hard-coding a few simple cases
> might still be faster than doing the code I posted for every case, but it
> also might be slower than using cached values. So perhaps we want a case
> distinction on degree to choose between cached polynomials for dense low
> degree cases and on-the fly computation for possibly sparse computation of
> high degree. The former using code like you posted, the latter code like I
> did, and both used for subsequent substitution.
>
> Of course, all of this could as well be discussed on the trac ticket.
>
> --
> You received this message because you are subscribed to the Google Groups
> "sage-support" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to sage-support+unsubscr...@googlegroups.com.
> To post to this group, send email to sage-support@googlegroups.com.
> Visit this group at http://groups.google.com/group/sage-support.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"sage-support" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-support+unsubscr...@googlegroups.com.
To post to this group, send email to sage-support@googlegroups.com.
Visit this group at http://groups.google.com/group/sage-support.
For more options, visit https://groups.google.com/d/optout.

Reply via email to