53 lines
900 B
Go
53 lines
900 B
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"permute"
|
||
)
|
||
|
||
func determinant(m [][]float64) (d float64) {
|
||
p := make([]int, len(m))
|
||
for i := range p {
|
||
p[i] = i
|
||
}
|
||
it := permute.Iter(p)
|
||
for s := it(); s != 0; s = it() {
|
||
pr := 1.
|
||
for i, σ := range p {
|
||
pr *= m[i][σ]
|
||
}
|
||
d += float64(s) * pr
|
||
}
|
||
return
|
||
}
|
||
|
||
func permanent(m [][]float64) (d float64) {
|
||
p := make([]int, len(m))
|
||
for i := range p {
|
||
p[i] = i
|
||
}
|
||
it := permute.Iter(p)
|
||
for s := it(); s != 0; s = it() {
|
||
pr := 1.
|
||
for i, σ := range p {
|
||
pr *= m[i][σ]
|
||
}
|
||
d += pr
|
||
}
|
||
return
|
||
}
|
||
|
||
var m2 = [][]float64{
|
||
{1, 2},
|
||
{3, 4}}
|
||
|
||
var m3 = [][]float64{
|
||
{2, 9, 4},
|
||
{7, 5, 3},
|
||
{6, 1, 8}}
|
||
|
||
func main() {
|
||
fmt.Println(determinant(m2), permanent(m2))
|
||
fmt.Println(determinant(m3), permanent(m3))
|
||
}
|