Bill Allombert on Fri, 09 Dec 2005 10:26:15 +0100

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

 Re: Factoring with Pari

```On Fri, Dec 09, 2005 at 02:39:32AM +0100, Alessio Rocchi wrote:
> After having solved my previous problem (i finally decided to migrate to
> linux), i'm here to ask again for help.
Good move!

> The problem is the following: I need to write C code (using Pari, of
> course) whose result is that of decompose an integer in its prime factors.
> Under GP shell, i can simply write FACTOR(<int>).

factor(<int>) rather... uppercase are deprecated since seven years.

> I tried to write a C function to do it,  but it seems to be really
> difficult (i began using Pari only two days ago...).
> May anyone help me (also posting an example, if possible)?

This one is very easy. This example will factor 2^128+1 and display the
result as a product.

#include <pari/pari.h>
int main(void)
{
GEN n,F;
long i;
pari_init(4000000,2);
F=factor(n);
pariputsf("%Z = ",n);
for(i=1;i<lg(F[1]);i++)
pariputsf("%Z^%Z ",gcoeff(F,i,1),gcoeff(F,i,2));
pariputsf("\n");
}

For more complex examples, try the GP2C compiler. It will generate
example PARI code at will from the GP code. For example if you
feed it with
func()=
{
local(n,F);
n=2^128+1;
F=factor(n);
print1(n," = ");
for(i:small=1,#F[,1],
print1(F[i,1],"^",F[i,2]));
print()
}

you get

void
func(void)        /* void */
{
GEN n, F;
long l1;
n = gaddgs(gpowgs(gen_2, 128), 1);
F = factor(n);
pariputsf("%Z = ", n);
l1 = glength(gel(F, 1));
{
long i;
for (i = 1; i <= l1; ++i)
pariputsf("%Z^%Z", gcoeff(F, i, 1), gcoeff(F, i, 2));
}
pariputsf("\n");
return;
}

Cheers,
Bill.

```