RosettaCodeData/Task/Matrix-exponentiation-operator/Scheme/matrix-exponentiation-opera...

24 lines
486 B
Scheme

(define (dec x)
(- x 1))
(define (halve x)
(/ x 2))
(define (row*col row col)
(apply + (map * row col)))
(define (matrix-multiply m1 m2)
(map
(lambda (row)
(apply map (lambda col (row*col row col))
m2))
m1))
(define (matrix-exp mat exp)
(cond ((= exp 1) mat)
((even? exp) (square-matrix (matrix-exp mat (halve exp))))
(else (matrix-multiply mat (matrix-exp mat (dec exp))))))
(define (square-matrix mat)
(matrix-multiply mat mat))