ITパスポート、基本情報技術者試験で問われる離散数学の基本と例題

こんてんつ

ITパスポート、基本情報技術者試験で問われる離散数学の基本と、例題を列挙した。

  • 基数変換
  • 論理シフト、算術シフト
  • 過去問例題集

基礎

基数変換

論理シフト、算術シフト

  • 論理シフト : 符号を考慮せず、2進数のビット列を左右にずらす。空いたビット列には0を入れる。
  • 算術シフト : 符号を考慮して、2進数のビット列を左右にずらす。左にずらす場合、符号ビットは動かさない。右にずらす場合、空いた場所には符号ビットと同じ値を入れる。

算術シフトで1左にずらすことは、2を掛けることを意味する。算術シフトで1右にずらすことは、2で割ることを意味する(切り上げ)。

過去問例題集

H27S

  • (0010\,1000) - 1は?

まず、


A : (0010\,1000) \\
B : (0000\,0001)

と置く。


- (0000\,0001)  = (1111\,1110) + (0000\,0001) = (1111\,1111)  \\

であり、


A - B = (0010\,1000) + (1111\,1111) = (1\,0010\,0111) = (0010\,0111)

となる。

H26A

  • 16進数における0.1を、10進数の分数で表すといくつか?
  • 16進数における0.01を、10進数の分数で表すといくつか?
  • 16進数における0.02を、10進数の分数で表すといくつか?
  • 16進数における0.05を、10進数の分数で表すといくつか?

それぞれ、次のようになる。


(0.1)_{16} = 1/16 \\
(0.01)_{16} = 1/256 \\
(0.02)_{16} = 2/256 \\
(0.05)_{16} = 5/256

H26A

  • 11進数で55500を10進数に変換するといくつか?

11進数の値×重みで求める。


\begin{eqnarray}
&&11^4 \times 5 + 11^3 \times 5 + 11^2 \times 5 + 11^1 \times 5 + 11^0 \times 5 \\
&=& 73205 + 6655 + 605 + 55 + 0 \\
&=& 80520
\end{eqnarray}

H26S

2進小数は10進小数で次のように表す。


(0.1)_{2} = 0.5 \\
(0.01)_{2} = 0.25 \\
(0.001)_{2} = 0.125 \\
(0.0001)_{2} = 0.0625

これの組み合わせで表現できるか否かで判断する。

例えば、

  • 10進小数の0.375は2進小数で0.25+0.125であり有限小数
  • 10進小数の0.05は上の2進小数の組み合わせで表現できないので無限小数

もしくは、愚直にたすき算にて10進小数→2進小数と表してみて判断する。

H24S

  • 10進数における0.3を、8進数で表すといくつか?
  • 10進数における0.4を、8進数で表すといくつか?
  • 10進数における0.5を、8進数で表すといくつか?

たすき算にて求める。


(0.3) _ {10} = (0.23146) _ {8} \\
(0.4) _ {10} = (0.3146) _ {8} \\
(0.5) _ {10} = (0.4) _ {8}

となる。

H24A

  • 1101\, 0000を右に2ビット算術シフトせよ。

右にシフトした後、空いた場所には符号ビットと同じ値を入れる


(1101\,0000) -> (1111\,0100)

の様になる。

  • (0001\, 0100) _ 2 - (1111\, 0100) _ 2は?

まず、


A : 0001\, 0100 \\
B : 1111\,0100

と置く。


- (1111\, 0100)  = (0000\,1011) + (0000\,0001) = (0000\,1100)  \\

であり、


A - B = (0001\, 0100) + (0000\,1100) = (0010\,0000)

となる。

H24S

  • (0000\,1000) _ {2}を3倍せよ。

1ビットだけ左にシフト(×2)してできるビット列に対して元のビット列の加算(+1)するという処理を組み合わせることで、3倍にする演算を行う。


(0000\,1000) _ {2} \times 3 = (0001\,0000) _ {2} + (0000\,1000) _ {2} = (0001\,1000) _ {2}

【C++】0埋めの方法(<iomanip>)

こんてんつ

C++iostreams標準ヘッダー<iomanip>を利用して0埋めを実施する。以下の様々な例を示す。

  • 基本の例とiomanipの理解
  • 変数を利用した例
  • sstream、stringを用いた例

