Advertisement
Guest User

Leonardo Numbers by serial addition and matrix exponentiatio

a guest
Jun 9th, 2015
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.47 KB | None | 0 0
  1.  
  2. (defun leonardo-collect (n)
  3.   (cond ((= n 0) '(1))
  4.     ((= n 1) '(1 1))
  5.     (t
  6.      (loop
  7.         for counter from 2 to n
  8.         for x = 1 then y
  9.         for y = 1 then z
  10.         for z = (+ 1 x y)
  11.         collect z into results
  12.         finally (return (append '(1 1) results))))))
  13.  
  14.  
  15.      
  16. (defun leonardo2 (n) ;;; just the result
  17.   (cond ((= n 0) 1)
  18.     ((= n 1) 1)
  19.     (t (loop
  20.           for counter from 2 to n
  21.           for x = 1 then y
  22.           for y = 1 then z
  23.           for z = (+ 1 x y)
  24.           finally (return z)))))
  25.        
  26.  
  27.  
  28. (defun matrix-dot-product (m1 m2 x y)
  29.     (loop for i from 0 below (second (array-dimensions m1))
  30.        sum (* (aref m1 x i) (aref m2 i y))))
  31.  
  32.  
  33. (defun matrix-multiply (m1 m2)
  34.   (let ((dim1 (first (array-dimensions m1)))
  35.     (dim2 (second (array-dimensions m2))))
  36.     (let ((result-array (make-array (list dim1 dim2))))
  37.       (dotimes (i dim1)
  38.     (dotimes (j dim2)
  39.       (setf (aref result-array i j)
  40.         (matrix-dot-product m1 m2 i j))))
  41.       result-array)))
  42.  
  43.  
  44. (defun matrix-power (m n)
  45.   (cond ((= n 1) m)
  46.     ((= 0 (mod n 2))
  47.      (matrix-power
  48.       (matrix-multiply m m)
  49.       (/ n 2)))
  50.     (t
  51.      (matrix-multiply
  52.       m
  53.       (matrix-power
  54.        (matrix-multiply m m)
  55.        (/ (- n 1) 2))))))
  56.  
  57. (defvar fib-matrix (make-array '(2 2) :initial-contents
  58.                    '((1 1) (1 0))))
  59.  
  60. (defun fib-by-matrix (n)
  61.   (cond ((= n 0) 0)
  62.     ((= n 1) 1)
  63.     (t ;;default case
  64.      (aref (matrix-power fib-matrix n) 1 0))))
  65.  
  66. (defun leonardo-by-matrix (n)
  67.   (- (* (fib-by-matrix (+ n 1)) 2) 1))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement