| John Cremona on Thu, 22 Jan 2026 22:19:29 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: polred and variants |
Thanks Karim, You answered all my questions. (I do understand the difference between | and ||, that was just a slip.) I'm not even sure that I need the ring of integers. (The fields in question are the Hecke eigenvalue fields of Bianchi modular forms, by the way). When I searched through the pdf manual I did not notice that I reached a section on obsolete functions (yes, I see that the section heading is on the same page...). But it is still true that there is no documentation in this manual for any non-obsolete *polred* functions. One suggested improvement to the gp documentation for nf_ORIG: it seems to me that the second thing returned by the nf_ORIG flag is Mod(a,P) and not a itself: in the code I have to use lift() to get the polynomial. John On Thu, 22 Jan 2026 at 17:30, Karim Belabas <Karim.Belabas@u-bordeaux.fr> wrote: > > Hi John, > > * John Cremona [2026-01-22 16:05]: > > In the manual https://pari.math.u-bordeaux.fr/pub/pari/manuals/2.18.1/libpari.pdf > > there are mentioned a whole lot of functions called 'polred' with > > various prefixes and suffixes. In fact the string 'polred' appears 20 > > times, all on p.327 or in the index. > > > > None of these have any documentation at all, except for the comment on > > p.327 "use polredbest" -- but polredbest is not referred to anywhere > > else in the manual. > > You mean the section "13.1.32 Obsolete routines" ? > > Their common documentation, as already suggested by the section title, is > > "Still provided for backward compatibility, but should not be used in new > programs. They will eventually disappear." > > > Please may we add documentation for some or all these functions to > > this manual? > > The idea is not to use them anymore. You can do the same or better using > documented functions. > > > I have a C program where I successfully use both both > > plain polredabs() which juIs there any documentation anywhere st > > returns one reduced polynomial, and also polredabs0() with flag > > nf_ORIG which also returns a polynomial giving one root in terms of > > the other. That is useful. From gp I can see documentation using > > ??polredabs which says that the library function is called > > polredabs0(), but does not mention polredabs() in the library -- > > should I stop using that but use polredabs0() with flag=0? > > Yes, it's cleaner. > > > I know about polredbest() but my polynomials have small degree and > > polredabs is fast for them. > > As you wish. If you really know what you are doing, then fine. > > > I currently use flag nf_ORIG but am > > about to start to use nf_ADDZK so that I also get the integral basis. > > I think that to get both the nf_ORIG polynomial I need to use as flag > > nf_ORIG||nf_ADDZK (is that right?) > > No. Binary or (= single |) not boolean or : > > nf_ORIG | nf_ADDZK > > But the gp documentation is out of date: the nf_ADDZK flag was removed > in 2018. The modern way nowadays, as mentioned in ??polredabs and fully > documented in ??nfinit, is to call your functions (polred, nfinit, etc.) > with input [P, nfbasis(P)] rather than trying to obtain the integer > basis as a byproduct of various operations in cryptic/inconsistent ways. > > By the way, if your polynomials are so small than polredabs is acceptably fast, > I wouldn't bother, though. Chances are the time needed to recompute the > integral basis is negligible. Please test. > > > and the output will be of the form > > [[reduced-poly, root_poly], [list of integral basis]]. Again, is that > > right? > > Not anymore, see above. > > > The gp flags are differernt from the library flags (only numerical 1 > > and 4 not the symbolic nf_ORIG etc.) > > Yes. The gp flags are bad: cryptic and less flexible. Use a combination > of symbolic flags (or-ing properties attached to powers of 2 is standard C > practice, not a libpari quirk). All this is documented in the gp users's > manual, where all the math is explained. This is a general decision with > respect to documentation : gp user's manual should document all > mathematical features and the libpari user manual does not re-document > anything that was there to avoid massive duplication (and out-of-synch doc). > > ------------------- > The library syntax is GEN polredabs0(GEN T, long flag). Instead of the above > hardcoded numerical flags, one should use an or-ed combination of > > * nf_PARTIALFACT (OBSOLETE): possibly use a suborder of the maximal order, > without attempting to certify the result. > > * nf_ORIG: return [P, a], where Mod(a, P) is a root of T. > > * nf_RAW: return [P, b], where Mod(b, T) is a root of P. The algebraic integer > b is the raw result produced by the small vectors enumeration in the maximal > order; P was computed as the characteristic polynomial of Mod(b, T). Mod(a, P) > as in nf_ORIG is obtained with modreverse. > > * nf_ALL: return a vector of results of the above form, for all polynomials of > minimal T_2-norm. > ------------------- > > What would you suggest to improve there ? > > Cheers, > > K.B. > -- > Pr. Karim Belabas, U. Bordeaux, Vice-président en charge du Numérique > Institut de Mathématiques de Bordeaux UMR 5251 - (+33) 05 40 00 29 77 > http://www.math.u-bordeaux.fr/~kbelabas/