I don't usually worry much about time and space but here is interesting
thing I found:

   ts=: 6!:2,7!:2
   ts'(,.3*4%~1-~])5^(i.5000x)'
12.7805 4.99247e7
   ts '((0 3+*&5)^:(i.5000))1 0x'
0.125234 2.59924e7
   f=: 13 :'(,.3*4%~1-~])5^i.y'
   f
[: (,. (3 * 4 %~ 1 -~ ])) 5 ^ i.
   ts 'f 5000x'
12.8862 4.95213e7
   g=: 13 :'((0 3+*&5)^:(i.y))1 0'
   g 
3 : '((0 3+*&5)^:(i.y))1 0'
   ts 'g 5000x'
0.0859978 1.48096e6
   h
3 : '((0 3+*&5)^:(i.y))1 0x'
   3 : '((0 3+*&5)^:(i.y))1 0x'
3 : '((0 3+*&5)^:(i.y))1 0x'
   ts 'h 5000'
0.193622 2.59932e7

I found why  g  was so fast. Look at the first few of the 5000 lines in A.

   
   $":(,.3*4%~1-~])5^(i.5000x)
5000 6991
   $":((0 3+*&5)^:(i.5000))1 0x
5000 6991
   
   $":f 5000x
5000 6991
   $":g 5000x
5000 23
   $":h 5000x
5000 6991
   ]A=:g 5000x
...
          _           _
          _           _
          _           _
          _           _
          _           _
          _           _
          _           _
          _           _

Linda

-----Original Message-----
From: programming-boun...@forums.jsoftware.com
[mailto:programming-boun...@forums.jsoftware.com] On Behalf Of Skip Cave
Sent: Thursday, December 20, 2012 6:03 PM
To: programm...@jsoftware.com
Subject: Re: [Jprogramming] arithmetic sequence

Alessandro is concerned about the efficiency of the approaches that were
proposed to his problem. I make the assumption here that he wants the verb
to calculate all the values up to a specific integer in the formula.

Alessandro is worried that the approaches that are proposed may recalculate
the values S(0), S(1), S(2), over and over again, wasting processing time.
This is a typical concern of someone coming from a scalar language
background, when first confronted with matrix and recursive operations in J.
Also he worries that that these proposals may take up a considerable amount
of space during execution. He is asking if any of the solutions that were
proposed to his problem avoid this replication of the calculations.

The best way to answer his question is to program the problem using his
explicit looping approach, and compare that approach with the approaches
proposed by the various members of the forum.

Let's develop an explicit looping approach to solve the problem. Here's
Alessandro's problem coded in a typical explicit scalar looping style:

ac =: 3 : 0
n =. y
a =. 1 0
z =. a
next=.0 3+*&5
while. n > 0 do.
a =. next a
z =. z,a
n =. n-1
end.
(y, 2) $ z
)

Here are some of the other solutions proposed on the forum:
NB. Henry Rich's first proposal
next=:0 3+*&5
hr1 =: 3 : 'y next@]^:(i.@[) 1 0'

NB. Henry Rich's second proposal
next1=: 5&(0 3 + *)
hr2 =: 3 : '(i. y) next1 1 0'

NB. Linda Alford's proposal
la1=: 13 :'y ,.(3*(y-1)%4)'
ans =. la1 5^i. nn

NB. They all get the same answer
   nn =. 20
   (hr1 nn) -: hr2 nn
1
   (hr1 nn) -: la1 5^i. nn
1
   (hr1 nn) -: ac nn
1

NB. So lets see how much time and space they use

   nn =. 20
   ts&>'hr1 nn';'hr2 nn';'la1 5^i.nn';'ac nn'
0.000143973 8128
5.27389e_5 7680
8.85397e_6 1984
0.000201332 3008

Alessandro's explicit loop approach uses about half the space of the worst
case, but takes about three times the processing time. However, Linda's
scheme is by far the best, as it uses less space and time than any other
approach.

Let's make the problem bigger

   nn =. 400
   ts&>'hr1 nn';'hr2 nn';'la1 5^i.nn';'ac nn'
0.00121992 67456
0.00101282 67008
6.58273e_5 19264
0.00347769 10688

Now the explicit looping uses about one-seventh the space as the worst case,
but still takes three times as long to execute. Linda's approach is still
much better.

Let's go even bigger:

   nn =. 5000
   ts&>'hr1 nn';'hr2 nn';'la1 5^i.nn';'ac nn'
0.0403787 938880
0.0389937 938432
0.00243484 295744
0.0200658 256384

Of course we know that, even though the calculations are being done, the
results are all the same after 442 iterations due to the 64-bit precision
limit. In any case, Linda's approach still wins in both categories

It's easy to convert all the verbs into extended precision by simply putting
an 'x' after the initial values in each verb. So we can see what happens
when we calculate some REALLY big numbers.

   nn =. 5000x
   (hr1x nn) -: hr2x nn
1
   (hr1x nn) -: acx nn
1
   (hr1x nn) -: la1 5^i.nn
1

   ts&>'hr1x nn';'hr2x nn';'la1 5^i.nn';'acx nn'
0.0699063 2.64288e7
0.0628555 2.64615e7
7.75595 4.99236e7
2.60534    107328

To make sure:
   _1{hr1x nn
1415962252209634578477123031738811510589509702067886271745966044709273451837
9577047138732343564188389817579469051279306783676415479760629182252191671480
4954482928019439147946719498651658518782306700947825912453640814308711524391
4308334045872358803907166054...
   _1{hr2x nn
1415962252209634578477123031738811510589509702067886271745966044709273451837
9577047138732343564188389817579469051279306783676415479760629182252191671480
4954482928019439147946719498651658518782306700947825912453640814308711524391
4308334045872358803907166054...
   _1{la1 5^i.nn
1415962252209634578477123031738811510589509702067886271745966044709273451837
9577047138732343564188389817579469051279306783676415479760629182252191671480
4954482928019439147946719498651658518782306700947825912453640814308711524391
4308334045872358803907166054...
   _1{acx nn
1415962252209634578477123031738811510589509702067886271745966044709273451837
9577047138732343564188389817579469051279306783676415479760629182252191671480
4954482928019439147946719498651658518782306700947825912453640814308711524391
4308334045872358803907166054...

Well, now the explicit iterative solution wins the space battle by far.
Linda's approach looses the time battle by several orders of magnitude, with
Allessandro's verb not too far behind. . Both Henry's verbs are the winners
in the time battle using extended precision.

This shows why trying to optimize for time and space in a program can be
quite a challenge, and is often more trouble than it is worth. A
programmer's time is almost always much more valuable than a computer's time
or memory space, so getting quickly to the answer usually costs much less
than spending programming time to save computer processing time or memory.
--
Skip Cave
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

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

Reply via email to