基本の例とiomanipの理解

一番基本のコード

#include<iostream>
#include<iomanip>

using namespace std;

int main() {

    cout << setw(4) << setfill('0') << 11 << endl;

    system("pause>0");
    remove("0");
}

出力

iomanip、setw、setfillを理解するためのコード

setw(4) << setfill('0')の後ろに続く文字に対する0埋めのため、行を跨いでも問題ない。

#include<iostream>
#include<iomanip>

using namespace std;

int main() {

    cout << setw(4) << setfill('0');
    cout << 11 << endl;

    system("pause>0");
    remove("0");
}

setfill('0')を指定しない場合は空欄が出力される。setfill('a')などとすることも可能。

#include<iostream>
#include<iomanip>

using namespace std;

int main() {

    cout << setw(4) << 11 << endl;
    cout << setw(4) << setfill('0') << 11 << endl;
    cout << setw(4) << setfill('a') << 11 << endl;

    system("pause>0");
    remove("0");
}

変数を利用した例

入力

#include<iostream>
#include<iomanip>

using namespace std;

int main() {

    int myVal;
    myVal = 22;
    cout << setw(4) << setfill('0') << myVal << endl;

    system("pause>0");
    remove("0");
}

出力

0022

sstream、stringを用いた例

sstreamを用いて変数的に利用した例

  1. <sstream>をインクルードして、stringstreamを定義する。
  2. 定義したstringstreamに対してsetw(4) << setfill('0')の操作を実施する。
  3. その後、<sstream>.str()関数を用いて文字列を取得して表示する。

入力

#include<iostream>
#include<iomanip>
#include<sstream>

using namespace std;

int main() {

    int myVal;
    myVal = 22;

    stringstream myStream;
    myStream << setw(4) << setfill('0') << myVal;

    cout << myStream.str() << endl;

    system("pause>0");
    remove("0");
}

出力

0022

sstreamを用いて変数的に利用し、更にstring型を定義して再定義した例

上記の操作に加えて、#include<string>によってstring型の定義を実施した方法。

入力

#include<iostream>
#include<iomanip>
#include<sstream>
#include<string>

using namespace std;

int main() {

    int myVal;
    myVal = 22;

    stringstream myStream;
    myStream << setw(4) << setfill('0') << myVal;

    string myStr;
    myStr = myStream.str();

    cout << myStr << endl;

    system("pause>0");
    remove("0");
}

出力

0022

【R】データに条件を指定した列を追加する(mutate)

こんてんつ

データフレームに列を追加する方法を紹介する。条件によって何らかの値を計算したり、文字列を追加したりする。tidyverseパッケージ集の中のdplyrパッケージのmutate関数を利用します。

早見チートシート

#任意の文字列を追加する

iris_column_added <- iris %>%
  mutate(new_col = "AAA") %>%
  select(new_col,everything())

#条件によって追加する方法を変える

iris_column_added <- iris %>%
  mutate(new_col = if_else(Sepal.Length >= 5.0, "AAA", "BBB")) %>%
  select(new_col, everything())

iris_column_added <- iris %>%
  mutate(new_col = case_when(Sepal.Length >= 5.5 ~ "AAA",
                         Sepal.Length >= 5.0 & Sepal.Length < 5.5 ~ "BBB",
                         TRUE ~ "CCC")) %>%
  select(new_col, everything())

#計算式によって追加する

iris_column_added <- iris %>%
  mutate(new_col = Sepal.Length + Sepal.Width) %>%
  select(new_col, everything())

iris_column_added <- iris %>%
  mutate(new_col = if_else(Sepal.Length >= 5.0, Sepal.Length, 0)) %>%
  select(new_col, everything())

解説

mutateによってnew_colという新しい列を追加した後、select&everythingによって、new_col列を一番前に持ってきたデータフレームにしている。select&everythingを使わなければ、一番右に列が追加される。select&everythingの解説は以下の記事を参考。

contents-open.hatenablog.com

詳細

任意の文字列を追加する

iris_column_added <- iris %>%
  mutate(new_col = "AAA") %>%
  select(new_col,everything())
head(iris_column_added)
> head(iris_column_added)
  new_col Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1     AAA          5.1         3.5          1.4         0.2  setosa
