Here is a solution that runs in constant space and is linear in
the number of fractions that it finds (it actually only computes
the denominators, one after another from 1/3 to 1/2).

   f =: 3 : 0
     i =. 0
     'a b' =. 3,y-3|>:y
     while. b>2 do.
       'a b' =. b,a-~b*<.(y+a)%b
       i =. >:i
     end.
     i
   )

   f 12000
7295372

The problem is that it is very slow for 12000: almost 2 min on my
computer.  A recursive rephrasing, such as

   N =: 12000
   fr =. [`(>:@[$:({:,{.-~{:*<.@(N&+@{.%{:))@])@.({:@]>2:)
   0 fr 3,N-3|>:N

should be somewhat faster, but it miserably runs out of stack
already at N=190 (while I was hoping fr to be treated as tail-
recursive and execute in constant space.)
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to