# 配列の基本演算子と関数
:::{container} prog-cpp
基本的に,配列に対する演算子と関数は要素ごとに適用されます.
## 配列の基本演算子
基本演算子 **`+`**,**`-`**,**`*`** は変数や式の配列に対して使用できます.**`/`**(÷整数)は式の配列に対して使用できます(変数配列は `auto f = x + 0;` のように式の配列へ変換してから).
Hi-QUBOでは,これらの演算子は要素ごとに適用されます.
### 配列とスカラーの演算
配列とスカラーを組み合わせると,スカラーが配列の各要素に適用されます.
例えば,`x` がサイズ3の配列の場合:
- `2 * x` は `{2*x[0], 2*x[1], 2*x[2]}` を生成
- `x + 1` は `{x[0] + 1, x[1] + 1, x[2] + 1}` を生成
以下のプログラムはこの動作を示しています.
```{literalinclude} /../programFiles/cppPrograms/advanced/vector-operators-and-functions-program1.cpp
:language: cpp
:caption: vector-operators-and-functions-program1.cpp
```
このプログラムは2値変数の配列 `x = {x[0], x[1], x[2]}` を作成します.
`2 * x` で各要素に `2` を掛け,`+ 1` で各要素に `1` を加えるため,`f` は `{1 + 2*x[0], 1 + 2*x[1], 1 + 2*x[2]}` になります.
このプログラムは以下の出力を生成します.
```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md
:start-after:
:end-before:
```
### 配列同士の演算
同じサイズの2つの配列を組み合わせると,各インデックスで要素ごとに演算が行われます.
以下の例では,どちらもサイズ3の2つの配列 `x` と `y` を使用しています.
```{literalinclude} /../programFiles/cppPrograms/advanced/vector-operators-and-functions-program2.cpp
:language: cpp
:caption: vector-operators-and-functions-program2.cpp
```
ここでは:
- `2 * x` は `{2*x[0], 2*x[1], 2*x[2]}` になる
- `3 * y` は `{3*y[0], 3*y[1], 3*y[2]}` になる
- 加算は要素ごとに行われるため,`i` 番目の要素は `2*x[i] + 3*y[i]`
- `+ 1` も要素ごとに適用される
したがって,`f` は `{1 + 2*x[0] + 3*y[0], 1 + 2*x[1] + 3*y[1], 1 + 2*x[2] + 3*y[2]}` となり,出力と一致します.
```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md
:start-after:
:end-before:
```
配列同士の演算は同じ配列サイズが必要です.
次の例は,配列とスカラーの演算,配列同士の演算,単項マイナス,括弧を含む,より複雑な要素ごとの式を示しています.
```{literalinclude} /../programFiles/cppPrograms/advanced/vector-operators-and-functions-program3.cpp
:language: cpp
:caption: vector-operators-and-functions-program3.cpp
```
この例でも,すべての演算は要素ごとに適用されます.
- まず,`x + 1` と `y - 1` は各要素にスカラーを加減算し,2つの配列 `{x[i]+1}` と `{y[i]-1}` を生成します.
- 単項マイナス -(x + 1) も要素ごとに適用され,`{-(x[i]+1)}` になります.
- 乗算 `6 * -(x + 1) * (y - 1)` も要素ごとに行われ,各インデックス `i` で `f[i]=6*(-(x[i]+1))*(y[i]-1)` となります.
この式を展開すると `f[i]=6-6x[i]y[i]+6x[i]-6y[i]` となり,出力と一致します.
- 最後に,`g = f / 3` は各要素を3で割るため,`g[i]=f[i]/3=2-2x[i]y[i]+2x[i]-2y[i]` となり,やはり出力と一致します.
```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md
:start-after:
:end-before:
```
## 配列の複合演算子
同様に,複合演算子 **`+=`**,**`-=`**,**`*=`**,**`/=`** も式の配列に対して使用できます(変数配列の要素型は変更できないため,先に式の配列へ変換します).
以下の例は,サイズ3の配列に対するこれらの演算子の動作を示しています.
```{literalinclude} /../programFiles/cppPrograms/advanced/vector-operators-and-functions-program4.cpp
:language: cpp
:caption: vector-operators-and-functions-program4.cpp
```
このプログラムは以下の出力を生成します.
```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md
:start-after:
:end-before:
```
## 配列の2乗関数
2乗関数も配列に対して使用できます.以下に例を示します.
```{literalinclude} /../programFiles/cppPrograms/advanced/vector-operators-and-functions-program5.cpp
:language: cpp
:caption: vector-operators-and-functions-program5.cpp
```
このプログラムは以下の出力を生成します.
```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md
:start-after:
:end-before:
```
## 配列の簡約化関数
簡約化関数も配列に対して使用できます.以下に例を示します.
```{literalinclude} /../programFiles/cppPrograms/advanced/vector-operators-and-functions-program6.cpp
:language: cpp
:caption: vector-operators-and-functions-program6.cpp
```
このプログラムは以下の出力を生成します.
```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md
:start-after:
:end-before:
```
> **注意**
> これらの演算子と関数は **多次元配列** に対しても使用できます.
:::
:::{container} prog-python
基本的に,配列に対する演算子と関数は要素ごとに適用されます.
## 配列の基本演算子
基本演算子 **`+`**,**`-`**,**`*`** は変数や式の配列に対して使用できます.**`/`**(÷整数)は式の配列に対して使用できます.
Hi-QUBOでは,これらの演算子は要素ごとに適用されます.
### 配列とスカラーの演算
配列とスカラーを組み合わせると,スカラーが配列の各要素に適用されます.
例えば,`x` がサイズ3の配列の場合:
- `2 * x` は `[2*x[0], 2*x[1], 2*x[2]]` を生成
- `x + 1` は `[x[0] + 1, x[1] + 1, x[2] + 1]` を生成
以下のプログラムはこの動作を示しています.
```{literalinclude} /../programFiles/pythonPrograms/advanced/vector-operators-and-functions-program1.py
:language: python
:caption: vector-operators-and-functions-program1.py
```
このプログラムは2値変数の配列 `x = [x[0], x[1], x[2]]` を作成します.
`2 * x` で各要素に `2` を掛け,`+ 1` で各要素に `1` を加えるため,`f` は `[1 + 2*x[0], 1 + 2*x[1], 1 + 2*x[2]]` になります.
このプログラムは以下の出力を生成します.
```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md
:start-after:
:end-before:
```
### 配列同士の演算
同じサイズの2つの配列を組み合わせると,各インデックスで要素ごとに演算が行われます.
以下の例では,どちらもサイズ3の2つの配列 `x` と `y` を使用しています.
```{literalinclude} /../programFiles/pythonPrograms/advanced/vector-operators-and-functions-program2.py
:language: python
:caption: vector-operators-and-functions-program2.py
```
ここでは:
- `2 * x` は `[2*x[0], 2*x[1], 2*x[2]]` になる
- `3 * y` は `[3*y[0], 3*y[1], 3*y[2]]` になる
- 加算は要素ごとに行われるため,`i` 番目の要素は `2*x[i] + 3*y[i]`
- `+ 1` も要素ごとに適用される
したがって,`f` は `[1 + 2*x[0] + 3*y[0], 1 + 2*x[1] + 3*y[1], 1 + 2*x[2] + 3*y[2]]` となり,出力と一致します.
```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md
:start-after:
:end-before:
```
配列同士の演算は同じ配列サイズが必要です.
次の例は,配列とスカラーの演算,配列同士の演算,単項マイナス,括弧を含む,より複雑な要素ごとの式を示しています.
```{literalinclude} /../programFiles/pythonPrograms/advanced/vector-operators-and-functions-program3.py
:language: python
:caption: vector-operators-and-functions-program3.py
```
この例でも,すべての演算は要素ごとに適用されます.
- まず,`x + 1` と `y - 1` は各要素にスカラーを加減算し,2つの配列 `[x[i]+1]` と `[y[i]-1]` を生成します.
- 単項マイナス -(x + 1) も要素ごとに適用され,`[-(x[i]+1)]` になります.
- 乗算 `6 * -(x + 1) * (y - 1)` も要素ごとに行われ,各インデックス `i` で `f[i]=6*(-(x[i]+1))*(y[i]-1)` となります.
この式を展開すると `f[i]=6-6x[i]y[i]+6x[i]-6y[i]` となり,出力と一致します.
- 最後に,`g = f / 3` は各要素を3で割るため,`g[i]=f[i]/3=2-2x[i]y[i]+2x[i]-2y[i]` となり,やはり出力と一致します.
```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md
:start-after:
:end-before:
```
## 配列の複合演算子
同様に,複合演算子 **`+=`**,**`-=`**,**`*=`**,**`/=`** も式の配列に対して使用できます.
以下の例は,サイズ3の配列に対するこれらの演算子の動作を示しています.
```{literalinclude} /../programFiles/pythonPrograms/advanced/vector-operators-and-functions-program4.py
:language: python
:caption: vector-operators-and-functions-program4.py
```
このプログラムは以下の出力を生成します.
```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md
:start-after:
:end-before:
```
## 配列の2乗関数
2乗関数も配列に対して使用できます.以下に例を示します.
```{literalinclude} /../programFiles/pythonPrograms/advanced/vector-operators-and-functions-program5.py
:language: python
:caption: vector-operators-and-functions-program5.py
```
このプログラムは以下の出力を生成します.
```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md
:start-after:
:end-before:
```
## 配列の簡約化関数
簡約化関数も配列に対して使用できます.以下に例を示します.
```{literalinclude} /../programFiles/pythonPrograms/advanced/vector-operators-and-functions-program6.py
:language: python
:caption: vector-operators-and-functions-program6.py
```
このプログラムは以下の出力を生成します.
```{include} /../programFiles/markDown/advanced/vector-operators-and-functions.md
:start-after:
:end-before:
```
> **注釈**
> これらの演算子と関数は **多次元配列** に対しても使用できます.
:::