2     AAA          4.9         3.0          1.4         0.2  setosa
3     AAA          4.7         3.2          1.3         0.2  setosa
4     AAA          4.6         3.1          1.5         0.2  setosa
5     AAA          5.0         3.6          1.4         0.2  setosa
6     AAA          5.4         3.9          1.7         0.4  setosa

条件によって追加する方法を変える

if_else関数によって、条件に合うものをAAAに、それ以外のものをBBBとして列を追加する。

iris_column_added <- iris %>%
  mutate(new_col = if_else(Sepal.Length >= 5.0, "AAA", "BBB")) %>%
  select(new_col, everything())
head(iris_column_added)
> head(iris_column_added)
  new_col Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1     AAA          5.1         3.5          1.4         0.2  setosa
2     BBB          4.9         3.0          1.4         0.2  setosa
3     BBB          4.7         3.2          1.3         0.2  setosa
4     BBB          4.6         3.1          1.5         0.2  setosa
5     AAA          5.0         3.6          1.4         0.2  setosa
6     AAA          5.4         3.9          1.7         0.4  setosa

case_when関数によって、一つ目の条件に合致するものをAAAとし、二つ目の条件に合致するものをBBBとし、それ以外のものをTRUEで繋いでCCCで出力するようにしている。条件と出力は~で繋ぐ。

iris_column_added <- iris %>%
  mutate(new_col = case_when(Sepal.Length >= 5.5 ~ "AAA",
                         Sepal.Length >= 5.0 & Sepal.Length < 5.5 ~ "BBB",
                         TRUE ~ "CCC")) %>%
  select(new_col, everything())
head(iris_column_added,20)
> head(iris_column_added,20)
   new_col Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1      BBB          5.1         3.5          1.4         0.2  setosa
2      CCC          4.9         3.0          1.4         0.2  setosa
3      CCC          4.7         3.2          1.3         0.2  setosa
4      CCC          4.6         3.1          1.5         0.2  setosa
5      BBB          5.0         3.6          1.4         0.2  setosa
6      BBB          5.4         3.9          1.7         0.4  setosa
7      CCC          4.6         3.4          1.4         0.3  setosa
8      BBB          5.0         3.4          1.5         0.2  setosa
9      CCC          4.4         2.9          1.4         0.2  setosa
10     CCC          4.9         3.1          1.5         0.1  setosa
11     BBB          5.4         3.7          1.5         0.2  setosa
12     CCC          4.8         3.4          1.6         0.2  setosa
13     CCC          4.8         3.0          1.4         0.1  setosa
14     CCC          4.3         3.0          1.1         0.1  setosa
15     AAA          5.8         4.0          1.2         0.2  setosa
16     AAA          5.7         4.4          1.5         0.4  setosa
17     BBB          5.4         3.9          1.3         0.4  setosa
18     BBB          5.1         3.5          1.4         0.3  setosa
19     AAA          5.7         3.8          1.7         0.3  setosa
20     BBB          5.1         3.8          1.5         0.3  setosa

計算式によって追加する

足し算で列を追加した。

iris_column_added <- iris %>%
  mutate(new_col = Sepal.Length + Sepal.Width) %>%
  select(new_col, everything())
head(iris_column_added)
> head(iris_column_added)
  new_col Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1     8.6          5.1         3.5          1.4         0.2  setosa
2     7.9          4.9         3.0          1.4         0.2  setosa
3     7.9          4.7         3.2          1.3         0.2  setosa
4     7.7          4.6         3.1          1.5         0.2  setosa
5     8.6          5.0         3.6          1.4         0.2  setosa
6     9.3          5.4         3.9          1.7         0.4  setosa

条件に合致するものは、同じ値を。合致しない場合は0となるような列を追加した。

iris_column_added <- iris %>%
  mutate(new_col = if_else(Sepal.Length >= 5.0, Sepal.Length, 0)) %>%
  select(new_col, everything())
head(iris_column_added)
> head(iris_column_added)
  new_col Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1     5.1          5.1         3.5          1.4         0.2  setosa
2     0.0          4.9         3.0          1.4         0.2  setosa
3     0.0          4.7         3.2          1.3         0.2  setosa
4     0.0          4.6         3.1          1.5         0.2  setosa
5     5.0          5.0         3.6          1.4         0.2  setosa
6     5.4          5.4         3.9          1.7         0.4  setosa

