Project Euler
Mick Collins
mickclns at mac.com
Thu Feb 25 15:13:18 EST 2010
First, thanks, Andre for starting the thread and turning us / me onto the Euler Project.
I enjoy implementing algorithms, but math is fun, too!
Since Euler was a mathematician, how about a more mathematical approach.
I haven't seen these approaches yet in my quick scan of the posts, so I will put them out there:
For the first problem
*********** mathematical note
The number of natural numbers below X that are divisible by 3 or 5 is:
the number divisible by 3, plus the number divisible by 5, minus the number divisible by 15 (since these number have already been counted twice).
For combining in a more general fashion, i.e. other than 3 and 5, rather than using the multiple you would use the Least Common Multiple (not implemented here). For instance, if you wanted the number divisible by 6 or 4, you would use numdiv(4) + numdiv(6) - numdiv(12), since if you used numdiv(24) you would miss subtracting off many numbers divisible by both 4 and 6 but not by 24 (12*1, 12*3, 12*5 ...)
Here is a testing routine, followed by a generalization of the problem (no error correction). For the testing routine, as soon as you are satisfied that it works as advertised, hold the shift key to jump out of the loop. Then it will display the results of divisibility by 3 or 5.
on doTest
repeat until the shiftkey is down
ask "X" with 1000
put it into X
ask "N" with 3
put it into N
answer "<= or plain <" with "Eq" or "NoEq"
put it into EorNo
put numOfNumsBelowXandDivisByN(X,N,EorNo) into theResult
if EorNo is "NoEq" then
put "Number < [[X]] and divisible by [[N]] is [[theResult]]." into mergeStr
else
put "Number <= [[X]] and divisible by [[N]] is [[theResult]]." into mergeStr
end if
answer merge(mergeStr)
end repeat
put 1000 into X
put "NoEq" into EorNo
put 3 into N
put numOfNumsBelowXandDivisByN(X,N,EorNo) into theResult3
put 5 into N
put numOfNumsBelowXandDivisByN(X,N,EorNo) into theResult5
put 15 into N
put numOfNumsBelowXandDivisByN(X,N,EorNo) into theResult15
put "Number < [[X]] and divisible by 3 or 5 is " & \
"[[theResult3 + theResult5 - theResult15]]." into mergeStr
answer merge(mergeStr)
end doTest
function numOfNumsBelowXandDivisByN X,N, EqOrNoEq
put X into X_
put X_ mod N into XmodN
-- X div N will be the number returned EXCEPT ...
if EqOrNoEq = "NoEq" and XmodN = 0 then -- X divisible by N and it matters
subtract 1 from X_ end if
return X_ div N
end numOfNumsBelowXandDivisByN
For the second problem
******************
The even Fibonacci numbers form a Fibonacci-like sequence
E(1) = 0, E(2) = 2, for n>2: E(n) = 4E(n-1) + E(2)
0, 2, 8, 34, 144, 610, 2584, etc.
Also, the sums of the even Fibs form a slightly less Fibonacci-like sequence
S(1) = 0, S(2)=2, S(3) = 10, for n>3: S(n) = 5*S(n-1) - 3*S(n-2) - S(n-3)
0, 2, 10, 44, 188, 798, 3382, etc.
There may be an even more direct approach to one or both of these sequences
(I don't know if there is), such as with the plain vanilla (no offense intended) Fibonacci sequence.
The i-th member of the sequence is:
(g^i-(-1/g)^i) / rt5 where rt5 is the square root of 5 and g is the golden ratio: ( (1+rt5)/2 ).
So that sequence can be calculated explicitly (rather than recursively).
In the testing routine, I start by displaying the explicit calculation of the first
8 members of the Fibonacci sequence
Then the recursive method of the even Fibs, keeping track of the sums.
Then the recursive method of the sums, only using the even Fibs, by calculation
to test whether to stop.
on doTest
put sqrt(5) into rt5
put (1+rt5)/2 into g
repeat with i = 1 to 8
put (g^i-(-1/g)^i) / rt5 into theF
answer theF
end repeat
-- even Fibs sums by first method
answer "First Method"
put 2 into F1
put 8 into F2
put 10 into theSum
repeat while F2 <= 4000000
put 4*F2 + F1 into newFib
add newFib to theSum
put F2 into F1
put newFib into F2
end repeat
answer "Fib" && F1 & ", Sum" && theSum
answer "Second Method"
put 0 into S1
put 2 into S2
put 10 into S3
repeat while S3 - S2 <= 4000000
put 5*S3 - 3*S2 - S1 into newFib
put S2 into S1
put S3 into S2
put newFib into S3
end repeat
answer "Sum" && S3
end doTest
I'd welcome any comments on these.
>Date: Tue, 23 Feb 2010 13:28:37 -0300
>From: Andre Garzia <andre at andregarzia.com>
>Subject: Project Euler
>To: How to use Revolution <use-revolution at lists.runrev.com>
>Message-ID:
> <7c87a2a11002230828ia2f0ff1s399ab3ae1b2d0c01 at mail.gmail.com>
>Content-Type: text/plain; charset=ISO-8859-1
>
>Hi There Folks,
>
>I don't know if you guys are familiar with http://www.projecteuler.net which
>is officially a very fun project according to my own concepts of fun. It is
>a repository of mathematical problems which require more than simple math to
>solve, it usually require some programming. You can go solving your problems
>and getting scores. I just solved the first one in Rev.
>
>"Add all the natural numbers below one thousand that are multiples of 3 or
>5."
>
>Now, the second one is giving me trouble... rsrsrsrs
>
>"Find the sum of all the even-valued terms in the Fibonacci sequence which
>do not exceed four million."
>
>I think I am going to reach the upper limits of rev math with it.
>
>:D
>
>--
>http://www.andregarzia.com All We Do Is Code.
>
>
>
More information about the use-livecode
mailing list