Bill Allombert on Fri, 06 Nov 2015 16:29:53 +0100

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: real polynomials

On Fri, Nov 06, 2015 at 02:45:34PM +0000, John Cremona wrote:
> I am so embarrassed at having such trivially elementary questions, so
> let me first say that I do not ask on the list until spending at least
> an hour experimenting and reading the library reference manual.
> If I have a rational polynomial f created by
> GEN f = mkpoln(ncoeffs,g0,g1,g2,g3,g4);
> where the g0, ..., g4 are rationals, and then I do
> GEN fdash = derivpol(f);
> GEN g = ggcd(f,fdash);
> I get a run-time error:
>   ***   incorrect type in Q_divi_to_int (t_FRAC).
> which I do not understand. 

You code is correct so I assume f is not defined properly.
The above code works:

#include <pari/pari.h>
  GEN f, fdash, g;
  f = mkpoln(3,ghalf,gen_2,gen_1);
  fdash = derivpol(f);
  g = ggcd(f,fdash);

> Obstacles to debugging include (1) not knowing how to output a GEN; 

In C do:

inside gdb, you can do
p output(g)
p dbgGEN(g,-1)

> (2) asking for the type (or "typ") of a
> GEN gives a number (both the above have type 10) when I was expecting
> t_POL or similar.

10 is equal to t_POL (it is an enum value).

you can use type_name(10) to convert 10 to the string "t_POL".

> While I am here, in the code above I am clearly defining a polynomial
> of degree 4.  I really want to have polynomials of arbitrary degree
> but can I do that with the mkpoln() function?  i.e. can I replace have
> n separate GEN arguments for the coefficients with a single GEN*
> array?

Probably it is simpler to start with a vector and the convert it to a polynomial.
You need to allocate a vector with cgetg(...,t_VEC), and then fill it.

long n = ...
GEN V = cgetg(n+1,t_VEC);
for(i=1; i<=n; i++)
  gel(V,i) = ...
P = gtopolyrev(V, 0);

you can always use gp2c to generate example of C code.