参考情報

行の合計、平均、標準偏差など高度な処理によって列を追加したい場合は、次の記事を参考にしてみて下さい。

contents-open.hatenablog.com

【R】データの列や行を並び替える方法(select&everything、arrange)

こんてんつ

Rにおいて、データフレームの列や行を並び替える方法について紹介します。tidyverseパッケージ集の中のdplyrパッケージのselect関数、arange関数を利用します。

  • 列:任意の並び替え&昇順降順ソート
  • 行:昇順降順ソート

関連記事

contents-open.hatenablog.com

早見チートシート

パッケージのインストール&読み込み

install.packages("tidyverse")
library(tidyverse)

列の並び替え

# 任意の順番を指定する

iris_column_ordered <- iris %>% select(Petal.Width, everything())

iris_column_ordered <- iris %>% select(Petal.Length, Species, everything())

iris_column_ordered <- iris %>% select(starts_with("Petal"), everything())

# 列の名前順のcolumn_orderを作ってソートする

column_order <- names(iris) %>% sort()
iris_column_ordered <- iris %>% select(all_of(column_order))

column_order <- names(iris) %>% sort(decreasing = T)
iris_column_ordered <- iris %>% select(all_of(column_order))

行の並び替え

# 指定した列で昇順or降順ソート

iris_row_orderd <- iris %>% arrange(Sepal.Length)

iris_row_orderd <- iris %>% arrange(desc(Sepal.Length)) #文字列に対応可

iris_row_orderd <- iris %>% arrange(-Sepal.Length) #文字列に対応不可

iris_row_orderd <- iris %>% arrange(Sepal.Length, Petal.Length)

詳細

列の任意並び替え

select関数によって、Petal.Widthを左端に持ってきて、その他の行を右に繋げている。

iris_column_ordered <- iris %>% select(Petal.Width, everything())
head(iris_column_ordered)
> head(iris_column_ordered)
  Petal.Width Sepal.Length Sepal.Width Petal.Length Species
1         0.2          5.1         3.5          1.4  setosa
2         0.2          4.9         3.0          1.4  setosa
3         0.2          4.7         3.2          1.3  setosa
4         0.2          4.6         3.1          1.5  setosa
5         0.2          5.0         3.6          1.4  setosa
6         0.4          5.4         3.9          1.7  setosa
> 

複数の行がある場合は、次のようにつなげる。

iris_column_ordered <- iris %>% select(Petal.Length, Species, everything())
head(iris_column_ordered)
> head(iris_column_ordered)
  Petal.Length Species Sepal.Length Sepal.Width Petal.Width
1          1.4  setosa          5.1         3.5         0.2
2          1.4  setosa          4.9         3.0         0.2
3          1.3  setosa          4.7         3.2         0.2
4          1.5  setosa          4.6         3.1         0.2
5          1.4  setosa          5.0         3.6         0.2
6          1.7  setosa          5.4         3.9         0.4

selectの中で利用する便利な関数を使って、指定した条件に合致するものを左に持ってくることも可能。

iris_column_ordered <- iris %>% select(starts_with("Petal"), everything())
head(iris_column_ordered)
> head(iris_column_ordered)
  Petal.Length Petal.Width Sepal.Length Sepal.Width Species
1          1.4         0.2          5.1         3.5  setosa
2          1.4         0.2          4.9         3.0  setosa
3          1.3         0.2          4.7         3.2  setosa
4          1.5         0.2          4.6         3.1  setosa
5          1.4         0.2          5.0         3.6  setosa
6          1.7         0.4          5.4         3.9  setosa

selectの使い方はこちら。

contents-open.hatenablog.com

列の昇順降順ソートによる並び替え

列の名前でソートしたい場合は、ソートされた列名のベクトルを用意すればよい。下に示す例の場合は、列名からcolumn_orderというベクトルを用意して、昇順ソートした。その後、select関数の中で、all_of関数を使って並べ替えている。

column_order <- names(iris) %>% sort()
iris_column_ordered <- iris %>% select(all_of(column_order))
head(iris_column_ordered)
> head(iris_column_ordered)
  Petal.Length Petal.Width Sepal.Length Sepal.Width Species
