概要
高効率言語Rust 書き方作り方のSection9に関して
シーザー暗号でPythonと比較している割に26足している理由が明記されてなかったので調べてみる
結論が見たい方は最後まで飛ばしてください
試行錯誤した経緯が書かれているだけなので...
コード
本に書いているコードは書けないので簡単に説明
- Python
該当文字コード = (該当文字コード - 'A'の文字コード + Shift分の数値) % AからZまでの文字数26 + 'A'の文字コード
- Rust
該当文字コード = (該当文字コード - 'A'の文字コード + Shift分の数値 + 26) % AからZまでの文字数26 + 'A'の文字コード
shiftする数値は3
不明点
何やら最初の括弧内で26を足す記述が増えている
本に記載通りのコードで記載した場合と26の記述だけなしで実行してみる
変換する文字はYOUTUBE
記載通り : BRXWXEH. => YOUTUBE.
26記述なし: BRXWXEH. => ?OUTUBE.
最初のencryptはうまくいっている
26の記載がなければBからYへうまく変換できない
調査1 Rustの文字コード
Aの文字コード: 65
Zの文字コード: 90
全ての文字からAの文字コードを引き3つshiftした分の文字コードを記載する(code - codeA + shift)
- 暗号化
Y(89)===> , 26なし:27, 26あり:53
O(79)===> , 26なし:17, 26あり:43
U(85)===> , 26なし:23, 26あり:49
T(84)===> , 26なし:22, 26あり:48
U(85)===> , 26なし:23, 26あり:49
B(66)===> , 26なし:4, 26あり:30
E(69)===> , 26なし:7, 26あり:33
- 復号化
B(66)===> , 26なし:-2, 26あり:24
R(82)===> , 26なし:14, 26あり:40
X(88)===> , 26なし:20, 26あり:46
W(87)===> , 26なし:19, 26あり:45
X(88)===> , 26なし:20, 26あり:46
E(69)===> , 26なし:1, 26あり:27
H(72)===> , 26なし:4, 26あり:30
調査2 Pythonの文字コード
Aの文字コード: 65
Bの文字コード: 90
- 暗号化
Y(89)===> 26なし27, 26あり53
O(79)===> 26なし17, 26あり43
U(85)===> 26なし23, 26あり49
T(84)===> 26なし22, 26あり48
U(85)===> 26なし23, 26あり49
B(66)===> 26なし4, 26あり30
E(69)===> 26なし7, 26あり33
- 復号化
B(66)===> 26なし-2, 26あり24
R(82)===> 26なし14, 26あり40
X(88)===> 26なし20, 26あり46
W(87)===> 26なし19, 26あり45
X(88)===> 26なし20, 26あり46
E(69)===> 26なし1, 26あり27
H(72)===> 26なし4, 26あり30
調査3 文字コードから文字へ変換する
- Rust
暗号化(26あり)
文字コード66-->B
文字コード82-->R
文字コード88-->X
文字コード87-->W
文字コード88-->X
文字コード69-->E
文字コード72-->H
文字コード46-->.
復号化(26あり)
文字コード89-->Y
文字コード79-->O
文字コード85-->U
文字コード84-->T
文字コード85-->U
文字コード66-->B
文字コード69-->E
文字コード46-->.
暗号化(26なし)
文字コード66-->B
文字コード82-->R
文字コード88-->X
文字コード87-->W
文字コード88-->X
文字コード69-->E
文字コード72-->H
文字コード46-->.
復号化(26なし)
文字コード63-->?
文字コード79-->O
文字コード85-->U
文字コード84-->T
文字コード85-->U
文字コード66-->B
文字コード69-->E
文字コード46-->.
- Python
暗号化
文字コード66-->B
文字コード82-->R
文字コード88-->X
文字コード87-->W
文字コード88-->X
文字コード69-->E
文字コード72-->H
文字コード46-->.
復号化
文字コード89-->Y
文字コード79-->O
文字コード85-->U
文字コード84-->T
文字コード85-->U
文字コード66-->B
文字コード69-->E
文字コード46-->.
調査4 Bを入力にした際の復号化の挙動(26なし)
Python
(Bの文字コード66 - Aの文字コード65 + -3(暗号化が3なので復号化は-3)) % 26 + Aの文字コード
=(1 - 3) % 26 + 65
=-2 % 26 + 65
=24 + 65
=89
Rust
(Bの文字コード66 - Aの文字コード65 + -3(暗号化が3なので復号化は-3)) % 26 + Aの文字コード
=(1-3) % 26 + 65
=-2 + 65
=63
結論
PythonとRustでの計算の挙動が異なるため