Dan's timespacex explanation would make a great addition to the NuVoc's Vocabulary/Foreigns entry, linked off of the time and space definitions.
Skip Skip Cave Cave Consulting LLC On Tue, Jun 10, 2014 at 10:37 AM, Dan Bron <[email protected]> wrote: > Alex Giannakopoulos wrote: > > Which of these two is the more efficient (if there's any difference) > > As Kip and Linda pointed out, the dyadic valence of ^. provides for > arbitrary bases. So one would assume 10&^. would be most efficient. > > > is there any way way mere mortals can tell? > > But how can we test that assumption? There are a couple of foreign verbs > that measure the time & space utilization of a sentence. > > time =: 6!:2 > space =: 7!:2@:] NB. @:] because 7!:2 is a monad, and 6!:2 is > a > dyad > timespacex=: time , space > > expInv =: ^inv > divLog =: %&^.~ NB. Nice use of & BTW. > log =: ^. > > D =: 1e3 %~ 4e6 ? 1e7 NB. Important to build argument outside of > timed code > E =: '10 expInv D';'10 divLog D';'10 log D' NB. expressions as > strings > > TS =: 10 timespacex&> E NB. Average over 10 runs (for time, not space) > > '0.2f' 8!:2 (%"1 <./) TS NB. Most efficient expression scores a 1; worse > scores are multiples of that. > 1.00 2.00 > 14.23 1.00 > 1.11 2.00 > > Here, we see ^. and ^ ^:_1 are essentially the same, which is unsurprising, > because > > ^ b._1 NB. How is ^'s inverse calculated? > ^. > > Log is literally the inverse of exp. The more interesting result is that > while %&^. is an order of magnitude slower than ^. , it consistently takes > only half the space. I have no idea why, but these kinds of tests have, > historically, revealed opportunities for improvement to the interpreter. > > > Further, if I only wanted to find the order of a given +ve integer > > would it be better to do <. @ log10 (or <. @ logb10) > > or something like: <:@#@(10&#. inv) > > Just as above, we can use 6!:2 and 7!:2 to measure & compare these > approaches, but I'll leave that as an exercise. I will note that, as you > noticed, #.^:_1 already calculates the order of y relative to x . How? > Why, let's just ask! > > 10&#. b._1 > ($&10@>:@(10&(<.@^.))@(1&>.)@(>./)@:|@, #: ]) :.(10&#.) > > Which (as you can see) is largely concerned with the calculation of said > magnitude. To externalize that calculation and make it reusable, we might > distill it thus: > > NB. Special code indicates <.@^. is recognized but <.@:^. isn't, which > would otherwise be preferred > fbase =: <.@^. > > NB. Number of Digits Required in base x to represent maximal magnitude > in y > ndr =: 10&$: : (>:@:fbase 1 >. |@:,) > > Here, x can be any base (haxadecimal, binary, etc, though decimal is the > default for the monad), and y can be any array of integers. In particular, > y can contain positives, negatives (hence |), and even zero (hence 1 >. ), > and ndr will produce the number of digits required to represent the > number(s) with the greatest magnitude, and thus the minimum number of > digits required to represent any value in y in the base x. > > -Dan > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
