Skip to content

Instantly share code, notes, and snippets.

@Bike
Bike / arith_notes.md
Last active May 8, 2023 00:31
Notes on optimizing CL arithmetic

Bitwise operations on signed magnitude bignums

Because CL specifies bitwise operations treat integers as being in two's complement, if your bignums use a signed magnitude representation they are nontrivial. You will have to test signs while doing your arithmetic operations, and do different things depending. Generally, keep in mind that for integer x, (- x) = (lognot (1- x)) = (1+ (lognot x)), and that the number of bignum elements in the output may exceed those in the input. (Consider (logand -2 -3): It's -4, and 4 needs one more bit to represent than 2 or 3 do.)

For bitwise operations of two operands, you can understand the sign of the result by thinking of the infinite left bits. For example, if logior is given one positive and one negative operand, the result is negative, because for each of these infinitely many bits, (logior 0 1) = 1.

Here are some particular identities that are useful, derived from basic boolean algebra plus the above. `(- (

;;;; in opt.lsp
;;; Given argument forms to an arbitrary arity arithmetic function,
;;; return new arguments with all constants folded together.
;;; FIXME: handler-case, return original arguments
;;; if there's an error (e.g. overflow).
(defun fold-constants (function argforms env)
(loop for form in argforms
when (constantp form env)
collect (ext:constant-form-value form env) into constants
(define-method-combination machine ()
((start (:start))
(rest *))
(let ((qualifiers (mapcar #'method-qualifiers rest))
(tags (mapcar (lambda (m) (declare (ignore m)) (gensym)) rest)))
`(prog (switch)
(setf switch
(lambda (state)
(cond ((equal state nil) (go nil))
,@(loop for qualifier in qualifiers
@Bike
Bike / gillespie
Created May 22, 2015 05:20
my implementation of the gillespie algorithm
;;;; public domain, by Bike
;;;; Gillespie, Daniel T. (1977). "Exact Stochastic Simulation of Coupled Chemical Reactions". The Journal of Physical Chemistry 81 (25): 2340–2361. doi:10.1021/j100540a008.
(defun gillespie (species reactions
&key (stop-time 0d0 st-p) (stop-reactions 0 sr-p)
(rpd 0 rpd-p))
;; SPECIES is a vector of N positive integers, molecule counts.
;; REACTIONS is a vector of M lists
;; The first of each list is the rate constant for that reaction.
;; The second is a vector of N nonnegative integers describing the substrates.