base.py プログラム技術ドキュメント

プログラムの動作

base.py プログラムは、与えられた数値をある基数(進数)から別の基数に変換することを目的としています。このプログラムは、コマンドライン引数として変換したい数値、その数値が表現されている元の基数、および変換先の基数を受け取ります。

主な機能は以下の通りです。

  1. コマンドライン引数の解析とバリデーション: プログラムの実行に必要な引数が正しく提供されているか、および基数が有効な範囲(2進数から36進数まで)にあるかを確認します。

  2. ソース基数から10進数への変換: 与えられた数値を、一旦10進数に変換します。この際、各桁の重み付けされた合計を計算します。

  3. 10進数からターゲット基数への変換: 10進数に変換された数値を、目標とする基数に変換します。これは繰り返し除算と剰余の計算によって行われます。

このプログラムは、異なる基数表記間の数値変換という一般的な課題を、詳細な計算過程を出力しながら解決します。

原理

プログラムは大きく二つの段階で基数変換を行います。

1. ソース基数から10進数への変換

これは、各桁の数値にその桁の重みを掛けて合計するという標準的な方法に基づいています。 \(N = (d_k d_{k-1} \dots d_1 d_0)_b\) で表現される数値(ここで \(b\) はソース基数、\(d_i\) は各桁の数字)を10進数に変換する場合、以下の式が適用されます。

\[N_{10} = d_k \cdot b^k + d_{k-1} \cdot b^{k-1} + \dots + d_1 \cdot b^1 + d_0 \cdot b^0\]

プログラムでは、val 文字列の右端(最下位桁)から順に、i-th digit (0から始まる) に対して \(d_i \cdot b^i\) を計算し、それを合計していきます。例えば、1A (16進数) を10進数に変換する場合:

  • 最下位桁 (\(A_{16}\)) は \(10_{10}\) に対応。\(10 \cdot 16^0 = 10\)

  • 次の桁 (\(1_{16}\)) は \(1_{10}\) に対応。\(1 \cdot 16^1 = 16\)

  • 合計は \(10 + 16 = 26_{10}\) となります。

2. 10進数からターゲット基数への変換

この変換は、繰り返し除算と剰余の原理に基づいています。10進数 \(N_{10}\) をターゲット基数 \(B\) に変換する場合、以下の手順を繰り返します。

  1. \(N_{10}\)\(B\) で割り、商 \(Q\) と剰余 \(R_0\) を求めます。\(N_{10} = Q \cdot B + R_0\)

  2. 次に、商 \(Q\) を新しい10進数として扱い、再度 \(B\) で割り、商 \(Q_1\) と剰余 \(R_1\) を求めます。\(Q = Q_1 \cdot B + R_1\)

  3. このプロセスを商が0になるまで繰り返します。 \(Q_k = 0 \cdot B + R_k\)

得られた剰余 \(R_k, R_{k-1}, \dots, R_1, R_0\) を逆順に並べると、ターゲット基数 \(B\) での表現 \((R_k R_{k-1} \dots R_1 R_0)_B\) が得られます。

プログラムでは、base_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" を使用して、2進数から36進数までの数字と文字を対応させています。これは、value_base 関数で文字を数値に変換する際や、10進数からターゲット基数への変換で得られた剰余を対応する文字に変換する際に用いられます。

必要な非標準ライブラリとインストール方法

このプログラムはPythonの標準ライブラリである sys のみを使用しており、追加の非標準ライブラリは必要ありません。そのため、特別なインストール手順は不要です。

必要な入力ファイル

このプログラムは入力ファイルを必要としません。すべての入力データはコマンドライン引数として直接プログラムに渡されます。

コマンドライン引数の詳細は以下の通りです。

  • val: 変換したい数値の文字列表現です。例: "1A", "255", "1101"

  • base_source: val が表現されている基数を示す整数です。2から36までの値である必要があります。

  • base_target: 変換後の基数を示す整数です。2から36までの値である必要があります。

生成される出力ファイル

このプログラムは出力ファイルを生成しません。すべての処理結果は標準出力(コンソール)に直接表示されます。

出力には、以下の情報が含まれます。

  • ソース基数から10進数への変換過程の各ステップ。各桁の計算結果と中間合計値が表示されます。

  • 10進数からターゲット基数への変換過程の各ステップ。繰り返し除算の商と剰余、およびその時点でのターゲット基数での表現が表示されます。

  • 最終的な変換結果。

コマンドラインでの使用例 (Usage)

base.py プログラムの基本的な実行形式は以下の通りです。

python base.py val base_source base_target
  • val: 変換元の数値(文字列)

  • base_source: 変換元の基数(整数、2〜36)

  • base_target: 変換先の基数(整数、2〜36)

コマンドラインでの具体的な使用例

例1: 10進数の255を16進数に変換

10進数の "255" を16進数に変換します。

python base.py 255 10 16

実行結果の説明: プログラムはまず、入力 255 を10進数として解析します。この場合は元の基数も10なので、10進数への変換は自明です。その後、その10進数値 \(255\) をターゲット基数である16で繰り返し除算します。

  • \(255 \div 16 = 15\) 余り \(15\) (\(F_{16}\))

  • \(15 \div 16 = 0\) 余り \(15\) (\(F_{16}\))

剰余を逆順に並べると $FF_{16}$ が得られます。出力は各ステップの計算詳細を示し、最終的に $FF_{16}$ が結果として表示されます。

例2: 16進数のFFを2進数に変換

16進数の "FF" を2進数に変換します。

python base.py FF 16 2

実行結果の説明:

  1. 16進数から10進数への変換:

    • 入力 FF (16進数) は、まず10進数に変換されます。

    • \(F_{16}\)\(15_{10}\) です。

    • 最下位桁の \(F\): \(15 \times 16^0 = 15\)

    • 次の桁の \(F\): \(15 \times 16^1 = 240\)

    • 合計: \(15 + 240 = 255_{10}\)

  2. 10進数から2進数への変換:

    • 次に、10進数の \(255\) をターゲット基数である2で繰り返し除算します。

    • \(255 \div 2 = 127\) 余り \(1\)

    • \(127 \div 2 = 63\) 余り \(1\)

    • \(63 \div 2 = 31\) 余り \(1\)

    • \(31 \div 2 = 15\) 余り \(1\)

    • \(15 \div 2 = 7\) 余り \(1\)

    • \(7 \div 2 = 3\) 余り \(1\)

    • \(3 \div 2 = 1\) 余り \(1\)

    • \(1 \div 2 = 0\) 余り \(1\)

    剰余を逆順に並べると $11111111_2$ が得られます。出力は各ステップの計算詳細を示し、最終的に $11111111_2$ が結果として表示されます。