RustのarrayとVec

つぎのRustコードは、rustc 1.51.0でコンパイル、実行できました。

#![allow(unused)]
fn main() {
    let mut x: [i32; 2] = [0,1];
    let mut a1 = [x, [0,0]];
    let mut a2 = [x, [0,0]];
    assert_eq!(a1, [[0,1],[0,0]]);
    x[0] = 100;
    assert_eq!(x, [100,1]);
    assert_eq!(a1, [[0,1],[0,0]]);

    let mut y: Vec<i32> = vec![0,1];
    let mut v1 = vec![y, vec![0,0]]; // move
    assert_eq!(v1, [[0,1],[0,0]]);
    // y[0] = 100; // error
    // let mut v2 = vec![y, vec![0,0]]; // error
}


ここまでは事実です。


ここからは私の感想です。コードのarrayの挙動に違和感を感じました。arrayとVecはパラレルだと思い込んでいたからです。arrayのボローチェッカーをすり抜けるような挙動が想定外でした。

(原因の推測を削除しました。間違っていました。お詫び申し上げます。)

(追記 2021年4月22日)
スライス slice https://doc.rust-lang.org/std/primitive.slice.html
に関しても少し試してみます。

fn main() {
    let mut a = [1,2,3];
    let tmp = &mut a[1..];
    a[1] = 100;
    tmp[0] = 200;
}

この結果はコンパイルエラーです。

error[E0506]: cannot assign to `a[_]` because it is borrowed
  --> src\main.rs:54:5
   |
53 |     let tmp = &mut a[1..];
   |                    - borrow of `a[_]` occurs here
54 |     a[1] = 100;
   |     ^^^^^^^^^^ assignment to borrowed `a[_]` occurs here
55 |     tmp[0] = 200;
   |     ------ borrow later used here


代入の順番を変えてみます。

fn main() {
    let mut a = [1,2,3];
    let tmp = &mut a[1..];
    tmp[0] = 200;
    a[1] = 100;
}

コンパイルできます。

代入の順番を変えただけです。
なぜ、代入の順番と所有権が関係あるのか分かりません。

私はこの数か月Rustを勉強しています。私はRustで書くのが気に入ってきています。Rustのコンセプトは素晴らしいと思います。初めてのRust記事でネガティブなことを書いて申し訳ないです。本当は書きたくないのです。

arrayとsliceに関して rustc 1.51.0 のボローチェッカーは一貫性に欠けていて、おかしいと思います。ボローチェッカーのダブルスタンダードには、不安を感じます。

三角関数の加法定理と余弦定理の証明

以前、三角関数の加法定理の導出を書きました。これが、加法定理の証明になっていないことに気づきました。(論理的循環が入り込んでいました。)
該当記事を削除しました。誠に申し訳ございませんでした。お詫び申し上げます。


このページでは、三角関数を定義し、三角関数の加法定理と余弦定理の証明を書きます。
このページの全ての定義や定理、系は既に知られています。証明に関しても新規性はありません。余弦定理の証明は、余弦定理 - Wikipediaに書かれている証明と同じです。

このページには、線型代数*1, *2の内容が含まれています。そのため、このページでの証明は中高の教育課程から(おそらく)外れています。

(中高の教育課程内で三角関数の加法定理の証明を書かれている方もいらっしゃいます。お探しの方は、検索してください。)




定義 1 (円周率) *3
半径1の円(単位円)の円周の長さが 2\piとなるように \piを定めます。


