ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

文字の並びに「リトルエンディアン」と言われても

まえがき

トルエンディアンとは、「LSBを先頭に持ってくる」ことだと理解している。

「先頭」とは、アドレスやレジスタやインデックスやキューの先頭のことである。アドレス値が若いほうが先頭か?それを先に決めてくれ。とにかく先頭の定義がまずあって、LSBを先頭に持ってくる。私はそう理解している。違ってたらごめん。

たとえば、「10進数の整数を与えたら2進数のビットに変換したものをリトルエンディアンのリストで返す」という関数 convert_little_endian_bits() を考える。そのとき、

a = convert_little_endian_bits(4)
# a = [0, 0, 1]

となる。リストの先頭 a[0] がLSBになっている。

本題

Q#では、リトルエンディアンであり、4=001であるという

このドキュメントでは、リトルエンディアン形式を使用して計算基底にラベルを付けています。 リトルエンディアン形式では、最下位ビットが先頭になります。 たとえば、リトルエンディアン形式の数値 4 は、ビット 001 の文字列で表されます。

(英語版) In this document we are using the little-endian format to label the computational basis. In little endian format, the least significant bits come first. For example, the number four in little-endian format is represented by the string of bits 001.

Qiskitでは、左が上位、右が下位での並びをリトルエンディアンと呼んでいる。つまり、4=100ということになる。(Qiskitのqubitの並びは  |q_n, \dots, q_0⟩である。)

Qiskitでは少し異なる量子ビットの順番をとります。左に最上位ビット(most significant bit、MSB)をとり、右に最下位ビット(least significant bit、LSB)をとるように表されます(リトルエンディアン)。これは古典コンピュータにおけるビット列表現と似ていて、測定が行われた後のビット列から整数への変換が容易になります。

(英語版) Qiskit uses a slightly different ordering of the qubits, in which the qubits are represented from the most significant bit (MSB) on the left to the least significant bit (LSB) on the right (little-endian). This is similar to bitstring representation on classical computers, and enables easy conversion from bitstrings to integers after measurements are performed.

Q#とQiskitは同じリトルエンディアン呼びをしていながら、4をビット列にしたときの並びが異なっている。

果たして、どちらが正しいのだろうか。

結局、ややこしくしているのは「先頭」の考えである。Q#では、配列的な並びだと左側が先頭(文字列 "001" を見たとき、当然インデックスは左から始まるので、先頭は左側だと考える)のに対して、Qiskitでは、古典ビットの並びだと右側が先頭(ビット列 100 を見たとき、当然0ビット目は右側なので、先頭は右側だと考える)になる。

このように意味が一意に定まらないので、文字の並びでトルエンディアンという呼び方をするのは不適格であると考える。

では代わりにどういう言い方がよいか。「左が上位ビットで、右が下位ビット」という言い方が誤解の仕様がなくてよいと思う。