Resistance network calculator: Difference between revisions

Added Go
No edit summary
(Added Go)
Line 58:
 
assert 180 == network(4,0,3,"0 1 150|0 2 50|1 3 300|2 3 250")
 
=={{header|Go}}==
{{trans|Python}}
<lang go>package main
 
import (
"fmt"
"math/big"
"strconv"
"strings"
)
 
func gauss(a [][]*big.Rat, b []*big.Rat) []*big.Rat {
n := len(a)
t := new(big.Rat)
u := new(big.Rat)
for i := 0; i < n; i++ {
t.Abs(a[i][i])
k := i
for j := i + 1; j < n; j++ {
if u.Abs(a[j][i]).Cmp(t) == 1 {
t.Abs(a[j][i])
k = j
}
}
if k != i {
for j := i; j < n; j++ {
u.Set(a[i][j])
a[i][j].Set(a[k][j])
a[k][j].Set(u)
}
u.Set(b[i])
b[i].Set(b[k])
b[k].Set(u)
}
t.Set(u.Inv(a[i][i]))
for j := i + 1; j < n; j++ {
a[i][j].Mul(a[i][j], t)
}
b[i].Mul(b[i], t)
for j := i + 1; j < n; j++ {
t.Set(a[j][i])
for k := i + 1; k < n; k++ {
u.Mul(t, a[i][k])
a[j][k].Sub(a[j][k], u)
}
u.Mul(t, b[i])
b[j].Sub(b[j], u)
}
}
for i := n - 1; i >= 0; i-- {
for j := 0; j < i; j++ {
u.Mul(a[j][i], b[i])
b[j].Sub(b[j], u)
}
}
return b
}
 
func network(n, k0, k1 int, s string) *big.Rat {
a := make([][]*big.Rat, n)
for i := 0; i < n; i++ {
a[i] = make([]*big.Rat, n)
for j := 0; j < n; j++ {
a[i][j] = new(big.Rat)
}
}
arr := strings.Split(s, "|")
for _, resistor := range arr {
rarr := strings.Fields(resistor)
n1, _ := strconv.Atoi(rarr[0])
n2, _ := strconv.Atoi(rarr[1])
ri, _ := strconv.Atoi(rarr[2])
r := new(big.Rat).SetFrac64(1, int64(ri))
a[n1][n1].Add(a[n1][n1], r)
a[n2][n2].Add(a[n2][n2], r)
if n1 > 0 {
a[n1][n2].Sub(a[n1][n2], r)
}
if n2 > 0 {
a[n2][n1].Sub(a[n2][n1], r)
}
}
a[k0][k0].SetInt64(1)
b := make([]*big.Rat, n)
for i := 0; i < n; i++ {
b[i] = new(big.Rat)
}
b[k1].SetInt64(1)
return gauss(a, b)[k1]
}
 
func main() {
var ra [4]*big.Rat
ra[0] = network(7, 0, 1, "0 2 6|2 3 4|3 4 10|4 5 2|5 6 8|6 1 4|3 5 6|3 6 6|3 1 8|2 1 8")
ra[1] = network(9, 0, 8, "0 1 1|1 2 1|3 4 1|4 5 1|6 7 1|7 8 1|0 3 1|3 6 1|1 4 1|4 7 1|2 5 1|5 8 1")
ra[2] = network(16, 0, 15, "0 1 1|1 2 1|2 3 1|4 5 1|5 6 1|6 7 1|8 9 1|9 10 1|10 11 1|12 13 1|13 14 1|14 15 1|0 4 1|4 8 1|8 12 1|1 5 1|5 9 1|9 13 1|2 6 1|6 10 1|10 14 1|3 7 1|7 11 1|11 15 1")
ra[3] = network(4, 0, 3, "0 1 150|0 2 50|1 3 300|2 3 250")
for _, r := range ra {
s := r.String()
if strings.HasSuffix(s, "/1") {
fmt.Println(s[0 : len(s)-2])
} else {
fmt.Println(s)
}
}
}</lang>
 
{{out}}
<pre>
10
3/2
13/7
180
</pre>
 
=={{header|Python}}==
9,485

edits