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 (ラジアン) *4
半径1の円弧の長さがであるとき、
その円弧の角度を ラジアンと定めます。
角度の符号を次のように定めます:
反時計回りを正とし、
時計回りを負とします。
以下、角度の単位はラジアンとします。
次に、三角関数を定義します。
与えられた に対し、
極座標 で表される点から
直交座標
が得られます。
(注) は実数の全体集合です*6。
関数, を次のように定めます:
, .
(図1を参照して下さい。)
(と は関数としてwell-definedです。)
さらに、関数 を と定義します。
(注) は整数の全体集合です。
定理 1
.
定理 2
,
.
証明図2と三角関数の定義より(証明終)
定義 4
集合をと定義します。さらに、の元に対して和とスカラー倍を次のように定義します:
, とします。このとき、
,
と定義します。
(注)このとき、 です。
以下では、行列の演算を行います。行列の演算については、線型代数の教科書や https://ja.wikipedia.org/wiki/行列 などを参照して下さい。
定理 3
与えられたに対し、行列を
とします。
写像を とします。
このとき、はベクトルを原点中心に角度 回転させたベクトルです。
(このことから、は回転行列*8, *9と呼ばれます。)
証明
まず、, を の標準基底とします。つまり、, とします。
与えられたに対して、
を満たすが一意的に存在します。
このとき、
.
さらに、, は、それぞれ を
角度回転させたベクトルであるから(図3)、
それらの一次結合であるはを角度 回転させたベクトルです(図4 を参照して下さい。図4 は、例としてを原点中心に角度 回転させた図です)。
(証明終)
定理 4
とします。このとき、
(注) は合成写像を表す記号です。
証明
写像 は角度 回転させる。
写像 は、角度回転させた後、角度回転させる。
写像 は、角度回転させた後、角度回転させる。
これらの写像は、すべて等しいです。 (証明終)
系 1
証明
まず、, とし、 とします。
定理 4 より、
,
.
よって、
,
.
よって、
.
よって、
. (証明終)
定理 5(三角関数の加法定理 *10)
,
,
(複号同順)
証明
系1 より、.
.
また、
.
よって、
,
.
これと、, より、
,
.
さらに、
(証明終)
ここまでが、三角関数の加法定理の証明です。
ここからは、余弦定理の証明(とそのための準備)をします。
定義 5
写像
を次の式で与えます: .
(注)このとき、写像 は、内積の公理*11を満たします。証明は省略します。
さらに、に対してと定めます。
(注)このとき、与えられたをと書くと、
となります。
(注) このとき、 はノルムの公理*12を満たします。
定理 6
と仮定します。さらに、と仮定します。
このとき、
.
証明
.
(証明終)
系 2
と仮定します。さらに、と仮定します。
このとき、
.
証明
定理 6 より
.
定義 5より、
.
さらに、 であるから、
.
(証明終)
(注)この系2 は、ベクトルを回転させてもベクトルのノルムは不変であることを意味しています。
定理 7
と仮定します。
さらに、をとの狭角とします。
このとき、.
証明
と仮定します。
このとき、 かつ を満たす実数が存在します。
実数を によって与えます。
このとき、
(定理6より)
( と系2より )
( より)
(証明終)
(注) 定理 7 は(だけでなく)に拡張することができます。しかしながら、ここではその証明はしません。
三角形において辺の長さを, 辺の長さを, 辺の長さを さらに とします。
このとき、
.
証明
三角形は平面上に書くことができます。
さらに、空間上のどのような三角形であっても、平面上に合同な三角形を書くことができます。
よって、三角形が平面上にあると仮定しても一般性は失われません。
以下では、三角形が平面上にあると仮定します。
(このとき、点, , の直交座標をそれぞれ, , とすると、, , です。
つまり、です。*14)
今、
.
を示せば十分なので、これを示します。
よって、
(証明終)
*1:齊藤, "線型代数入門," 東京大学出版会, 1966
*2:山本, "システムと制御の数学," 朝倉書店, 1998
*3:https://ja.wikipedia.org/wiki/円周率
*4:https://ja.wikipedia.org/wiki/ラジアン
*5:https://ja.wikipedia.org/wiki/三角関数
*6:W. Rudin, "Principles of Mathematical Analysis THIRD EDITION," McGRAW-HILL, 1976
*7:https://ja.wikipedia.org/wiki/ピタゴラスの定理
*8:https://ja.wikipedia.org/wiki/回転行列
*9:http://mathworld.wolfram.com/RotationMatrix.html
*10:https://ja.wikipedia.org/wiki/三角関数の公式の一覧
*11:https://en.wikipedia.org/wiki/Inner_product_space
*12:https://en.wikipedia.org/wiki/Norm_(mathematics)