Karim Belabas on Sun, 30 May 2004 12:36:53 +0200


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

Re: sigma


* Jon Perry [2004-03-22 17:10]:
> ? sigma(4,1.5)
>   ***   this should be an integer: sigma(4,1.5)
>                                            ^----
> 
> ? ?sigma
> sigma(x,{k=1}): sum of the k-th powers of the divisors of x. k is optional
> and
> if omitted is assumed to be equal to 1.
> 
> Is there a technical reason for k being an integer?

Speed and backward compatibility mostly [ k is a C-long integer in library
code ]. Allowing general exponents would require duplicating a significant
amount of source code, and I see no real application for it.

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.

Hope this helps,

    Karim.

P.S: I have fixed the documentation in CVS
-- 
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]