1          1.4         0.2          5.1         3.5  setosa
2          1.4         0.2          4.9         3.0  setosa
3          1.3         0.2          4.7         3.2  setosa
4          1.5         0.2          4.6         3.1  setosa
5          1.4         0.2          5.0         3.6  setosa
6          1.7         0.4          5.4         3.9  setosa

降順にしたければ、次のようにすればよい。

column_order <- names(iris) %>% sort(decreasing = T)
iris_column_ordered <- iris %>% select(all_of(column_order))
head(iris_column_ordered)
> head(iris_column_ordered)
  Species Sepal.Width Sepal.Length Petal.Width Petal.Length
1  setosa         3.5          5.1         0.2          1.4
2  setosa         3.0          4.9         0.2          1.4
3  setosa         3.2          4.7         0.2          1.3
4  setosa         3.1          4.6         0.2          1.5
5  setosa         3.6          5.0         0.2          1.4
6  setosa         3.9          5.4         0.4          1.7

行の昇順降順ソート

特定の列名でソートする場合は、次のようにすれば良い。

iris_row_orderd <- iris %>% arrange(Sepal.Length)
head(iris_row_orderd)
> head(iris_row_orderd)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          4.3         3.0          1.1         0.1  setosa
2          4.4         2.9          1.4         0.2  setosa
3          4.4         3.0          1.3         0.2  setosa
4          4.4         3.2          1.3         0.2  setosa
5          4.5         2.3          1.3         0.3  setosa
6          4.6         3.1          1.5         0.2  setosa

降順にする場合は次のようにすれば良い。

iris_row_orderd <- iris %>% arrange(desc(Sepal.Length)) #文字列に対応可
head(iris_row_orderd)

iris_row_orderd <- iris %>% arrange(-Sepal.Length) #文字列に対応不可
head(iris_row_orderd)
> head(iris_row_orderd)
  Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
1          7.9         3.8          6.4         2.0 virginica
2          7.7         3.8          6.7         2.2 virginica
3          7.7         2.6          6.9         2.3 virginica
4          7.7         2.8          6.7         2.0 virginica
5          7.7         3.0          6.1         2.3 virginica
6          7.6         3.0          6.6         2.1 virginica

複数の列でソートも可能。

iris_row_orderd <- iris %>% arrange(Sepal.Length, Petal.Length)
head(iris_row_orderd)
> head(iris_row_orderd)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          4.3         3.0          1.1         0.1  setosa
2          4.4         3.0          1.3         0.2  setosa
3          4.4         3.2          1.3         0.2  setosa
4          4.4         2.9          1.4         0.2  setosa
5          4.5         2.3          1.3         0.3  setosa
6          4.6         3.6          1.0         0.2  setosa

【R】データの列および行を条件を指定して抽出する(filter、select)

こんてんつ

データフレームの条件に合う行、列だけ選択して抽出する方法を紹介します。tidyverseパッケージ集の中のdplyrパッケージのfilter関数、select関数を利用します。

早見チートシート

パッケージのインストール&読み込み

install.packages("tidyverse")
library(tidyverse)

行の選択

#数式の条件に合う行のみを抽出

iris %>%
  dplyr::filter(Sepal.Length > 7.5)

iris %>%
  dplyr::filter(Sepal.Length >= 6.7, Sepal.Length <= 7.0)

iris %>%
  dplyr::filter(Sepal.Length > 6.5, Petal.Length > 5.8)

iris %>%
  dplyr::filter(Sepal.Length > 6.5 & Petal.Length > 5.8)

#factor型などの文字列で指定した抽出

iris %>%
  dplyr::filter(Species == "setosa")

iris %>%
  dplyr::filter(Species == "setosa" | Species == "virginica")

iris %>%
  dplyr::filter(Species != "setosa", Species != "virginica")

列の選択

#列名で指定した抽出

iris %>% 
  select(Sepal.Length, Petal.Length)

iris %>% 
  select("Sepal.Length", "Petal.Length")

iris %>%
  select(Sepal.Width:Petal.Width)

#列番号で指定した抽出

iris %>%
  select(1,4)

iris %>%
  select(2:4)

#除外する場合

iris %>%
  select(-Sepal.Width, -Petal.Width)

#特定の文字列を含んだり、部分一致したりする列を抽出

iris %>%
  select(starts_with("Sepal"))

iris %>% 
  select(ends_with(("Width")))

