diff --git a/extra/project-euler/186/186.factor b/extra/project-euler/186/186.factor index 7504e09a81..b86f3675a1 100644 --- a/extra/project-euler/186/186.factor +++ b/extra/project-euler/186/186.factor @@ -1,7 +1,43 @@ -USING: circular disjoint-sets kernel math math.ranges -sequences ; +! Copyright (c) 2008 Eric Mertens. +! See http://factorcode.org/license.txt for BSD license. +USING: circular disjoint-sets kernel math math.ranges sequences ; IN: project-euler.186 +! http://projecteuler.net/index.php?section=problems&id=186 + +! DESCRIPTION +! ----------- + +! Here are the records from a busy telephone system with one million users: + +! RecNr Caller Called +! 1 200007 100053 +! 2 600183 500439 +! 3 600863 701497 +! ... ... ... + +! The telephone number of the caller and the called number in record n are +! Caller(n) = S2n-1 and Called(n) = S2n where S1,2,3,... come from the "Lagged +! Fibonacci Generator": + +! For 1 <= k <= 55, Sk = [100003 - 200003k + 300007k^3] (modulo 1000000) +! For 56 <= k, Sk = [Sk-24 + Sk-55] (modulo 1000000) + +! If Caller(n) = Called(n) then the user is assumed to have misdialled and the +! call fails; otherwise the call is successful. + +! From the start of the records, we say that any pair of users X and Y are +! friends if X calls Y or vice-versa. Similarly, X is a friend of a friend of Z +! if X is a friend of Y and Y is a friend of Z; and so on for longer chains. + +! The Prime Minister's phone number is 524287. After how many successful calls, +! not counting misdials, will 99% of the users (including the PM) be a friend, +! or a friend of a friend etc., of the Prime Minister? + + +! SOLUTION +! -------- + : (generator) ( k -- n ) dup sq 300007 * 200003 - * 100003 + 1000000 rem ; @@ -35,4 +71,7 @@ IN: project-euler.186 : euler186 ( -- n ) 0 1000000 (p186) ; +! [ euler186 ] 10 ave-time +! 18572 ms ave run time - 796.87 SD (10 trials) + MAIN: euler186