Don't let the Euler moderators catch your spoiler,
Boyko!

That said,  I don't recommend reading the following if
you want to solve Euler 73 completely from cold.

FWIW,  the following verb, sumq, seems to run in time
of order O(n) for problem-sizes commensurate with
Problem number 73.

It will of course hit the performance buffers at some
larger scale.

It exploits what I have discovered to be a Möbius
Transform,  a technique which comes in useful in
several Euler problems.

NB. number of coprimes to y in open interval (2y, 3y)
NB. subject to coprimes <: x
sumq =: 3 : 0 " 0
:
lim  =. x <. _1 0 + 3 2 * y
muf  =. mu f =. }. allmufactors y
(-/lim) + +/ muf * -/ <.lim %/ f
)

NB. The totient function, 5&p:, is related,  and should
NB. perhaps be exploited here,  though I couldn't see how
NB. to get the limits right.

NB. Möbius fn mu(n) is
NB.          { 0 if n has one (or more) repeated prime factors
NB.  mu(n) = { 1 if n = 1
NB.          { (-1)^k if n is product of k distinct non-repeated primes
NB.

mu =: 3 : 0
b  =. y > 1
(-.b) + ((#(=*_1^])#@~. )@:q:"0 &.:(b&#)) y
)

NB. Möbius transform:
NB. If an = Sum (over factors d of n) of bd
NB.   then
NB.    bn = Sum (over factors d of n)of mu(n%d) * ad

NB. allmufactors = all factors with non-repeated primes
allmufactors =: ,@>@(*/&.>/)@(<@(1 , */\)/.~)@~.@:q:

Run
    x: +/ sumq >: i. 12000     NB. very nearly a spoiler
to get the required answer in about a second.

It could be probably speeded up, at the cost of more
complexity,  by gradually building up composite
denominators from all primes < 12000, rather than
factoring all numbers <: 12000.

Mike

On 10/10/2011 8:37 PM, Boyko Bantchev wrote:
> 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
>     )
> [solution spoiler removed!]
>
> 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
>

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

Reply via email to