iris %>%
  select(contains("Sepal"))

iris %>%
  select(-contains("Sepal"))

#character型ベクトルでの抽出

char_vec = c("Sepal.Length", "Petal.Length")
iris %>%
  select(all_of(char_vec))

char_vec = c("Sepal.Length", "Petal.Length")
iris %>%
  select(any_of(char_vec))

詳細

行の選択

数式条件の例。条件に合致した行を抽出。,&がANDを表す。|はORを表す。

iris %>%
  dplyr::filter(Sepal.Length > 6.5, Petal.Length > 5.8)

iris %>%
  dplyr::filter(Sepal.Length > 6.5 & Petal.Length > 5.8)

文字列による条件の例。条件に合致した行を抽出。,&がANDを表す。|はORを表す。

iris %>%
  dplyr::filter(Sepal.Width > 3.7, Species == "setosa" | Species == "virginica")

列の選択

列名で指定した例。

iris %>% 
  select(Sepal.Length, Petal.Length)

iris %>% 
  select("Sepal.Length", "Petal.Length")

列番号で指定した例。

iris %>%
  select(1,4)

:で範囲を指定した例。

iris %>%
  select(2:4)

-によって除外した例。

iris %>%
  select(-Sepal.Width, -Petal.Width)

starts_withで特定の文字列から始まるものを抽出した例。

iris %>%
  select(starts_with("Sepal"))

containsで特定の文字列を含むものを抽出した例。

iris %>%
  select(contains("Sepal"))

-containsで特定の文字列を含むものを除外した例。

iris %>%
  select(-contains("Sepal"))

character型ベクトルでの抽出の例。all_ofは一致しないものがあった場合エラーを返す。any_ofは一致しないものがあっても無視してプログラムを回す。

char_vec = c("Sepal.Length", "Petal.Length")
iris %>%
  select(all_of(char_vec))

char_vec = c("Sepal.Length", "Petal.Length")
iris %>%
  select(any_of(char_vec))

ベクトル・テンソルの、内積・テンソル積の様々な表記

こんてんつ

今回は、連続体力学で利用する、

について、次の様々な表記方法について整理する。

  • 数ベクトル、行列による表記
  • 直交基底による表記
  • 総和規約に基づく指標表記

参考記事

ベクトル、テンソルそのものについては、下記のページを参考。 contents-open.hatenablog.com

ベクトルの内積

数ベクトルによる表記

 \displaystyle
\begin{eqnarray}
\boldsymbol{u} \cdot \boldsymbol{v} &=& \{u\}^{T} \{v\} \\
&=& 
 \begin{Bmatrix}
u_1 & u_2 & u_3
 \end{Bmatrix} 
 \begin{Bmatrix}
 v_1 \\
 v_2 \\
 v_3
\end{Bmatrix} 
\end{eqnarray}

直交基底による表記

 \displaystyle
\begin{eqnarray}
\boldsymbol{u} \cdot \boldsymbol{v} =&& (u_1 \boldsymbol{e}_1 +  u_2 \boldsymbol{e}_2 +  u_3 \boldsymbol{e}_3) \cdot (v_1 \boldsymbol{e}_1 +  v_2 \boldsymbol{e}_2 +  v_3 \boldsymbol{e}_3) \\
=&& u_1 v_1 (\boldsymbol{e}_1 \cdot \boldsymbol{e}_1) + u_1 v_2 (\boldsymbol{e}_1 \cdot \boldsymbol{e}_2) + u_1 v_3 (\boldsymbol{e}_1 \cdot \boldsymbol{e}_3) \\
&& \; +u_2 v_1 (\boldsymbol{e}_2 \cdot \boldsymbol{e}_1) + u_2 v_2 (\boldsymbol{e}_2 \cdot \boldsymbol{e}_2) + u_2 v_3 (\boldsymbol{e}_2 \cdot \boldsymbol{e}_3) \\
&& \; \; +u_3 v_1 (\boldsymbol{e}_3 \cdot \boldsymbol{e}_1) + u_3 v_2 (\boldsymbol{e}_3 \cdot \boldsymbol{e}_2) + u_3 v_3 (\boldsymbol{e}_3 \cdot \boldsymbol{e}_3) \\
=&& u_1 v_1 + u_2 v_2 + u_3 v_3
\end{eqnarray}

