[Jprogramming] Function-level programming
Jose Mario Quintana
JoseMarioQuintana at 2BestSystems.Com
Thu Mar 1 04:28:45 HKT 2007
> bounces at jsoftware.com] On Behalf Of Roger Hui
> Sent: Wednesday, February 28, 2007 3:20 AM
> To: Programming forum
> Subject: Re: [Jprogramming] Function-level programming
>
> The Ackermann benchmark is misleading. Ack made
> use of later results in the essay that you cited,
> results derived using the much simpler ack .
My first encounter with the Ackermann function was a printout of Susan's
page, ( http://www-users.cs.york.ac.uk/~susan/cyc/a/ackermnn.htm )
handled out to me by Devon McCormick more than a decade ago; ever since I
have enjoyed programming and reprogramming it to test my tacit ideas and
techniques a few times. In Susan's page you can also see the usual
recursive definition and the results that Ack is using.
> >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:
I wrote,
"
However, although both might be calculating the same output,
[... the full context can be found the end of this message]
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
[...]
"
precisely to indicate that they were apples and oranges (I guess my point
was not so clear to everyone). As mentioned above, I coded Ack that way for
my enjoyment; its performance was merely a pleasant side effect surprise.
>
> (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.
As a courtesy to the interested reader without a severe case of arthritis I
included a link,
"
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).
"
where, both, a version using components and its fixed version appear.
(
By the way, the text you referred followed between parentheses.
)
Not withstanding how much I enjoy joggling, I have to re-focus back my full
attention to the markets for a while given yesterday's meltdown.
>
> 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 _ _ _ _ _ _
> _ _ _ _ _ _ _
>
> )
>
> ...
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
More information about the Programming
mailing list