Karim BELABAS on Tue, 16 Nov 1999 13:04:48 +0100 (MET) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Coefficients of Polynomials |
[Annegret Weng:] > I would like to use the Pari-Library. I read through the User's Guide and > then I tried to write a small C++-program. It turned out that I still > don't know how to build a polynomial, more precisely how to assign values > to the coefficients of a polynomial. > Can anyone help me? I think a small sample program would be very helpful. Well, the library itself is a nice sample code... If the coefficients already exist in an object x somewhere (e.g are the entries of a PARI vector), you can use gtopoly(x, v) [ correspond to Pol() under GP ] To avoid chicken-egg recursion, here's how you do it "from basic principles": the following snippet creates x^4 + 7x^3 + 2*x [ I assume you use version 2.0.* ] { const long deg = 4; const long var = 0; /* x */ GEN pol = cgetg(deg+3, t_POL); /* cgetg fills in the first codeword */ /* fill the second codeword */ pol[1] = evalsigne(1) | evalvarn(var) | evallgef(deg+3); pol[2] = (long)stoi(0); /* start from lowest degree term */ pol[3] = (long)stoi(2); pol[4] = (long)stoi(0); pol[5] = (long)stoi(7); pol[6] = (long)stoi(1); } [ I could have used gun and gzero instead of stoi(1) and stoi(0) respectively, and lstoi instead of (long)stoi ] You can make it look nicer by using another pointer for the coefficients: { const long deg = 4; const long var = 0; GEN pol = cgetg(deg+3, t_POL); GEN *P = (GEN*) (pol+2); pol[1] = evalsigne(1) | evalvarn(var) | evallgef(deg+3); P[0] = stoi(0); P[1] = stoi(2); P[2] = stoi(0); P[3] = stoi(7); P[4] = stoi(1); } Another possibility is to build the polynomial from different pieces, starting from polx[var], but it's _much_ slower. It works nicely for recursively defined polynomials [ I use the same polynomial; for a non-trivial example, see cyclo() in src/basemath/bibli2.c ] /* Inefficient, ugly, and only meant to examplify basic principles. If you * want efficient code, look at the library sources */ { const long var = 0; /* x */ const long ltop = avma; /* record stack pointer */ GEN pol, X = polx[var]; pol = gpowgs(X,4); pol = gadd(pol, gmulsg(7, gpowgs(X,3))); pol = gadd(pol, gmulsg(2, X)); pol = gerepileupto(ltop, pol); /* clean up accumulated garbage */ } Hope this helps, Karim. P.S: Since you intend to program in C++, it should be trivial to overload operators so as to write the above simply as pol = X^4 + 7*X^3 + 2*X Corresponding C++ wrappers have even be written by various people, but (I believe) never widely distributed. You can have a look at http://www.math.u-bordeaux.fr/~papanik/pali.html [PaLi also implements automatic garbage collection, at the expense of some efficiency]. I don't share all the goals expressed in the page above, but the project itself was interesting. It more or less died when Thomas left Bordeaux, unfortunately. __ Karim Belabas email: Karim.Belabas@math.u-psud.fr Dep. de Mathematiques, Bat. 425 Universite Paris-Sud Tel: (00 33) 1 69 15 57 48 F-91405 Orsay (France) Fax: (00 33) 1 69 15 60 19 -- PARI/GP Home Page: http://hasse.mathematik.tu-muenchen.de/ntsw/pari/