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