zumkeller5 =: 3 : 0 " 0 
 s=. y -~-:{. sd=: +/\. d=: divs y      
 if. (1|s) +. s < 0 do.0 return.end.
 if. 0=s do.1 return.end.
 z=. (d,:sd) ([ T1^:(0>{...@])^:_ T0^:((2<#...@])*. 0<{...@])^:_)^:_ (d,:sd) T0
s,{.d
 if. (0={.z) do. 1 else. 0 end.
)

T0=: 4 : 0
 'd sd'=. x
 'y0 y1'=. ({. ; 1 { ])y
 p=:(y1 > d) *. (y0 <: sd) *. y0 >: d
 if. +./p do. (y0-t), (t=. {. p # d) , }.y
 else. _1 , y end.
)

T1=: 4 : 0      NB. _1={.y
 'd sd'=. x
 if. 2>#}.y do. }.y return. end.
 'y0 y1'=. (([:+/ 2{.]) ; 1 { ]) }.y
 p=:(y1 > d) *. (y0 <: sd) *. y0 >: d
 if. +./p do. (y0-t) , (t=. {. p # d) , 3 }. y
 else. _1 , y0 , 3 }. y end.
)

zumkeller5 is much leaner and for large numbers faster:

   ('zk4c';'zk5') dspl rnkng scores 'zumkeller4c 6+i.4995';'zumkeller5
6+i.4995'
+----+----+-----+----+----+
|verb|rank|et*sz|time|size|
+----+----+-----+----+----+
|zk4c| 1  |1.07 |1.00|1.32|
+----+----+-----+----+----+
|zk5 | 0  |1.00 |1.23|1.00|
+----+----+-----+----+----+

   (zumkeller4c -: zumkeller5) 6+i.4995
1

   ('zk4c';'zk5') dspl rnkng scores 'zumkeller4c 1e6+i.2000';'zumkeller5
1e6+i.2000'
+----+----+-----+----+-----+
|verb|rank|et*sz|time|size |
+----+----+-----+----+-----+
|zk4c| 1  |48.07|2.08|23.08|
+----+----+-----+----+-----+
|zk5 | 0  | 1.00|1.00| 1.00|
+----+----+-----+----+-----+

   (zumkeller4c -: zumkeller5) 1e6+i.2000
1


With a slight modification one can get a partition of the divisors:

zumkpart5 =: 3 : 0 " 0
 s=. y -~-:{. sd=: +/\. d=: divs y      NB. divisors & sums of divisors
 if. (1|s) +. s < 0 do.$0 return.end.
 if. 0=s            do.y ; d -. y return.end.
 z=. (d,:sd) ([ T1^:(0>{...@])^:_ T0^:((2<#...@])*. 0<{...@])^:_)^:_ (d,:sd) T0
s,{.d
 if. (0={.z) do. (}.z);d-.z else. $0 end.
)

   (zumkpart5,.<"0) (#~zumkeller5) 6+i.45
+-------+---------------+--+
|6      |3 2 1          |6 |
+-------+---------------+--+
|2 12   |6 4 3 1        |12|
+-------+---------------+--+
|1 20   |10 5 4 2       |20|
+-------+---------------+--+
|6 24   |12 8 4 3 2 1   |24|
+-------+---------------+--+
|28     |14 7 4 2 1     |28|
+-------+---------------+--+
|6 30   |15 10 5 3 2 1  |30|
+-------+---------------+--+
|5 40   |20 10 8 4 2 1  |40|
+-------+---------------+--+
|6 42   |21 14 7 3 2 1  |42|
+-------+---------------+--+
|2 12 48|24 16 8 6 4 3 1|48|
+-------+---------------+--+


R.E. Boss


> -----Oorspronkelijk bericht-----
> Van: [email protected] [mailto:programming-
> [email protected]] Namens R.E. Boss
> Verzonden: zaterdag 6 februari 2010 18:43
> Aan: 'Programming forum'
> Onderwerp: Re: [Jprogramming] Zumkeller numbers
> 
> zumkeller3 is wrong, it gives false positives.
> This was pointed out by =@@i in providing non-zk numbers:
> 
>    +/zumkeller3 748 7544 10184 56816 61904 62416 66928 69488 73616 85626
> 100962 102416
> 2
> 
> 
> the next is a more correct version.
> 
> zumkeller4c =: 3 : 0 " 0      NB. line wrap!
>  s=. y -~-:{. sd=. +/\. d=. divs y
>  if. (1|s) +. s < 0 do.0 return.end.
>  if. 0=s            do.1 return.end.
>  z=. {. (d,:sd)([: |:@~.@; ({...@[ <@((- ,. ]) d #~ ])"0 1 ({:@[ >/
> {...@])*.({...@[ <:/ {:@])*.(>:/&{.)))~ ^:((*./@:*...@$@])*. [: -.@(+./) ,@[ 
> e.~
> {...@])^:_ s,:y
>  if. 0<#z do. 1 else. 0 end.
> )
> 
>    +/zumkeller4c 748 7544 10184 56816 61904 62416 66928 69488 73616 85626
> 100962 102416
> 0
> 
>    ('zk';'zk2';'zk4c')dspl rnkng scores 'zumkeller 6+i.4995';'zumkeller2
> 6+i.4995';'zumkeller4c 6+i.4995'
> +----+----+-----+-----+----+
> |verb|rank|et*sz|time |size|
> +----+----+-----+-----+----+
> |zk  | 2  |13.64|11.41|1.20|
> +----+----+-----+-----+----+
> |zk2 | 1  |12.55| 3.42|3.67|
> +----+----+-----+-----+----+
> |zk4c| 0  | 1.00| 1.00|1.00|
> +----+----+-----+-----+----+
> 
>    2-:/\(zumkeller 6+i.4995),(zumkeller2 6+i.4995),:zumkeller4c 6+i.4995
> 1 1
> 
> zk4c scales rather well:
> 
>    ('500';'2000')dspl rnkng scores 'zumkeller4c 1e6+i.500';'zumkeller4c
> 1e6+i.2000'
> +----+----+-----+----+----+
> |verb|rank|et*sz|time|size|
> +----+----+-----+----+----+
> |500 | 0  |1.00 |1.00|1.00|
> +----+----+-----+----+----+
> |2000| 1  |3.39 |3.36|1.01|
> +----+----+-----+----+----+
> 
> 


----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to