Wow!

   ts 'l=:#":nh4 5e8'
0.39239216 54532992
   l
670


R.E. Boss


-----Oorspronkelijk bericht-----
Van: [email protected]
[mailto:[email protected]] Namens Roger Hui
Verzonden: donderdag 7 januari 2010 21:18
Aan: Programming forum
Onderwerp: Re: [Jprogramming] Rosetta code: hamming numbers

nh4 obtained by manipulation of the J code for nthHam
without much understanding of the underlying mathematics. 

nh4=: 3 : 0
 lo=. 0.01 -~ hi=. 1.693-~ 3%:*/6,y,'ln2 ln3 ln5'=. ^. 2 3 5
 k=. i.1+<.hi%ln5       NB. exponents for 5
 m=. 1+<.ln3%~hi-k*ln5
 j=. ;i.&.>m            NB. exponents for 3
 k=. m#k
 r=. >.ln2%~lo-q=. (j*ln3)+k*ln5
 s=. <.ln2%~hi-q
 d=. 0>.1+s-r
 i=. (d#r)+;i.&.>d-.0   NB. exponents for 2
 z=. i,.d#j,.k
 c=. y -~ (#s)++/s
 assert. 0 <: c
 assert. c < #z
 */2 3 5x^c{z\:z+/ .*^.2 3 5
)



----- Original Message -----
From: Roger Hui <[email protected]>
Date: Thursday, January 7, 2010 11:38
Subject: Re: [Jprogramming] Rosetta code: hamming numbers
To: Programming forum <[email protected]>

> The }.z (and }.t) in your code are necessary because
> z and t are initialized incorrectly, engendering extra
> leading rows of 0.  If instead you initialize 
> t=. i.0 5   and   z=. i.0 4  then drops 
> can be removed.
> 
> Anyway I have a non-looping and clearer version 
> that provides a factor of 10 improvement for y=1e6. 
> I will post that version in a little while.
> 
> 
> 
> ----- Original Message -----
> From: Aai <[email protected]>
> Date: Thursday, January 7, 2010 11:21
> Subject: Re: [Jprogramming] Rosetta code: hamming numbers
> To: Programming forum <[email protected]>
> 
> > Correction to make the last assert work correctly:
> > 
> > nthHam=: 3 : 0
> >  lns=. 'ln2 ln3 ln5'=. ^. tdv=.2 3 5
> >  lo=. 0.01 -~ hi=. 1.693-~(*/6,y,lns)^%3
> >  t=.,:0$0
> >  for_k. i. 1+ <. hi % ln5 do.
> >    for_j. i. 1+ <. ln3 %~ hi - p=. k * ln5 do.
> >      t=. t, j,k,(>.ln2%~lo-q),(<.ln2%~hi-
> > q), q=. p + j * ln3
> >    end.
> >  end.
> >  c=. +/ 1 + 3{"1 }. t 
> >  z=.,:0$0
> >  for_r. (#~(2&{ <: 3&{)"1) }. t do.
> >    for_i. ([+i.@>:@-~)/2 3{r do. z=.z, i,(2{.r), 
> > ({:r)+i*ln2 end.
> >  end.
> >  assert. 0 <: c =. c - y
> >  assert. c < # }. z
> >  __ q: inv tdv ,: x: 3 {. c { (\: {:"1) }. z
> > )
> > 
> > It shouldn't be:
> > 
> >    nthHam 31
> > 1
> > 
> > but:
> > 
> >    nthHam 31
> > |assertion failure: nthHam
> > |   c<#}.z
> > 
> > 
> > Anyway, if you dare using it, use nthHam for N>:50000
----------------------------------------------------------------------
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