Igor Schein on Sun, 4 May 2003 03:06:31 -0400 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: polredabs() suggestion |
On Wed, Apr 30, 2003 at 01:12:25PM +0200, Karim BELABAS wrote: > On Wed, 30 Apr 2003, Bill Allombert wrote: > > On Tue, Apr 29, 2003 at 05:53:15PM -0400, Igor Schein wrote: > >>> P.S: I could "mark" the previous generator, so that the check is not done > >>> many times on the same element, and it is just accepted as is, provided it > >>> passes the test once. With current settings that means < 0.5% savings. I > >>> didn't bother. > >> I feel very strongly that this would show a significant improvement on > >> the polynomials I've had problems with, e.g. > >> > >> x^8-97418273277417164826810*x^4-97418273278115084139045*x^2+97418273278115084139045 > >> > >> ( from one of my older postings ). > >> > >> So if there's no performance penalty for an average case ( which I > >> don't forsee ), it's a change I would more than welcome. > > > > I am with Igor here. I have made a lot a similar tweaking in galoisinit. > > While it seems wasteful in normal case, it can make a large difference > > on catastrophical case. And usually catastrophical case are the more > > interesting. > > > > For example you could keep a 'top 10' list of generators that appear the > > most often and compare with them before the other test. If it is found, you > > reorder them. > > It wouldn't work. The problem is that polredabs insists on finding the _best_ > generator (wrt to T2-norm), so it has to check and delete all the smaller > vectors that do not generate the field. Assume you see 10^3 "sorting..." > messages; that means 2.10^5 checks. Out of these at most 10^3 + 200 were > successful, and could (possibly) have been saved. > > One minor improvement I see is to remove the (IMHO silly) flag polredabs(,4), > and the (undocumented) feature that the polynomial with smallest discriminant > for a given minimal T2-norm is output. Then at least we do not have to keep > _all_ the best generators so far. A single one would be enough, in effect > increasing the cache. [ Directly increasing the cache also would be a minor > improvement. ] If it's gonna fix the current woes right away, then I'm all for it. Besides, returning a vector contradicts the idea of polynomial canonization anyway. > > Again, the only significant improvements would be to > 1) rewrite the backtracking so that smallest vectors are found first. > > 2) find an efficient algorithm to determine the largest subset of basis > that still only generate a subfield [ "skipfirst" pruning ]. > > 3) add user-defined (flag-driven) limits to bottom out of the recursion when > too much time is spent. > > Item 3) would certainly be the most useful one. I think the other two are no less important. The 3rd one just adds flexibility, it's not an algorithm impovement per ce. To be honest, I would like to see the user be able to specify a different comparison criteria, like poldisc(pol), or #Str(pol), or even vecsort(abs(Vec(pol)),,4)[1], all of them being as inexpensive as current norml2(polroots(pol)). Wishful thinking, I guess :) > > No time for this, unfortunately... I hope it won't always be the case :) Igor