直交基底と総和規約を組み合わせた表記

 \displaystyle
\begin{eqnarray}
\boldsymbol{u} \cdot \boldsymbol{v} &=& (u_i \boldsymbol{e}_i) \cdot (u_j \boldsymbol{e}_j)\\
&=& u_i v_j (\boldsymbol{e}_i \cdot \boldsymbol{e}_j)\\
&=& u_i v_i
\end{eqnarray}

総和規約に基づく指標表記

 \displaystyle
\boldsymbol{u} \cdot \boldsymbol{v} \rightarrow u_i v_i

ベクトルのテンソル

数ベクトル、行列による表記

 \displaystyle
\begin{eqnarray}
\boldsymbol{u} \otimes \boldsymbol{v} &=& \{u\} \{v\}^{T} \\
&=& 
 \begin{Bmatrix}
 u_1 \\
 u_2 \\
 u_3
 \end{Bmatrix} 
 \begin{Bmatrix}
v_1 & v_2 & v_3
\end{Bmatrix} \\
&=&
 \begin{Bmatrix}
u_1 v_1 & u_1 v_2 & u_1 v_3 \\
u_2 v_1 & u_2 v_2 & u_2 v_3 \\
u_3 v_1 & u_3 v_2 & u_3 v_3 
\end{Bmatrix} \\
\end{eqnarray}

直交基底による表記

 \displaystyle
\begin{eqnarray}
\boldsymbol{u} \otimes \boldsymbol{v} =&&  (u_1 \boldsymbol{e}_1 +  u_2 \boldsymbol{e}_2 +  u_3 \boldsymbol{e}_3) \otimes (v_1 \boldsymbol{e}_1 +  v_2 \boldsymbol{e}_2 +  v_3 \boldsymbol{e}_3) \\
=&& u_1 v_1 (\boldsymbol{e}_1 \otimes \boldsymbol{e}_1) + u_1 v_2 (\boldsymbol{e}_1 \otimes \boldsymbol{e}_2) + u_1 v_3 (\boldsymbol{e}_1 \otimes \boldsymbol{e}_3) \\
&& \; +u_2 v_1 (\boldsymbol{e}_2 \otimes \boldsymbol{e}_1) + u_2 v_2 (\boldsymbol{e}_2 \otimes \boldsymbol{e}_2) + u_2 v_3 (\boldsymbol{e}_2 \otimes \boldsymbol{e}_3) \\
&& \; \; +u_3 v_1 (\boldsymbol{e}_3 \otimes \boldsymbol{e}_1) + u_3 v_2 (\boldsymbol{e}_3 \otimes \boldsymbol{e}_2) + u_3 v_3 (\boldsymbol{e}_3 \otimes \boldsymbol{e}_3)
\end{eqnarray}

直交基底と総和規約を組み合わせた表記

 \displaystyle
\begin{eqnarray}
\boldsymbol{u} \otimes \boldsymbol{v} &=&  (u_i \boldsymbol{e}_i) \otimes (v_j \boldsymbol{e}_j) \\
&=& u_i v_j (\boldsymbol{e}_i \otimes \boldsymbol{e}_j) 
\end{eqnarray}

2階テンソル内積

行列による表記

 \displaystyle
\begin{eqnarray}
\boldsymbol{A} \colon \boldsymbol{B} 
&=& 
 \begin{Bmatrix}
A_{11} & A_{12} & A_{13} \\
A_{21} & A_{22} & A_{23} \\
A_{31} & A_{32} & A_{33} \\
 \end{Bmatrix} 
 \begin{Bmatrix}
B_{11} & B_{12} & B_{13} \\
B_{21} & B_{22} & B_{23} \\
B_{31} & B_{32} & B_{33} \\
\end{Bmatrix} \\
&=&
 \begin{Bmatrix}
A_{11}B_{11}+ A_{12}B_{21} + A_{13}B_{31} & A_{11}B_{12}+ A_{12}B_{22} + A_{13}B_{32} & A_{11}B_{13}+ A_{12}B_{23} + A_{13}B_{33} \\
A_{21}B_{11}+ A_{22}B_{21} + A_{23}B_{31} & A_{21}B_{12}+ A_{22}B_{22} + A_{23}B_{32} & A_{21}B_{13}+ A_{22}B_{23} + A_{23}B_{33} \\
A_{31}B_{11}+ A_{32}B_{21} + A_{33}B_{31} & A_{31}B_{12}+ A_{32}B_{22} + A_{33}B_{32} & A_{31}B_{13}+ A_{32}B_{23} + A_{33}B_{33} \\
\end{Bmatrix} 
\end{eqnarray}

