r
fibs3 :: Stream Integer
fibs3 = x' / (streamRepeat 1 - x' - x' * x')
+
+-- exercise 7
+data Matrix = Matrix Integer Integer Integer Integer
+
+instance Num Matrix where
+ (*) :: Matrix -> Matrix -> Matrix
+ (*) (Matrix a1 b1 c1 d1) (Matrix a2 b2 c2 d2) =
+ Matrix (a1*a2 + b1*c2) (a1*b2 + b1*d2) (c1*a2 + d1*c2) (c1*b2 + d1*d2)
+
+fib4 :: Integer -> Integer
+fib4 0 = 0
+fib4 n = let f0 = (Matrix 1 1 1 0)
+ (Matrix _ b _ _) = f0 ^ n
+ in
+ b