C++で学ぶポリュビオス方陣暗号:文字列を数値に暗号化する方法
本記事では、与えられた文字列をポリュビオス方陣暗号(Polybius Square Cipher)を使って数値に暗号化する方法を解説します。
ポリュビオス方陣暗号とは?
ポリュビオス方陣暗号は、古代ギリシャの歴史家ポリュビオスにちなんで名付けられた暗号方式で、アルファベットを「行番号+列番号」の組み合わせからなる数値へ変換するための表を使用します。
英語の場合、26個のアルファベットを5×5=25マスの表に収める必要があるため、「I」と「J」は同じマスにまとめて配置されるのが一般的です。
以下は、ポリュビオス方陣の基本形です。
| 1 | 2 | 3 | 4 | 5 | |
| 1 | A | B | C | D | E |
| 2 | F | G | H | I / J | K |
| 3 | L | M | N | O | P |
| 4 | Q | R | S | T | U |
| 5 | V | W | X | Y | Z |
表の中の文字はランダムに入れ替えても構いません。また、扱う言語のアルファベット数に応じて、表のサイズを変更することも可能です。
具体例
実際の入出力例を見てみましょう。
- 入力:Hello
- 出力:2315313134
「H」は2行3列目なので「23」、「E」は1行5列目なので「15」、「L」は3行1列目なので「31」、「O」は3行4列目なので「34」。これらを順に連結すると「2315313134」になります。
この問題を解くには、各文字について対応する行番号と列番号を計算し、それらを連結して出力するプログラムを作成します。
C++での実装例
以下は、上記の考え方を実装したサンプルプログラムです。
#include <cmath>
#include <iostream>
using namespace std;
// 文字列をポリュビオス方陣の数値に変換する関数
void LetterToNumber(string str) {
int R, C;
for (int i = 0; str[i]; i++) {
// 文字コードから行番号と列番号を算出
R = ceil((str[i] - 'a') / 5) + 1;
C = ((str[i] - 'a') % 5) + 1;
if (str[i] == 'k') {
// 「K」は2行5列目に配置
R = R - 1;
C = 5 - C + 1;
}
else if (str[i] >= 'j') {
// 「J」以降の文字は1つずつ左にずらす
if (C == 1) {
C = 6;
R = R - 1;
}
C = C - 1;
}
cout << R << C;
}
cout << endl;
}
int main() {
string str = "tutorialspoint";
cout << "The numeric encryption of string '" << str << "' is : ";
LetterToNumber(str);
return 0;
}
実行結果
The numeric encryption of string 'tutorialspoint' is: 4445443442241131433534243344
プログラムのポイント
- 文字の位置は
c - 'a'で求められます(a=0、b=1、…)。 - 行番号Rは「位置 ÷ 5」、列番号Cは「位置 % 5」から計算できます。
- 「I」と「J」が同じマス(2行4列)を共有するため、「J」以降の文字は列番号を1つ詰める処理が必要になります。
- 「K」は2行5列目へ移動させるため、個別の条件分岐で処理しています。
なお、この実装では小文字の英字のみを想定している点に注意してください。大文字や記号を扱う場合は、事前に小文字へ正規化するなどの前処理を追加するとよいでしょう。
-
C++で正方形の外接円の面積を求める方法
本記事では、正方形の一辺の長さが与えられたときに、その正方形の外接円の面積を求める方法について解説します。まず、理解を深めるために基本的な定義をおさらいしましょう。 基本用語の定義 正方形:すべての辺の長さが等しい四角形のことです。 外接円:多角形のすべての頂点に接する円のことです。 面積:二次元図形の広がりの大きさを数量的に表したものです。 外接円の面積の求め方 正方形の外接円の面積を計算するには、円と正方形それぞれのパラメータの間にある関係を見つける必要があります。 下の図のように、正方形のすべての頂点が円に接しています。この図から読み取れる重要な性質は、正方形の対角線の長さが円の直径
-
C++で正方形の面積を求めるプログラムの書き方
本記事では、正方形の一辺が与えられたときに、その一辺をもとに正方形の面積を計算して出力するC++プログラムを紹介します。 正方形とは 正方形とは、4つの辺と4つの角(すべて90度)を持つ2次元の平面図形であり、すべての辺の長さが等しいという特徴があります。言い換えれば、正方形とは「すべての辺の長さが等しい長方形」の一種であるとも言えます。 正方形のイメージは以下の通りです。 正方形の面積 = 一辺 × 一辺 入力例と出力例 入力:6 出力:36 一辺が6なので、出力は 6×6=36 となります。 入力:12 出力:144 アルゴリズム 処理の流れは以下のようになります。 関数 int m