直交基底と総和規約を組み合わせた表記

 \displaystyle
\begin{eqnarray}
\boldsymbol{A} \colon \boldsymbol{B}  &=& [A_{ij}(\boldsymbol{e}_i \otimes \boldsymbol{e}_j) ] \colon [B_{kl}(\boldsymbol{e}_k \otimes \boldsymbol{e}_l) ] \\
&=& A_{ij} B_{kl}  [ (\boldsymbol{e}_i \otimes \boldsymbol{e}_j) \colon (\boldsymbol{e}_k \otimes \boldsymbol{e}_l) ]   \\
&=& A_{ij} B_{kl}  [ (\boldsymbol{e}_j \cdot \boldsymbol{e}_k) (\boldsymbol{e}_i \otimes \boldsymbol{e}_l) ]   \\
&=& A_{ij} B_{jl}  (\boldsymbol{e}_i \otimes \boldsymbol{e}_l)    
\end{eqnarray}

総和規約に基づく指標表記

 \displaystyle
\boldsymbol{A} \colon \boldsymbol{B}  \rightarrow A_{ij} B_{ij}

ベクトル・テンソルの、直交基底・総和規約による表記

こんてんつ

ベクトル及びテンソル(1階のテンソル及び2階のテンソル)について、次の様々な表記方法について整理する。

  • 数ベクトル、行列による表記
  • 直交基底による表記
  • 総和規約に基づく指標表記

ベクトル(1階のテンソル

数ベクトルによる表記

\displaystyle
\boldsymbol{u}
 =
\begin{Bmatrix}
 u_1 \\
 u_2 \\
 u_3
\end{Bmatrix}

直交基底による表記

\displaystyle
\boldsymbol{u} = u_1 \boldsymbol{e}_1 +  u_2 \boldsymbol{e}_2 +  u_3 \boldsymbol{e}_3

総和規約に基づく指標表記

\displaystyle
\boldsymbol{u} \rightarrow u_i

テンソル(2階のテンソル

行列による表記

\displaystyle
\boldsymbol{A}
 =
\begin{Bmatrix}
 A_{11} & A_{12} & A_{13}\\
 A_{21} & A_{22} & A_{23} \\
 A_{31} & A_{32} & A_{33}
\end{Bmatrix}

直交基底による表記

\displaystyle
\begin{eqnarray}
\boldsymbol{A} =  && A_{11} ( \boldsymbol{e}_1 \otimes \boldsymbol{e}_1) +
A_{12} ( \boldsymbol{e}_1 \otimes \boldsymbol{e}_2) +
A_{13} ( \boldsymbol{e}_1 \otimes \boldsymbol{e}_3) + \\
&& \; A_{21} ( \boldsymbol{e}_2 \otimes \boldsymbol{e}_1) +
A_{22} ( \boldsymbol{e}_2 \otimes \boldsymbol{e}_2) +
A_{23} ( \boldsymbol{e}_2 \otimes \boldsymbol{e}_3) + \\
&& \; \; A_{31} ( \boldsymbol{e}_3 \otimes \boldsymbol{e}_1) +
A_{32} ( \boldsymbol{e}_3 \otimes \boldsymbol{e}_2) +
A_{33} ( \boldsymbol{e}_3 \otimes \boldsymbol{e}_3) 
\end{eqnarray}

直交基底と総和規約を組み合わせた表記

\displaystyle
\boldsymbol{A} = A_{ij} ( \boldsymbol{e}_i \otimes \boldsymbol{e}_j)

総和規約に基づく指標表記

\displaystyle
\boldsymbol{A} \rightarrow A_{ij}

補足

総和規約に基づく指標表記のことを、

  • 自由指標による表記
  • ダミー指標による表記

と言うことがある。それぞれ、総和規約という二つの具体的なルールを指している。

参考

内積テンソル積については、次を参考。 contents-open.hatenablog.com