Wednesday, February 21, 2007

Fastest way to fibonacci number!

;Written by Fakrudeen Ali Ahmed
;December 30, 2006

(define matrix-upperleft (lambda(x)(car x)) )
(define matrix-upperright (lambda(x)(cadr x)))
(define matrix-lowerleft (lambda(x)(caddr x)))
(define matrix-lowerright (lambda(x)(cadddr x)))

(define (mmul matrix1 matrix2)
(list
; upperLeft*right.upperLeft + upperRight*right.lowerLeft,
(+ (* (matrix-upperleft matrix1) (matrix-upperleft matrix2))
(* (matrix-upperright matrix1) (matrix-upperright matrix2)))
; upperLeft*right.upperRight + upperRight*right.lowerRight,
(+ (* (matrix-upperleft matrix1) (matrix-upperright matrix2))
(* (matrix-upperright matrix1) (matrix-lowerright matrix2)))
; lowerLeft*right.upperLeft + lowerRight*right.lowerLeft,
(+ (* (matrix-lowerleft matrix1) (matrix-upperleft matrix2))
(* (matrix-lowerright matrix1) (matrix-lowerleft matrix2)))
; lowerLeft*right.upperRight + lowerRight*right.lowerRight);
(+ (* (matrix-lowerleft matrix1) (matrix-upperright matrix2))
(* (matrix-lowerright matrix1) (matrix-lowerright matrix2)))
))
(define b '(1 1 1 0))
(define i '(1 0 0 1))

(define (power-res n power value residue)
(list
(mmul value value)
(if (= 0 (fix:and n power)) residue (mmul residue value))
))

(define (loop n power list)
(if (< (/ n 2) power) (mmul (car list) (cadr list)) (loop n (fix:lsh power 1) (power-res n power (car list) (cadr list))) )) (define (fib n) (cadr (loop n 1 (list b i))))

No comments: