はじめに
配列$x$と配列$y$のそれぞれの全要素を掛けて合計を求めたい。
単純に書くと下記のようになる。
sum := 0
for _, xi := range x {
for _, yi := range y {
sum += xi * yi
}
}
ループが二重になってしまい嬉しくない。
改善
xi
は内側のループ中は変化しないので、外に出してやればいい。
sum := 0
for _, xi := range x {
sumy := 0
for _, yi := range y {
sumy += yi
}
sum += xi * sumy
}
sumy
はx
とは無関係に求められるから、1回だけ計算すればいい。
sumx := 0
for _, xi := range x {
sumx += xi
}
sumy := 0
for _, yi := range y {
sumy += yi
}
sum := sumx * sumy
二重ループが消えた。うれしい。
結論
数式っぽく書くと下記のような感じになる。
$$\sum_{ i=1 }^{ n }\sum_{ j=1 }^{ m } x_i y_j=\sum_{ i=1 }^{ n }x_i \sum_{ j=1 }^{ m }y_j$$
やっていることは因数分解と大して変わらないが、最初は理解できなかったので記録しておく。
以上