[Jprogramming] Function-level programming
Roger Hui
rhui000 at shaw.ca
Wed Feb 28 16:19:52 HKT 2007
The Ackermann benchmark is misleading. Ack made
use of later results in the essay that you cited,
results derived using the much simpler ack .
>From the same results, one could define:
a0=: >:
a1=: 2&+
a2=: 3&+@(2&*)
a3=: 2&^&.(3&+)
a4=: ^/@(#&2)&.(3&+) " 0
a5=: 3 : '^/@(#&2)^:(1+y)&.(3&+) 1' :: _: " 0
ackk=: (a0@])`(a1@])`(a2@])`(a3@])`(a4@])`(a5@])`(_"0) @. [
And then, comparing apples to apples:
(ackk"0 _~ -: Ack"0 _~) 0 1 2 3
1
(ackk"0 _~ -: Ack"0 _~) i.7
1
ts 'Ack"0 _~ 0 1 2 3'
8.99162e_5 3712
ts 'ackk"0 _~ 0 1 2 3'
3.20388e_5 3392
ts 'Ack"0 _~ i.7'
1.36114 19904
ts 'ackk"0 _~ i.7'
0.141217 531776
Regarding Ack. As a courtesy to the reader, one
could define it using components with little if
any loss in efficiency. And if you did define it
using components but posted to the forum the
result of applying f. , you have even less excuse.
f03 =: {::&(<;._1 ' >: 2&+&.(3&+) 2&*&.(3&+) 2&^&.(3&+)')
fx =: '-&3@:(] (' , ] , ')&.(-&3)@:]^:(>:@:[)4:)'"_
f4n =: ] fx^:([-3:) f03 at _1:
Ack1=: (f03 :: f4n)@[ 128!:2 ]
(Ack1"0 _~ -: Ack"0 _~) i.7
1
ts 'Ack1"0 _~ i.7'
1.36694 19904
--------------------------------------
>From Jose Mario Quintana <JoseMarioQuintana at 2BestSystems.Com>
Sent Tuesday, February 27, 2007 2:56 pm
To 'Programming forum' <programming at jsoftware.com>
Subject RE: [Jprogramming] Re: Function-level programming
....
You can find an example of this approach in
http://www.jsoftware.com/pipermail/general/2006-January/026196.html (find
Ackermann close to the end of the message).
(
By the way, one can see that
Ack=. (0&({::) {:: 1&({::)) ::(0&({::) ('-&3@:(] ('"_ , ] ,
')&.(-&3)@:]^:(>:@:[)4:)'"_)@:]^:([ - 3:) _1:
{::1&({::))@:(<@(<;._1@('`'&,)@('>:`(2&+&.(3&+))`(2&*&.(3&+))`(2&^&.(3&+))'"
_))1} ])@:('.'&(] , ;:@:[)@:<)@[ 128!:2 ]
is verbose relative to (
http://www.jsoftware.com/jwiki/Essays/Ackermann%27s_Function ),
ack=: c1`c1`c2`c3 @. (#.@(,&*))
c1=: >:@] NB. if 0=x, 1+y
c2=: <:@[ ack 1: NB. if 0=y, (x-1) ack 1
c3=: <:@[ ack [ ack <:@] NB. else, (x-1) ack x ack y-1
However, although both might be calculating the same output,
ack"0 _/~ 0 1 2 3
1 2 3 4
2 3 4 5
3 5 7 9
5 13 29 61
Ack"0 _/~ 0 1 2 3
1 2 3 4
2 3 4 5
3 5 7 9
5 13 29 61
their methods are quite different,
ts'ack"0 _/~ 0 1 2 3'
0.0633287192 19776
ts'Ack"0 _/~ 0 1 2 3'
0.000315403215 4288
ts'ack"0 _/~ 0 1 2 3 4'
|stack error: c1
ts'Ack"0 _/~ 0 1 2 3 4'
0.00040088894 9088
ts'Ack"0 _/~ 0 1 2 3 4 5 6'
4.78145155 20544
Ack"0 _/~ 0 1 2 3 4 5 6
1 2 3 4 5 6 7
2 3 4 5 6 7 8
3 5 7 9 11 13 15
5 13 29 61 125 253 509
13 65533 _ _ _ _ _
65533 _ _ _ _ _ _
_ _ _ _ _ _ _
)
...
More information about the Programming
mailing list