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);
  n=gadd(gpowgs(gen_2,128),gen_1);
  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.