For array arguments we need powH1: powH1=: 4 : '*/ *~^:(I.|.#:y) x'"0
5 ts '3x powH1 10000+i.100' 0.45149128 1724544 5 ts '3x powG 10000+i.100' 0.40380589 1717376 3x (powG-:powH1) 10000+i.100 1 But improvement is possible: powHB=: 4 : '(|."1 #: y) (*/@#) *~^:(i.>.2^.>./y) x' 3x (powHB-:powH1) 10000+i.100 1 5 ts '3x powHB 10000+i.100' 0.19307246 1731712 R.E. Boss > -----Oorspronkelijk bericht----- > Van: [EMAIL PROTECTED] [mailto:programming- > [EMAIL PROTECTED] Namens R.E. Boss > Verzonden: maandag 21 juli 2008 5:21 > Aan: 'Programming forum' > Onderwerp: RE: [Jprogramming] Speeding up dyad ^ for x: results > > In http://www.jsoftware.com/jwiki/Essays/Repeated_Squaring Hui described > this solution already. > > powG=: 4 : 0"0 > if. 0=y do. 1 return. end. > if. 2|y do. x * *: x powG -:<:y else. *: x powG -:y end. > ) > powG1=: 4 : '(*:@]`(x**:@])@.[)/,1x,~2|<[EMAIL PROTECTED]:^:a:,y'"0 > > powH=: 4 : '*/ *~^:(I.|.#:y) x' > > 5 ts '3x powG 100000' > 0.38914173 332672 > 5 ts '3x powG1 100000' > 0.38533968 343680 > 5 ts '3x powH 100000' > 0.43796215 594048 > > 3x (powG-:powH)100000 > 1 > > > R.E. Boss > > > > -----Oorspronkelijk bericht----- > > Van: [EMAIL PROTECTED] [mailto:programming- > > [EMAIL PROTECTED] Namens Arie Groeneveld > > Verzonden: zondag 20 juli 2008 18:35 > > Aan: Programming forum > > Onderwerp: [Jprogramming] Speeding up dyad ^ for x: results > > > > I don't know if this already passed the forum: how to speed up > > exponentiation x^y with y>:0 for integer arguments giving a x: result; > > e.g. if you have to change to x: in case: > > > > y > ([:<.308*%@(10&^.))"0, x > > > > > > ([:<.308*%@(10&^.))"0, 2 > > 1023 > > > > 2^1023 > > 8.988465674e307 > > > > 2^1024 > > _ > > > > 2x^1024 > > 17976931348................ > > > > > > From existing algorithms: > > > > pow=: 4 : 0"0 > > if. 0=y do. 1 return. end. > > if. 2|y do. x * *: x pow -:<:y else. *: x pow -:y end. > > ) > > > > or: > > powi=: 4 : '(*:@]`(x**:@])@.[)/,1x,~2|<[EMAIL PROTECTED]:^:a:,y'"0 > > > > or: > > powt=: ((*:@[$:-:@])`([**:@[$:-:@<:@])@.(2|]))`1:@.(0=])"0 > > > > and: > > pow2=: (*/@:^2x^I.@|[EMAIL PROTECTED]:@])"0 > > > > >From ~help/dictionary/cwhile.htm : > > > > exp =: 4 : 0"0 > > z=.1 > > a=.x > > n=.y > > while. n do. > > if. 2|n do. z=.z*a end. > > a=.*:a > > n=.<.-:n > > end. > > z > > ) > > > > ts '3x ^ 100000' > > 3.138055 362560 > > > > ts '3x pow 100000' > > 1.298968 166464 > > > > ts '3 powi 100000' > > 1.299312 171776 > > > > ts '3x powt 100000' > > 3.138818 209152 > > > > ts '3 pow2 100000' > > 3.716827 576896 > > > > ts '3x exp 100000' > > 3.154187 231680 > > > > > > pow and powi are reasonable candidates. Is there more to gain? > > > > > > =@@i > > > > > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
