diff options
author | funemy | 2022-10-24 02:21:57 +0000 |
---|---|---|
committer | funemy | 2022-10-24 02:21:57 +0000 |
commit | 95f14a976eda122d8f58ed1ff6ee4f16f1f81b77 (patch) | |
tree | 35650c8d04f2745d9ea233948cf6c81ba9b4cda6 /entries/shayanh/matrix.go | |
parent | 201f9e290b59838ed249b7d1be03e5b8230bef3e (diff) | |
parent | 46a659c983911b87b38b20cd4b28ab9176e4fdb3 (diff) |
Merge branch 'main' of github.com:braxtonhall/fib
Diffstat (limited to 'entries/shayanh/matrix.go')
-rw-r--r-- | entries/shayanh/matrix.go | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/entries/shayanh/matrix.go b/entries/shayanh/matrix.go new file mode 100644 index 0000000..3f374cb --- /dev/null +++ b/entries/shayanh/matrix.go @@ -0,0 +1,40 @@ +package main + +type fibmat [2][2]int + +func matmul(m1 fibmat, m2 fibmat) (m3 fibmat) { + for i := 0; i < 2; i++ { + for j := 0; j < 2; j++ { + for k := 0; k < 2; k++ { + m3[i][j] += m1[i][k] * m2[k][j] + } + } + } + return +} + +func matpow(m fibmat, n int) fibmat { + if n == 0 { + return [2][2]int{ + {1, 0}, + {0, 1}, + } + } else if n%2 == 0 { + t := matpow(m, n/2) + return matmul(t, t) + } else { + t := matpow(m, n-1) + return matmul(t, m) + } +} + +func fib(n int) int { + m := matpow( + [2][2]int{ + {1, 1}, + {1, 0}, + }, + n, + ) + return m[0][1] +} |