Moving all of my Emacs-related files into their own directory at the root of this repository.
		
			
				
	
	
		
			89 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
| ;;; series.el --- Hosting common series of numbers -*- lexical-binding: t -*-
 | |
| ;; Author: William Carroll <wpcarro@gmail.com>
 | |
| 
 | |
| ;;; Commentary:
 | |
| ;; Encoding number series as I learn about them.
 | |
| ;;
 | |
| ;; These are the following series I'm interested in supporting:
 | |
| ;; - Fibonacci
 | |
| ;; - Catalan numbers
 | |
| ;; - Figurate number series
 | |
| ;;   - Triangular
 | |
| ;;   - Square
 | |
| ;;   - Pentagonal
 | |
| ;;   - Hexagonal
 | |
| ;;   - Lazy-caterer
 | |
| ;; - Magic square
 | |
| ;; - Look-and-say
 | |
| 
 | |
| ;;; Code:
 | |
| 
 | |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | |
| ;; Dependencies
 | |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | |
| 
 | |
| (require 'number)
 | |
| 
 | |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | |
| ;; Library
 | |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | |
| 
 | |
| (defun series/range (beg end)
 | |
|   "Create a list of numbers from `BEG' to `END'.
 | |
| This is an inclusive number range."
 | |
|   (if (< end beg)
 | |
|       (list/reverse
 | |
|        (number-sequence end beg))
 | |
|     (number-sequence beg end)))
 | |
| 
 | |
| (defun series/fibonacci-number (i)
 | |
|   "Return the number in the fibonacci series at `I'."
 | |
|   (cond
 | |
|    ((= 0 i) 0)
 | |
|    ((= 1 i) 1)
 | |
|    (t (+ (series/fibonacci-number (- i 1))
 | |
|          (series/fibonacci-number (- i 2))))))
 | |
| 
 | |
| (defun series/fibonacci (n)
 | |
|   "Return the first `N' numbers of the fibonaccci series starting at zero."
 | |
|   (if (= 0 n)
 | |
|       '()
 | |
|     (list/reverse
 | |
|      (list/cons (series/fibonacci-number (number/dec n))
 | |
|                 (list/reverse
 | |
|                  (series/fibonacci (number/dec n)))))))
 | |
| 
 | |
| ;; TODO: Consider memoization.
 | |
| (defun series/triangular-number (i)
 | |
|   "Return the number in the triangular series at `I'."
 | |
|   (if (= 0 i)
 | |
|       0
 | |
|     (+ i (series/triangular-number (number/dec i)))))
 | |
| 
 | |
| ;; TODO: Improve performance.
 | |
| ;; TODO: Consider creating a stream protocol with `stream/next' and implement
 | |
| ;; this using that.
 | |
| (defun series/triangular (n)
 | |
|   "Return the first `N' numbers of a triangular series starting at 0."
 | |
|   (if (= 0 n)
 | |
|       '()
 | |
|     (list/reverse
 | |
|      (list/cons (series/triangular-number (number/dec n))
 | |
|                 (list/reverse
 | |
|                  (series/triangular (number/dec n)))))))
 | |
| 
 | |
| (defun series/catalan-number (i)
 | |
|   "Return the catalan number in the series at `I'."
 | |
|   (if (= 0 i)
 | |
|       1
 | |
|     (/ (number/factorial (* 2 i))
 | |
|        (* (number/factorial (number/inc i))
 | |
|           (number/factorial i)))))
 | |
| 
 | |
| (defun series/catalan (n)
 | |
|   "Return the first `N' numbers in a catalan series."
 | |
|   (->> (series/range 0 (number/dec n))
 | |
|        (list/map #'series/catalan-number)))
 | |
| 
 | |
| (provide 'series)
 | |
| ;;; series.el ends here
 |