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