| 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>
int
main(void)
{
GEN f, fdash, g;
pari_init(8000000,500000);
f = mkpoln(3,ghalf,gen_2,gen_1);
fdash = derivpol(f);
g = ggcd(f,fdash);
pari_printf("g=%Ps\n",g);
pari_close();
}
> Obstacles to debugging include (1) not knowing how to output a GEN;
In C do:
pari_printf("g=%Ps\n",g);
inside gdb, you can do
p output(g)
or
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.
GEN P;
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.
Cheers,
Bill.