定義 2 (ラジアン*4
半径1の円弧の長さが \thetaであるとき、
その円弧の角度を \theta ラジアンと定めます。

角度の符号を次のように定めます:
反時計回りを正とし、
時計回りを負とします。

以下、角度の単位はラジアンとします。
次に、三角関数を定義します。


定義 3三角関数 *5

f:id:nibosiiwasi:20190303234523j:plain:w300
図1. 三角関数の定義

与えられた  \theta \in \mathbb{R} に対し、
極座標  (1,\theta) で表される点から
直交座標  (x(\theta),y(\theta))
が得られます。

(注)  \mathbb{R}は実数の全体集合です*6

関数 \cos: \mathbb{R} \to \mathbb{R},  \sin: \mathbb{R} \to \mathbb{R} を次のように定めます:
 \cos \theta := x(\theta),  \sin \theta := y(\theta).
(図1を参照して下さい。)

( \cos  \sin は関数としてwell-definedです。)

さらに、関数  \tan: \mathbb{R}\backslash\left\{ \frac{\pi}{2}+n\pi ; \; n \in \mathbb{Z} \right\} \to \mathbb{R} \displaystyle \tan \theta := \frac{\sin \theta}{\cos \theta} と定義します。

(注)  \mathbb{Z}は整数の全体集合です。




定理 1
 \cos^2 \theta + \sin^2 \theta =1.

証明
三平方の定理より。*7(証明終)



定理 2
 \cos (-\theta) = \cos \theta,
 \sin (-\theta) = - \sin \theta.

証明

f:id:nibosiiwasi:20190310141947j:plain:w300
図2
図2と三角関数の定義より(証明終)




定義 4
集合 \mathbb{R}^2 \mathbb{R}^2 := \left\{ \begin{bmatrix} x \\ y \end{bmatrix} ; \; x, y \in \mathbb{R} \right\}と定義します。さらに、 \mathbb{R}^2の元に対して和とスカラー倍を次のように定義します:
 \begin{bmatrix} x_1 \\ y_1 \end{bmatrix}, \begin{bmatrix} x_2 \\ y_2 \end{bmatrix} \in \mathbb{R}^2,  c \in \mathbb{R}とします。このとき、
 \begin{bmatrix} x_1 \\ y_1 \end{bmatrix} + \begin{bmatrix} x_2 \\ y_2 \end{bmatrix} 
:=
\begin{bmatrix} x_1 + x_2 \\ y_1 + y_2 \end{bmatrix},
 c \begin{bmatrix} x_1 \\ y_1 \end{bmatrix}
:=
\begin{bmatrix} c x_1 \\ c y_1 \end{bmatrix}
と定義します。

(注)このとき、 \begin{bmatrix} x_1 + x_2 \\ y_1 + y_2 \end{bmatrix}, 
\begin{bmatrix} c x_1 \\ c y_1 \end{bmatrix} \in \mathbb{R}^2 です。



以下では、行列の演算を行います。行列の演算については、線型代数の教科書や https://ja.wikipedia.org/wiki/行列 などを参照して下さい。




定理 3
与えられた \theta \in \mathbb{R}に対し、行列 R(\theta)
 R(\theta) := 
\begin{bmatrix}
\cos \theta & - \sin \theta \\
\sin \theta & \cos \theta
\end{bmatrix}
とします。
写像 T_{\theta}: \mathbb{R}^2 \to \mathbb{R}^2 T_{\theta}(v) := R(\theta) v とします。
このとき、 T_{\theta}(v)はベクトル v \in \mathbb{R}^2を原点中心に角度 \theta 回転させたベクトルです。
(このことから、 R(\theta)は回転行列*8, *9と呼ばれます。)

証明
まず、 e_1,  e_2 \mathbb{R}^2 の標準基底とします。つまり、 e_1 := \begin{bmatrix}1 \\ 0 \end{bmatrix},  e_2 := \begin{bmatrix}0 \\ 1 \end{bmatrix} とします。
与えられた v \in \mathbb{R}^2に対して、
 v= a_1 e_1 + a_2 e_2
を満たす a_1 \in \mathbb{R}, a_2 \in \mathbb{R}が一意的に存在します。

このとき、
 T_{\theta}(v)= T_{\theta}(a_1 e_1 + a_2 e_2)
 \quad \quad \; \;=\begin{bmatrix}
\cos \theta & - \sin \theta \\
\sin \theta & \cos \theta
\end{bmatrix}
(a_1 e_1 + a_2 e_2)
 \quad \quad \; \; =
a_1
\begin{bmatrix}
\cos \theta & - \sin \theta \\
\sin \theta & \cos \theta
\end{bmatrix}
e_1
+
a_2
\begin{bmatrix}
\cos \theta & - \sin \theta \\
\sin \theta & \cos \theta
\end{bmatrix}
e_2
 \quad \quad \; \; =a_1 T_{\theta}(e_1) + a_2 T_{\theta}(e_2).
さらに、 T_{\theta}(e_1)=\begin{bmatrix} \cos\theta \\ \sin\theta \end{bmatrix},  T_{\theta}(e_2) = \begin{bmatrix} -\sin \theta \\ \cos \theta \end{bmatrix}は、それぞれ e_1 , e_2
角度 \theta回転させたベクトルであるから(図3)、
それらの一次結合である T_{\theta}(v) vを角度 \theta 回転させたベクトルです(図4 を参照して下さい。図4 は、例として 3e_1 + e_2を原点中心に角度 \theta 回転させた図です)。

f:id:nibosiiwasi:20190310145855j:plainf:id:nibosiiwasi:20190310150020j:plain
図3. 標準基底の回転。左は e_1 の回転、右は e_2 の回転


f:id:nibosiiwasi:20190310150224j:plainf:id:nibosiiwasi:20190310150447j:plain
図4. 平面ベクトルの回転。左は回転前、右は回転後

(証明終)




定理 4
 \alpha \in \mathbb{R}, \beta \in \mathbb{R}とします。このとき、
 T_{\alpha + \beta} = T_{\alpha} \circ T_{\beta} = T_{\beta} \circ T_{\alpha}

(注)  \circ は合成写像を表す記号です。

証明
写像 T_{\alpha + \beta} は角度  \alpha + \beta 回転させる。
写像 T_{\alpha} \circ T_{\beta} は、角度 \beta回転させた後、角度 \alpha回転させる。
写像 T_{\beta} \circ T_{\alpha} は、角度 \alpha回転させた後、角度 \beta回転させる。
これらの写像は、すべて等しいです。 (証明終)

系 1
 R(\alpha + \beta) = R(\alpha)R(\beta) = R(\beta)R(\alpha)

証明
まず、 e_1 := \begin{bmatrix}1 \\ 0 \end{bmatrix},  e_2 := \begin{bmatrix}0 \\ 1 \end{bmatrix}とし、 I := \begin{bmatrix} 1 & 0 \\ 0 & 1\end{bmatrix} とします。

定理 4 より、
 T_{\alpha + \beta}(e_1) = T_{\alpha} \circ T_{\beta}(e_1) = T_{\beta} \circ T_{\alpha}(e_1),
 T_{\alpha + \beta}(e_2) = T_{\alpha} \circ T_{\beta}(e_2) = T_{\beta} \circ T_{\alpha}(e_2).

よって、
 R(\alpha + \beta) e_1 = R(\alpha)R(\beta)e_1 = R(\beta)R(\alpha) e_1,
 R(\alpha + \beta) e_2 = R(\alpha)R(\beta)e_2 = R(\beta)R(\alpha) e_2.

よって、
 R(\alpha + \beta) I = R(\alpha)R(\beta)I = R(\beta)R(\alpha) I.

よって、
 R(\alpha + \beta) = R(\alpha)R(\beta) = R(\beta)R(\alpha). (証明終)



定理 5三角関数の加法定理 *10
 \cos (\alpha \pm \beta) = \cos \alpha \cos \beta \mp \sin \alpha \sin \beta,
 \sin (\alpha \pm \beta) = \sin \alpha \cos \beta \pm \cos \alpha \sin \beta,
 \displaystyle
\tan(\alpha \pm \beta) = \frac{\tan \alpha \pm \tan \beta}{1 \mp \tan \alpha \tan \beta}.
(複号同順)


証明
系1 より、 R(\alpha + \beta) = R(\alpha)R(\beta).

 R(\alpha + \beta)=
\begin{bmatrix}
\cos (\alpha + \beta) & - \sin (\alpha + \beta) \\
\sin (\alpha + \beta) & \cos (\alpha + \beta)
\end{bmatrix}.

また、
 R(\alpha)R(\beta)=
\begin{bmatrix}
\cos \alpha & - \sin \alpha \\
\sin \alpha & \cos \alpha
\end{bmatrix}
\begin{bmatrix}
\cos \beta & - \sin \beta \\
\sin \beta & \cos \beta
\end{bmatrix}
 
\quad \quad \quad \quad \;=
\begin{bmatrix}
\cos \alpha \cos \beta - \sin \alpha \sin \beta & - \cos \alpha \sin \beta - \sin \alpha \cos \beta \\
\sin \alpha \cos \beta + \cos \alpha \sin \beta & -\sin \alpha \sin \beta + \cos \alpha \cos \beta
\end{bmatrix}.

よって、
 \cos (\alpha + \beta) = \cos \alpha \cos \beta - \sin \alpha \sin \beta,
 \sin (\alpha + \beta) = \sin \alpha \cos \beta + \cos \alpha \sin \beta.

これと、 \cos(-\beta) = \cos \beta,  \sin (-\beta)= - \sin \betaより、
 \cos (\alpha - \beta) = \cos \alpha \cos \beta + \sin \alpha \sin \beta,
 \sin (\alpha - \beta) = \sin \alpha \cos \beta - \cos \alpha \sin \beta.

さらに、
 \displaystyle
\tan(\alpha + \beta) = \frac{\sin(\alpha + \beta)}{\cos (\alpha + \beta)}
= \frac{\sin \alpha \cos \beta + \cos \alpha \sin \beta}{\cos \alpha \cos \beta - \sin \alpha \sin \beta}
= \frac{\tan \alpha + \tan \beta}{1 - \tan \alpha \tan \beta}.

 \displaystyle
\tan(\alpha - \beta) = \frac{\sin(\alpha - \beta)}{\cos (\alpha - \beta)}
= \frac{\sin \alpha \cos \beta - \cos \alpha \sin \beta}{\cos \alpha \cos \beta + \sin \alpha \sin \beta}
= \frac{\tan \alpha - \tan \beta}{1 + \tan \alpha \tan \beta}.
(証明終)



ここまでが、三角関数の加法定理の証明です。

ここからは、余弦定理の証明(とそのための準備)をします。

定義 5
写像 \langle \cdot, \cdot \rangle: \mathbb{R}^2 \times \mathbb{R}^2 \to \mathbb{R}
を次の式で与えます:  \langle v_1, v_2 \rangle := v_1^T v_2.

(注)このとき、写像 \langle \cdot, \cdot \rangle: \mathbb{R}^2 \times \mathbb{R}^2 \to \mathbb{R} は、内積の公理*11を満たします。証明は省略します。

さらに、 v \in \mathbb{R}^2に対して \|v\| := \sqrt{\langle v,v \rangle}と定めます。

(注)このとき、与えられた v \in \mathbb{R}^2 v =\begin{bmatrix} x \\y \end{bmatrix}と書くと、
 \|v\|=\sqrt{\begin{bmatrix} x & y \end{bmatrix} \begin{bmatrix} x \\y \end{bmatrix}}=\sqrt{x^2+y^2}
となります。

(注) このとき、 \| \cdot \|: \mathbb{R}^2 \to [0,+\infty) はノルムの公理*12を満たします。




定理 6
 v_1, v_2 \in \mathbb{R}^2と仮定します。さらに、 \theta\in \mathbb{R}と仮定します。
このとき、
 \langle T_{\theta}(v_1), T_{\theta}(v_2)\rangle = \langle v_1 , v_2 \rangle.

証明
 \quad \langle T_{\theta}(v_1), T_{\theta}(v_2)\rangle
 =v_1^T 
\begin{bmatrix}
\cos \theta & - \sin \theta \\
\sin \theta & \cos \theta
\end{bmatrix}^T
\begin{bmatrix}
\cos \theta & - \sin \theta \\
\sin \theta & \cos \theta
\end{bmatrix}
v_2
 =v_1^T 
\begin{bmatrix}
\cos \theta & \sin \theta \\ - \sin \theta & \cos \theta
\end{bmatrix}
\begin{bmatrix}
\cos \theta & - \sin \theta \\
\sin \theta & \cos \theta
\end{bmatrix}
v_2
 =v_1^T 
\begin{bmatrix}
1 & 0 \\
0 & 1
\end{bmatrix}
v_2
 =v_1^T 
v_2
 = \langle v_1, v_2 \rangle.

(証明終)



系 2
 v \in \mathbb{R}^2と仮定します。さらに、 \theta\in \mathbb{R}と仮定します。
このとき、
 \| T_{\theta}(v) \| = \| v \|.

証明
定理 6 より
 \langle T_{\theta}(v), T_{\theta}(v)\rangle = \langle v , v \rangle.

定義 5より、
 \| T_{\theta}(v) \|^2 = \| v \|^2.

さらに、 \| T_{\theta}(v) \| \ge 0, \;  \| v \| \ge 0 であるから、
 \| T_{\theta}(v) \| = \| v \|.
(証明終)

(注)この系2 は、ベクトルを回転させてもベクトルのノルムは不変であることを意味しています。



定理 7
 v_1, v_2 \in \mathbb{R}^2と仮定します。
さらに、 \theta \in \mathbb{R} v_1 v_2の狭角とします。
このとき、 \langle v_1, v_2 \rangle =\|v_1\| \|v_2\| \cos \theta .

証明

f:id:nibosiiwasi:20190316202029j:plainf:id:nibosiiwasi:20190316202045j:plain
図5. 平面ベクトルの内積。左は回転前、右は回転後

 v_1, v_2 \in \mathbb{R}^2と仮定します。
このとき、 T_{\alpha} (v_2) = \begin{bmatrix} x_2 \\ 0 \end{bmatrix} かつ  x_2 \ge 0 を満たす実数 \alphaが存在します。

実数 x_1, y_1 \begin{bmatrix} x_1 \\ y_1 \end{bmatrix} := T_{\alpha} (v_1) によって与えます。

このとき、
 \langle v_1, v_2 \rangle
= \langle T_{\alpha}(v_1),T_{\alpha}(v_2) \rangle (定理6より)
  \quad \quad \quad \;
= x_1 x_2 + y_1 0
  \quad \quad \quad \;
= x_1 x_2
  \quad \quad \quad \;
= x_1 \|v_2\|     ( x_2 \ge 0 と系2より  x_2 = \|v_2\|)
  \quad \quad \quad \;
= \|v_1\| \|v_2\| \cos \theta ( x_1 = \|T_{\alpha}(v_1)\| \cos \theta = \|v_1\| \cos \theta より)
(証明終)

(注) 定理 7 は( \mathbb{R}^2だけでなく) \mathbb{R}^3に拡張することができます。しかしながら、ここではその証明はしません。


定理 8 余弦定理 *13

f:id:nibosiiwasi:20190316230112j:plain:w180
図6. 三角形ABC

三角形 ABCにおいて辺 BCの長さを a, 辺 CAの長さを b, 辺 ABの長さを c さらに  \alpha = \angle{CAB} とします。

このとき、
 a^2 = b^2 + c^2 - 2bc \cos \alpha.


証明
三角形は平面上に書くことができます。
さらに、 xyz空間上のどのような三角形であっても、 xy平面上に合同な三角形を書くことができます。

よって、三角形 ABC xy平面上にあると仮定しても一般性は失われません。

以下では、三角形 ABC xy平面上にあると仮定します。

(このとき、点 A,  B,  C の直交座標をそれぞれ (x_A, y_A),  (x_B, y_B),  (x_C, y_C) とすると、 \overrightarrow{AB}= (x_B - x_A, y_B - y_A),  \overrightarrow{BC} = (x_C - x_B, y_C - y_B),  \overrightarrow{CA} = (x_A - x_C, y_A - y_C) です。
つまり、 \overrightarrow{AB}, \overrightarrow{BC}, \overrightarrow{CA} \in \mathbb{R}^2です。*14

今、
 \left\|\overrightarrow{BC}\right\|^2 = \left\|\overrightarrow{AC} \right\|^2 +\left\| \overrightarrow{AB} \right\|^2  - 2 \left\|\overrightarrow{AB} \right\| \left\|\overrightarrow{AC} \right\| \cos \angle {CAB}.
を示せば十分なので、これを示します。



\overrightarrow{BC}=\overrightarrow{BA}+\overrightarrow{AC} =\overrightarrow{AC}-\overrightarrow{AB}.
よって、

\begin{eqnarray}
\left\|\overrightarrow{BC}\right\|^2
&=& \left\|\overrightarrow{AC}-\overrightarrow{AB}\right\|^2 \\
&=& \left\langle \overrightarrow{AC}-\overrightarrow{AB}, \overrightarrow{AC}-\overrightarrow{AB} \right\rangle \quad \quad (定義5 より) \\
&=& \left\|\overrightarrow{AC} \right\|^2 -\left \langle \overrightarrow{AC}, \overrightarrow{AB} \right\rangle  - \left\langle \overrightarrow{AB}, \overrightarrow{AC} \right\rangle +\left\|\overrightarrow{AB} \right\|^2 \\
&=& \left\|\overrightarrow{AC} \right\|^2 - 2\left\langle \overrightarrow{AB}, \overrightarrow{AC} \right\rangle + \left\|\overrightarrow{AB} \right\|^2 \\
&=& \left\|\overrightarrow{AC} \right\|^2 +\left\| \overrightarrow{AB} \right\|^2  - 2 \left\|\overrightarrow{AB} \right\| \left\|\overrightarrow{AC} \right\| \cos \angle {CAB} \quad \quad (定理7 より)
\end{eqnarray}

(証明終)

新聞読者別の支持率

news.yahoo.co.jp

興味深い記事。ここまで、数字がばらけるのは驚き。

まず、これは(各新聞社の世論調査ではなく)
JX通信社の世論調査結果であるとのことです。


あえて不満をあげるとすれば、(アンケートを取った)各新聞の読者数と年齢層を知りたいと思いました。

しかし、この情報からだけでも、
安倍政権について、かなり世論は割れていると見えます。
また、メディアの論調と読者層は、同調する傾向があるように見えます。

Scheme 代入の練習 (素数)

私は、Schemeで代入を使うのが苦手である。
そこで、次のような練習問題を解いてみる。

問題1:10000以上で、2番目に小さい素数を求めよ。
問題2:10000以上で、n番目に小さい素数を求めよ。
続きを読む

自作数値計算プログラム ほげ

私はmatlab環境がないため、scheme数値計算環境を作り始めた。

一方、世間にはmatlab以外にもscilabpythonのnumpy,scipy等
すぐれた数値計算ライブラリがある。それらは、すぐれている。
それらを使わずに、数値計算環境を自作するのは、とてつもなく非生産的だ
という自覚はある。

初歩的で恥ずかしいのだが、とりあえず、できたところまで
schemeのコードをブログに書くことにした。
今日のブログも、主な目的は私の備忘録である。

続きを読む