From 03fa8a4887101563a1cd54f4934d4098c2763008 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer <aaron@elasticdog.com> Date: Fri, 4 Jan 2008 01:40:01 -0500 Subject: [PATCH] Alternate solution to Project Euler problem 25 --- extra/project-euler/025/025.factor | 33 ++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/extra/project-euler/025/025.factor b/extra/project-euler/025/025.factor index 2da1ee6b57..8d75ef5493 100644 --- a/extra/project-euler/025/025.factor +++ b/extra/project-euler/025/025.factor @@ -1,6 +1,7 @@ ! Copyright (c) 2007 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. -USING: kernel math math.parser memoize sequences ; +USING: alien.syntax kernel math math.functions math.parser math.ranges memoize + sequences ; IN: project-euler.025 ! http://projecteuler.net/index.php?section=problems&id=25 @@ -35,6 +36,8 @@ IN: project-euler.025 ! SOLUTION ! -------- +! Memoized brute force + MEMO: fib ( m -- n ) dup 1 > [ 1 - dup fib swap 1 - fib + ] when ; @@ -54,4 +57,30 @@ PRIVATE> ! [ euler025 ] 10 ave-time ! 5237 ms run / 72 ms GC ave time - 10 trials -MAIN: euler025 + +! ALTERNATE SOLUTIONS +! ------------------- + +! A number containing 1000 digits is the same as saying it's greater than 10**999 +! The nth Fibonacci number is Phi**n / sqrt(5) rounded to the nearest integer +! Thus we need we need "Phi**n / sqrt(5) > 10**999", and we just solve for n + +<PRIVATE + +FUNCTION: double log10 ( double x ) ; + +: phi ( -- phi ) + 5 sqrt 1+ 2 / ; + +: digit-fib* ( n -- term ) + 1- 5 log10 2 / + phi log10 / ceiling >integer ; + +PRIVATE> + +: euler025a ( -- answer ) + 1000 digit-fib* ; + +! [ euler025a ] 100 ave-time +! 0 ms run / 0 ms GC ave time - 100 trials + +MAIN: euler025a