Karim Belabas on Sun, 30 May 2004 13:15:55 +0200


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

Re: sigma


* Bill Allombert [2004-05-30 12:58]:
> On Sun, May 30, 2004 at 12:18:57PM +0200, Karim Belabas wrote:
> > * Jon Perry [2004-03-22 17:10]:
> > > ? sigma(4,1.5)
> > >   ***   this should be an integer: sigma(4,1.5)
> > >                                            ^----
> > You may use something like
> > 
> > SIGMA(n, k) = 
> > { local(R, S, f, pk); 
> >   R = 1; f = factor(n);
> >   for (i = 1, matsize(f)[1],
> >     pk = f[i, 1]^k; S = 1 + pk; 
> >     for (j = 2, f[i, 2], S = 1 + pk*S);
> >     R *= S
> >   ); R 
> > }
> > 
> > it's about 2 to 10 times slower than the built-in sigma [ for smooth n ! ].
> > The latter makes heavy use of immediate small integers which is tough to
> > emulate in GP.
> 
> Much simpler, just use sumdiv
> SIGMA(n, k)=sumdiv(n,d,d^k)

I considered this at first, but it's much slower and less robust:

(13:05) gp > n = round( prodeuler(p = 2, 70, p) )
%1 = 7858321551080267055879090

(13:05) gp > for (i=1,1000, SIGMA(n,2))  \\ my routine
time = 910 ms.

(13:05) gp > for (i=1,1000, sigma(n,2))
time = 40 ms.

(13:05) gp > sumdiv(n, d, d^2);   \\ default stack
  ***   the PARI stack overflows !  

(13:07) gp > sumdiv(n, d, d^2);   \\ 80MB stack
time = 10,960 ms.

    Karim.
-- 
Karim Belabas                     Tel: (+33) (0)1 69 15 57 48
Dep. de Mathematiques, Bat. 425   Fax: (+33) (0)1 69 15 60 19
Universite Paris-Sud              http://www.math.u-psud.fr/~belabas/
F-91405 Orsay (France)            http://pari.math.u-bordeaux.fr/  [PARI/GP]