When it's a double recursion you should try using M. .
----- Original Message ----- From: Aai <[email protected]> Date: Thursday, January 28, 2010 7:25 Subject: Re: [Jprogramming] Zumkeller numbers To: Programming forum <[email protected]> > Well it would be nice if someone can explain why this is so much > slower :-) > Is there no short cut by oring recursive calls? > > ik schreef op 28-01-10 15:59: > > sigma(n) is just the sum of the divisors +/divs > > > > This was my first approach of sigmaTest: > > > > sigmtest=: 4 : 0 > > if. 0=x do. 1 return. end. > > if. 0=#y do. 0 return. end. > > if. x < {.y do. x sigmtest }.y > > else. ((x-{.y) sigmtest }.y ) +. x sigmtest }.y end. > > ) > > > > This 'exact' translation makes it probably much slower. > > > > > > > > Thanks > > > > > > > > > > > > Hallo Raul Miller, je schreef op 28-01-10 15:20: > > > >> On Thu, Jan 28, 2010 at 7:11 AM, Aai <[email protected]> wrote: > >> > >> > >>> fact 3: The sigma test. n is a Zumkeller number if and only if > >>> (sigma(n)-2n)/2 is either zero or is a sum of distinct > positive factors > >>> of n excluding n itself. > >>> > >>> > >> What definition of sigma are you using here? > >> > >> I can reverse engineer your code, but that will take a bit > >> of time. > >> > >> > >> > >>> divs=: 13 :'\:~ , > */&>/(^ i.@>:)&.>/__ q: y' > >>> > >>> > >> This can be simplified slightly: > >> > >> divs=: 13 :'\:~ , */&>/(^ i.@>:)&.>/__ q: y' > >> > >> > >> > >>> [1] with this kind of code Haskell seems much faster. Excerpt > >>> > >>> .... > >>> > >>> sigmaTest 0 _ = True > >>> sigmaTest _ [] = False > >>> sigmaTest n (f:fs) > >>> | f > n = sigmaTest n fs > >>> | otherwise = sigmaTest (n-f) fs || sigmaTest n fs > >>> > >>> > >> Here is a literal translation of that into J: > >> > >> sigmaTest=: 4 :0 > >> if. 0=x do.1 return.end. > >> if. 0=#y do.0 return.end. > >> f=.{.y > >> fs=.}.y > >> if. x<f do. x sigmaTest fs return.end. > >> if. (x-f) sigmaTest fs do.1 return.end. > >> x sigmaTest fs > >> ) > >> > >> With this definition, and > >> > >> zumkeller =: 3 : 0"0 > >> s=. +/ fs=. divs y > >> if. (2|s) +. s < +: y do. 0 else. > >> (s&-&.+:y) sigmaTest fs end. > >> ) > >> > >> zumkeller 80010 > >> 1 > >> > >> FYI, > >> > >> > >> > > > > -- > Met vriendelijke groet, > =@@i > > ----------------------------------------------------------------- > ----- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
