Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
|
|
@ -0,0 +1,71 @@
|
|||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type vector = []float64
|
||||
type matrix []vector
|
||||
|
||||
func (m1 matrix) mul(m2 matrix) matrix {
|
||||
rows1, cols1 := len(m1), len(m1[0])
|
||||
rows2, cols2 := len(m2), len(m2[0])
|
||||
if cols1 != rows2 {
|
||||
panic("Matrices cannot be multiplied.")
|
||||
}
|
||||
result := make(matrix, rows1)
|
||||
for i := 0; i < rows1; i++ {
|
||||
result[i] = make(vector, cols2)
|
||||
for j := 0; j < cols2; j++ {
|
||||
for k := 0; k < rows2; k++ {
|
||||
result[i][j] += m1[i][k] * m2[k][j]
|
||||
}
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func identityMatrix(n int) matrix {
|
||||
if n < 1 {
|
||||
panic("Size of identity matrix can't be less than 1")
|
||||
}
|
||||
ident := make(matrix, n)
|
||||
for i := 0; i < n; i++ {
|
||||
ident[i] = make(vector, n)
|
||||
ident[i][i] = 1
|
||||
}
|
||||
return ident
|
||||
}
|
||||
|
||||
func (m matrix) pow(n int) matrix {
|
||||
le := len(m)
|
||||
if le != len(m[0]) {
|
||||
panic("Not a square matrix")
|
||||
}
|
||||
switch {
|
||||
case n < 0:
|
||||
panic("Negative exponents not supported")
|
||||
case n == 0:
|
||||
return identityMatrix(le)
|
||||
case n == 1:
|
||||
return m
|
||||
}
|
||||
pow := identityMatrix(le)
|
||||
base := m
|
||||
e := n
|
||||
for e > 0 {
|
||||
if (e & 1) == 1 {
|
||||
pow = pow.mul(base)
|
||||
}
|
||||
e >>= 1
|
||||
base = base.mul(base)
|
||||
}
|
||||
return pow
|
||||
}
|
||||
|
||||
func main() {
|
||||
m := matrix{{3, 2}, {2, 1}}
|
||||
for i := 0; i <= 10; i++ {
|
||||
fmt.Println("** Power of", i, "**")
|
||||
fmt.Println(m.pow(i))
|
||||
fmt.Println()
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue