On Mon, 11 May 2015 21:15:31 +0000 Dzhon Smit via Digitalmars-d <digitalmars-d@puremagic.com> wrote:
> Just in case you wonder, here's a comparison of the Fibonacci > numbers. The D code was written by Dennis Ritchie (a user of > this forum, not the guy who invented C). > > [code]import std.stdio, std.bigint; > > void main() { > > BigInt[] fib1, fib2; > BigInt last = 0, next = 1; > > int n = 100000; > > int i; > while (i != n) { > fib1 ~= last, last = next, next += fib1[$ - 1]; > ++i; > } > > i = 0, last = 0, next = 1; > while (i != n) { > fib2 ~= last, last = next, next += fib2[$ - 1]; > ++i; > } > > BigInt sumFib1; > foreach (e; fib1) { > sumFib1 += e; > } > > BigInt sumFib2; > foreach (e; fib2) { > sumFib2 += e; > } > > writeln(sumFib2 - sumFib1); // 0 > }[/code] > [code];;;; fib.lisp > (defun main () > (let ((n 100000)) > (let ((fib1 (do ((i 0 (incf i)) > (last 0 next) > (next 1 (+ next last)) > (fib '() (cons last fib))) > ((= i n) (nreverse fib)))) > (fib2 (do ((i 0 (incf i)) > (last 0 next) > (next 1 (+ next last)) > (fib '() (cons last fib))) > ((= i n) (nreverse fib))))) > (let ((sum-fib-1 (loop :for e :in fib1 :sum e)) > (sum-fib-2 (loop :for e :in fib2 :sum e))) > (- sum-fib-2 sum-fib-1))))) > > (format t "~D~%" (main))[/code] > > Tests on my machine: > [code]$ time ./fib > 0 > > real 0m6.458s > user 0m2.250s > sys 0m0.933s > $ time sbcl --dynamic-space-size 4GB --script fib.lisp > 0 > > real 0m1.884s > user 0m1.290s > sys 0m0.260s[/code] > > [quote]Email address > > When posting, you need to indicate an email address. It doesn't > need to be a valid one; this software will not send anything to > the specified address. The email address will be made public to > other users of the news server / mailing list you are posting to. > Therefore, please be aware that malicious robots may be able to > collect your address and send spam to it.[/quote] > > This is quite disappointing, I'd prefer spam from this forum > rather than from elsewhere. On my machine this is much faster import std.stdio, std.bigint; import std.range; import std.algorithm; void main() { int n = 100000; auto sumFib1 = recurrence!("a[n-1] + a[n-2]")(BigInt(0), BigInt(1)).take(n).sum; auto sumFib2 = recurrence!("a[n-1] + a[n-2]")(BigInt(0), BigInt(1)).take(n).sum; writeln(sumFib2 - sumFib1); // 0 }