QRコードの仕組み

QRコードのエンコード・デコードの仕組みを解説する。

関連ページ

目次

QRコードの経緯

QRコード(Quick-Response code)は、1994年にデンソー(現・デンソーウェーブ)が発明した2次元コード。
デンソーの製造現場で、従来のバーコードに代わる大容量かつ読み取り効率の高いコードが求められたことをきっかけに開発された。QRコードには次のような特徴がある。

  • 1次元コードであるバーコードに比べて格納できる情報の量が多い
  • Finder Patternという独特なパターンを用いることでコードの検出を容易にし、高速な読み取りを実現
  • 符号理論に基づいた誤り訂正能力を備え、コードの汚れによる情報欠損に対して堅牢性がある

これらの特長により、QRコードは製造・流通業界に急速に普及した。その後、カメラ付き携帯電話の登場に伴い、スマートフォン決済や電子チケットなど身近な場面でも広く活用されるようになり、現在では日常生活に不可欠な技術となっている。


QRコードの例 (バージョン9)

2012年のパズルゲーム「FEZ」に登場するQRコードを利用した仕掛け

構造

QRコードには初期の仕様であるモデル1と、大型化に対応したモデル2が存在する。現在はモデル1が使用されることは滅多にないので、この投稿ではモデル2に限って解説を行う。

また、データ圧縮方式には「数値モード」・「英数字モード」・「8ビットバイトモード」・「漢字モード」の種類が存在するが、ここでは8ビットバイトモードのみを使う前提で解説する。
UTF-8でエンコードしたバイト列を8ビットバイトモードでQRコードにエンコードすることで、英数字と漢字を含むUnicodeの文字列を自由に表現することができる。

バージョン

QRコードの大きさは後述のQuiet Zone(外側の白い部分)を除いた部分のセルの数で表現される。(セルのことを正式には「モジュール」と言うが、直感的ではないのでここではセルと呼ぶことにする)
最小のQRコードは21x21の大きさで、このサイズをバージョン1(あるいは1型)と呼ぶ。バージョン2は25x25、バージョン3は29x29と、バージョンが1上がるごとに一辺が4セルずつ増えていく。最大のバージョンは40で、サイズは177x177。

バージョン QRコードの大きさ
1 21x21
2 25x25
3 29x29
4 33x33
5 37x37
6 41x41
7 45x45
8 49x49
9 53x53
10 57x57
11 61x61
12 65x65
13 69x69
14 73x73
15 77x77
16 81x81
17 85x85
18 89x89
19 93x93
20 97x97
21 101x101
22 105x105
23 109x109
24 113x113
25 117x117
26 121x121
27 125x125
28 129x129
29 133x133
30 137x137
31 141x141
32 145x145
33 149x149
34 153x153
35 157x157
36 161x161
37 165x165
38 169x169
39 173x173
40 177x177

バージョン1のQRコードの例 (21x21)

バージョン40のQRコードの例 (177x177)

構成要素

Quiet Zone (クワイエットゾーン)

Quiet Zoneは、QRコードの外側に存在する余白領域。上下左右それぞれに4セル分確保する必要があると定められている。


Quiet Zone

Finder Pattern (位置検出パターン)

Finder Patternは、QRコードの左上・右上・左下に配置される特徴的なパターン。
このパターンはQRコードの検出のために利用される。読み取り機は1:1:3:1:1の白黒のパターンを検出することによってFinder Patternの位置を特定し、3つのFinder Patternの位置関係からQRコードが存在する領域を推定する。

1:1:3:1:1という比率は、開発当時にあらゆる印刷物を調べて最も使われていない比率であったことから、誤認識が少ないという理由で採用されたらしい。


Finder Pattern

Alignment Pattern (位置合せパターン)

Alignment Patternは、QRコード内にほぼ等間隔に配置されるパターン。
QRコードの歪みを補正するために利用される。

Alignment Patternはバージョン2から6までは2x2個配置し(ただしFinder Patternと被る部分は描画しない)、以降はバージョンが7上がるごとに縦横に1つずつ配置個数を増やしていく。また、バージョン1の場合は例外的にAlignment Patternを1つも配置しない。

バージョン Alignment Patternの個数
1 0
2-6 2x2 - 3 = 1
7-13 3x3 - 3 = 6
14-20 4x4 - 3 = 13
21-27 5x5 - 3 = 22
28-34 6x6 - 3 = 33
35-40 7x7 - 3 = 46

下図はバージョン9の例。3x3の格子状に6個のパターンを配置している。


Alignment Pattern

Alignment Patternは上下左右の端のパターンがFinder Patternと整列するように配置され、その間にほぼ等間隔になるように残りのパターンが配置される。
左右(あるいは上下)の端同士のパターンの中心座標の差を\(a\)とし、Alignment Patternの配置数を\(b\)x\(b\)とすると、Alignment Patternは中心座標の間隔が\(\frac{a}{b-1}\)以上の最小の偶数、つまり\(2\left\lceil \frac{1}{2}\frac{a}{b-1} \right\rceil\)となるように右(下)から配置される。その結果、左端(上端)では間隔が他の部分より短くなる場合がある。

例えば、下図はバージョン16の場合のAlignment Patternの例だが、\(a = 81-13 = 68\)、\(b=4\)なので中心座標の間隔は\(2\left\lceil \frac{1}{2}\frac{a}{b-1} \right\rceil = 2\left\lceil \frac{1}{2}\frac{68}{3} \right\rceil = 24\)となる。68の間隔を右(下)から24ずつ区切ると最後に20余るので、左端(上端)の間隔だけは20になる。


Alignment Pattern (バージョン16)

Timing Pattern (タイミングパターン)

Timing Patternは、Finder Patternを結ぶように白黒を交互に繰り返すパターン。
QRコード内の座標を決定するために利用される。


Timing Pattern

Separator (分離パターン)

Separatorは、Finder Patternとその他の領域を分離する余白。


Separator

常に黒となる部分

図の位置にある1セルは常に黒になるよう定められている。特に名称は定められていない。


常に黒となる部分

Format Information (形式情報)

Format Informationは、後述の誤り訂正レベルマスクパターンを記録する15-bitの値。
下図のようにSeparatorに隣接する位置に配置され、縦方向と横方向に同一の情報を2箇所に書き込む。(黒=1, 白=0)


Format Information

Format Informationの配置順 (0が下位ビットで14が上位ビット)

Format Informationの内容は次の3つの部分で構成される。詳細は後述。

  • 誤り訂正レベル指示子 (2-bit)
    • L=01, M=00, Q=11, H=10を書き込む
  • マスクパターン参照子 (3-bit)
    • マスクパターン0~8をそのまま2進数で書き込む
  • 上記合計5-bitに対するBCH符号誤り訂正ビット (10-bit)
    • 生成多項式は10100110111

Version Information (型番情報)

Format Informationはバージョンの情報を記録する領域。この領域はバージョン7以上のQRコードにのみ存在する。
下図のようにSeparatorに隣接する位置に配置され、Format Informationと同様に2箇所に同じ内容を書き込む。


Version Information

Version Informationの配置順 (0が下位ビットで17が上位ビット)

Version Informationの内容は次の2つの部分で構成される。詳細は後述。

  • バージョン情報 (6-bit)
  • バージョン情報6-bitに対するBCH符号の誤り訂正ビット (12-bit)
    • 生成多項式は1111100100101

符号語領域 (データと誤り訂正符号)

これまでに説明した領域を除いた残りの領域全体が「データ」と「誤り訂正符号」を書き込む領域となる。

書き込みたいデータのビット列を8ビットずつのコード語に区切り、コード語の集合を並び替えてからブロックに分割し、ブロックごとにRS符号化し、データコード語と誤り訂正コード語を適切な順番で書き込む。詳しくは後述する。


データと誤り訂正符号

この領域の容量は次の表の通り。
データと誤り訂正符号は8ビット単位の大きさの「コード語」として扱われるので、bit数で表されるコード容量を8で割った余りはデータの保存に使うことはできない。この余りのビット数のことを残余ビットと言う。
また次の表には、仕様で定められたブロック数ブロックごとの誤り訂正コード語数も記載する。

バージョン大きさコード容量残余
ビット
ブロック数ブロックごとの
誤り訂正コード語数
bitコード語LMQHLMQH
121x2120826011117101317
225x25359447111110162228
329x29567707112215261822
433x338071007122420182616
537x3710791347124426241822
641x4113831727244418162428
745x4515681960246520181826
849x4919362420246624222226
953x5323362920258830222024
1057x5727683460458818262428
1161x61323240404581120302824
1265x653728466048101124222628
1369x694256532049121626222422
1473x734651581349161630242024
1577x7752436553610121822243024
1681x8158677333610171624282430
1785x8565238153611161928282828
1889x8972119013613182130262828
1993x9379319913714212528262626
2097x97868310853816202528263028
21101x101925211564817232528262830
22105x1051006812584917233428283024
23109x1091091613644918253030283030
24113x11311796147441020273230283030
25117x11712708158841221293526283030
26121x12113652170641223343728282830
27125x12514628182841225344030283030
28129x12915371192131326354230283030
29133x13316411205131428384530283030
30137x13717483218531529404830283030
31141x14118587232331631435130283030
32145x14519723246531733455430283030
33149x14920891261131835485730283030
34153x15322091276131937516030283030
35157x15723008287601938536330283030
36161x16124272303402040566630283030
37165x16525568319602143597030283030
38169x16926896336202245627430283030
39173x17328256353202447657730283030
40177x17729648370602549688130283030

容量が最大となるのはバージョン40・誤り訂正レベルLの場合で、(8ビットバイトモードの場合) \(3706-25\times30 - 3 = 2953\) Byteのデータを格納することができる。(差し引いた3 Byte分は、8ビットバイトモードを指定する1Byteとデータの長さを指定する2Byte)

Format/Version Informationのエンコード

Format Information

Format Informationの内容は次の3つの部分で構成される。

  • 誤り訂正レベル指示子 (2-bit)
    • L=01, M=00, Q=11, H=10を書き込む
  • マスクパターン参照子 (3-bit)
    • マスクパターン0~8をそのまま2進数で書き込む
  • 上記合計5-bitに対するBCH符号誤り訂正ビット (10-bit)
    • 生成多項式は10100110111
誤り訂正レベル

誤り訂正レベルとは、QRコードの符号語領域のRS符号化において訂正できる誤りの割合を表すL=Low, M=Medium, Q=Quartile, H=Highの4種類の値。Lowは7%程度の誤りを訂正でき、Hは30%程度の誤りを訂正できる。
詳細は後述。

マスク

マスクは、エンコードされたデータのパターンがFinder Patternなどの機能パターンと誤認識されることを防ぐために、データと誤り訂正符号の領域で白と黒を反転させる特定のパターン。8種類のパターンが規定されている。
こちらも詳細は後述。

またこれら3つの部分を結合した後、ビット列が全て0にならないようにマスクパターン101010000010010とのXOR演算を行って最終的なFormat Informationの値とする。

誤り訂正ビットは後述のBCH符号の組織符号化で実装されているが、実際は次の表のように32通りのパターンしかないので、QRコードを生成する際は予め計算した値を参照して書き込めば良い。

組織符号とは、エンコード後の符号の中に元のデータがそのまま現れるような符号のこと。
下の表の場合、符号の先頭5桁は元のデータそのものとなっている。

誤り訂正レベルマスクFormat Info (マスク前)Format Info
L (01)0 (000)010001111010110111011111000100
1 (001)010011011100001111001011110011
2 (010)010100110111000111110110101010
3 (011)010110010001111111100010011101
4 (100)011001000111101110011000101111
5 (101)011011100001010110001100011000
6 (110)011100001010011110110001000001
7 (111)011110101100100110100101110110
M (00)0 (000)000000000000000101010000010010
1 (001)000010100110111101000100100101
2 (010)000101001101110101111001111100
3 (011)000111101011001101101101001011
4 (100)001000111101011100010111111001
5 (101)001010011011100100000011001110
6 (110)001101110000101100111110010111
7 (111)001111010110010100101010100000
Q (11)0 (000)110000101001101011010101011111
1 (001)110010001111010011000001101000
2 (010)110101100100011011111100110001
3 (011)110111000010100011101000000110
4 (100)111000010100110010010010110100
5 (101)111010110010001010000110000011
6 (110)111101011001000010111011011010
7 (111)111111111111111010101111101101
H (10)0 (000)100001010011011001011010001001
1 (001)100011110101100001001110111110
2 (010)100100011110101001110011100111
3 (011)100110111000010001100111010000
4 (100)101001101110000000011101100010
5 (101)101011001000111000001001010101
6 (110)101100100011110000110100001100
7 (111)101110000101001000100000111011

具体例

誤り訂正レベルが「Q」で、マスクが「5」の場合の例を見てみよう。

誤り訂正レベルQに対応するビット列は11、マスク5に対応するビット列は101なので、エンコードするデータは11101になる。データの各桁を\(\mathbb{F}_2\)係数多項式の各次数の係数と見なすと、データに対応する多項式は

\begin{align} a(x) &= 1\cdot x^4 + 1\cdot x^3 + 1\cdot x^2 + 0\cdot x + 1 \\ &= x^4+x^3+x^2+1 \end{align}

となる。

生成多項式は10100110111なので、同様に多項式で表すと

\begin{align} g(x) &= x^{10}+x^8+x^5+x^4+x^2+x+1 \end{align}

となる。

BCH符号の組織符号化ではこの場合、\(g(x)\)と同じ次数である\(x^{10}\)を\(a(x)\)に掛けて、\(g(x)\)で割った余り\(r(x)\)を求める。
通常の2進数の割り算ではなく\(\mathbb{F}_2\)上の係数に対する演算なので、\(1+1=0\)となることから桁の繰り上がり・繰り下がりが発生しないことに注意して、次のように計算する。

\begin{align} 11011\, \\ 10100110111 \enclose{longdiv}{111010000000000} \\ \underline{10100110111} \phantom{0000}\, \\ 10011101110 \phantom{000}\, \\ \underline{10100110111} \phantom{000}\, \\ 11101100100 \phantom{0}\, \\ \underline{10100110111} \phantom{0}\, \\ 10010100110 \, \\ \underline{10100110111} \, \\ 0110010001 \, \\ \end{align}

計算結果から、余り\(r(x)\)の2進数表示は0110010001であることがわかる。

得られた\(r(x)\)を用いて

\begin{align} w(x):=a(x)x^{10}-r(x) \end{align}

と定義すると\(w(x)\)は\(g(x)\)で割り切ることができ、目的のBCH符号となる。
\(\mathbb{F}_2\)係数では足し算と引き算は同じ結果になるので、\(w(x)=a(x)x^{10}+r(x)\)とも表すことができる。よって、\(w(x)\)を2進数で表す場合、元のデータと\(r(x)\)を繋げて111010110010001とすれば良い。

Format Informationでは最後に101010000010010とのXOR演算を行うので、最終的な値は010000110000011となる。

\begin{align} 111010110010001 \\ \underline{+ \phantom{0} 101010000010010} \\ 010000110000011 \end{align}

Version Information

Version Informationの内容は次の2つの部分で構成される。

  • バージョン情報 (6-bit)
  • バージョン情報6-bitに対するBCH符号の誤り訂正ビット (12-bit)
    • 生成多項式は1111100100101

Format Informationのようなマスク処理(XOR演算)は行わない。

計算済みの誤り訂正符号全体は次の表の通り。

バージョン Version Information
7 000111110010010100
8 001000010110111100
9 001001101010011001
10 001010010011010011
11 001011101111110110
12 001100011101100010
13 001101100001000111
14 001110011000001101
15 001111100100101000
16 010000101101111000
17 010001010001011101
18 010010101000010111
19 010011010100110010
20 010100100110100110
21 010101011010000011
22 010110100011001001
23 010111011111101100
24 011000111011000100
25 011001000111100001
26 011010111110101011
27 011011000010001110
28 011100110000011010
29 011101001100111111
30 011110110101110101
31 011111001001010000
32 100000100111010101
33 100001011011110000
34 100010100010111010
35 100011011110011111
36 100100101100001011
37 100101010000101110
38 100110101001100100
39 100111010101000001
40 101000110001101001

計算例はFormat Informationと同様。

データのエンコード

符号語領域に書き込む値のエンコード方法を解説する。
ここではUTF-8でエンコードしたデータを8ビットバイトモードで書き込む場合に限定して考える。

データコード語の構成

QRコードの符号語領域には8-bit単位で値が書き込まれるが、それらの値には「データコード語」・「誤り訂正コード語」の2種類がある。

  • 符号語
    • データコード語 - 書き込みたいデータの実体が格納されている。符号語領域の前半に書き込む。
    • 誤り訂正コード語 - RS符号で実装された誤り訂正符号。符号語領域の後半に書き込む。

データコード語の列は次のように構成される。

  • モード指示子
    • ここでは「8ビットバイトモード」を指定する4-bit値「0100」(0x4)で固定
  • 文字数指示子
    • データビット列の長さ(バイト数)を表すビット列
    • 8ビットバイトモードでは文字数指示子の長さはバージョン9以下のとき8-bit、バージョン10以上のとき16-bitになる
  • データビット列
    • QRコードに保存したいデータ (ここでは文字列をUTF-8でエンコードしたビット列)
  • 終端パターン
    • 4-bit値「0000」(0x0)でデータの末端を表す
    • 残り容量が4-bit未満のときは桁数に合わせて短縮することが可能。特に残り容量が丁度0-bitのときは終端パターン自体を省略することが可能。8ビットバイトモードの場合はこの時点での残り容量は必ず4-bit以上となるので、「0000」で固定と考えて良い。
  • 埋め草ビット
    • ここまでのデータの長さが8の倍数にならないとき、8の倍数になるように埋め草ビット「0」を必要な数だけ追加する。8ビットバイトモードの場合はここまでのデータの長さは必ず8の倍数になるので、埋め草ビットが発生することはない。
  • 埋め草コード語
    • データ容量に対する残りの部分は「11101100」(0xEC)・「00010001」(0x11)を繰り返して埋める。

バージョン5・誤り訂正レベルHで、データが文字列「QRコード」の例を考える。

バージョン5なので上に掲載した表から、コード語の容量は134。
ブロック数は4で、各ブロックに22個の誤り訂正コード語があるので、データコード語の容量は134 - 4・22 = 46である。

バージョン大きさコード容量残余
ビット
ブロック数ブロックごとの
誤り訂正コード語数
bitコード語LMQHLMQH
537x3710791347124426241822

文字列「QRコード」をUTF-8でエンコードすると、16進数で「51 52 E382B3 E383BC E38389」と表される11バイトの値になる。したがって文字数指示子の値は11となるが、今はバージョン3なので11を8桁の2進数で表して00001011(=0x0B)とする。

これらをまとめるとデータコード語は最終的に次の表のように構成され、16進数で「40 B5 15 2E 38 2B 3E 38 3B CE 38 38 90 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC」となる。

累計サイズ 項目 データ (16進数) 備考
0.5 モード指示子 4 固定値
1.5 文字数指示子 0B 11(=0xB)バイト
12.5 データビット列 5 15 2E 38 2B 3E 38 3B CE 38 38 9
13 終端パターン 0 固定値
46 埋め草コード語 EC 11 EC 11 EC 11 EC 11 EC 11
EC 11 EC 11 EC 11 EC 11 EC 11
EC 11 EC 11 EC 11 EC 11 EC 11
EC 11 EC

ブロック分割

データコード語(の配列)が得られたら、次にデータコード語を規定されたブロック数に分割する。
余りが出る場合は、後ろのブロックが1つ多くのコード語を含むように分ける。

バージョン5・誤り訂正レベルHで、データが文字列「QRコード」の例を考える。
この例では前節で確かめたように、データコード語の容量は46である。ブロック数は4なので、46個のデータコード語は次のように11・11・12・12個に分割される。

0 1 2 3 4 5 6 7 8 9 10 11
Block 0 40 B5 15 2E 38 2B 3E 38 3B CE 38
Block 1 38 90 EC 11 EC 11 EC 11 EC 11 EC
Block 2 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC
Block 3 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC

RS符号化

各ブロックをRS符号で組織符号化し、規定の長さの誤り訂正コード語を追加する。RS符号化を行うことによって、万が一QRコードの情報に欠損が生じても、欠損した位置を自動的に検出し修正することができるようになる。

QRコードのRS符号化では、\(\mathbb{F}_{2^8}=\mathbb{F}_2[x]/(x^8+x^4+x^3+x^2+1)\)上係数の多項式が用いられる。
\(\mathbb{F}_{2^8}\)の原始元を\(\alpha(x)=x\)とすると、各要素\(y\in\mathbb{F}_{2^8}\)は次の表のように表すことができる。\(\mathbb{F}_{2^8}\)の要素同士の計算は、足し算(=引き算=XOR演算)のときは2進表記を使い、掛け算・割り算には冪乗表記を使うと簡単に結果を求めることができる。

\(y\)\(y^{-1}\)
10進表記2進表記冪乗表記10進表記2進表記冪乗表記
000000000
100000001\(\alpha^{0}\)100000001\(\alpha^{0}\)
200000010\(\alpha^{1}\)14210001110\(\alpha^{254}\)
300000011\(\alpha^{25}\)24411110100\(\alpha^{230}\)
400000100\(\alpha^{2}\)7101000111\(\alpha^{253}\)
500000101\(\alpha^{50}\)16710100111\(\alpha^{205}\)
600000110\(\alpha^{26}\)12201111010\(\alpha^{229}\)
700000111\(\alpha^{198}\)18610111010\(\alpha^{57}\)
800001000\(\alpha^{3}\)17310101101\(\alpha^{252}\)
900001001\(\alpha^{223}\)15710011101\(\alpha^{32}\)
1000001010\(\alpha^{51}\)22111011101\(\alpha^{204}\)
1100001011\(\alpha^{238}\)15210011000\(\alpha^{17}\)
1200001100\(\alpha^{27}\)6100111101\(\alpha^{228}\)
1300001101\(\alpha^{104}\)17010101010\(\alpha^{151}\)
1400001110\(\alpha^{199}\)9301011101\(\alpha^{56}\)
1500001111\(\alpha^{75}\)15010010110\(\alpha^{180}\)
1600010000\(\alpha^{4}\)21611011000\(\alpha^{251}\)
1700010001\(\alpha^{100}\)11401110010\(\alpha^{155}\)
1800010010\(\alpha^{224}\)19211000000\(\alpha^{31}\)
1900010011\(\alpha^{14}\)8801011000\(\alpha^{241}\)
2000010100\(\alpha^{52}\)22411100000\(\alpha^{203}\)
2100010101\(\alpha^{141}\)6200111110\(\alpha^{114}\)
2200010110\(\alpha^{239}\)7601001100\(\alpha^{16}\)
2300010111\(\alpha^{129}\)10201100110\(\alpha^{126}\)
2400011000\(\alpha^{28}\)14410010000\(\alpha^{227}\)
2500011001\(\alpha^{193}\)22211011110\(\alpha^{62}\)
2600011010\(\alpha^{105}\)8501010101\(\alpha^{150}\)
2700011011\(\alpha^{248}\)12810000000\(\alpha^{7}\)
2800011100\(\alpha^{200}\)16010100000\(\alpha^{55}\)
2900011101\(\alpha^{8}\)13110000011\(\alpha^{247}\)
3000011110\(\alpha^{76}\)7501001011\(\alpha^{179}\)
3100011111\(\alpha^{113}\)4200101010\(\alpha^{142}\)
3200100000\(\alpha^{5}\)10801101100\(\alpha^{250}\)
3300100001\(\alpha^{138}\)23711101101\(\alpha^{117}\)
3400100010\(\alpha^{101}\)5700111001\(\alpha^{154}\)
3500100011\(\alpha^{47}\)8101010001\(\alpha^{208}\)
3600100100\(\alpha^{225}\)9601100000\(\alpha^{30}\)
3700100101\(\alpha^{36}\)8601010110\(\alpha^{219}\)
3800100110\(\alpha^{15}\)4400101100\(\alpha^{240}\)
3900100111\(\alpha^{33}\)13810001010\(\alpha^{222}\)
4000101000\(\alpha^{53}\)11201110000\(\alpha^{202}\)
4100101001\(\alpha^{147}\)20811010000\(\alpha^{108}\)
4200101010\(\alpha^{142}\)3100011111\(\alpha^{113}\)
4300101011\(\alpha^{218}\)7401001010\(\alpha^{37}\)
4400101100\(\alpha^{240}\)3800100110\(\alpha^{15}\)
4500101101\(\alpha^{18}\)13910001011\(\alpha^{237}\)
4600101110\(\alpha^{130}\)5100110011\(\alpha^{125}\)
4700101111\(\alpha^{69}\)11001101110\(\alpha^{186}\)
4800110000\(\alpha^{29}\)7201001000\(\alpha^{226}\)
4900110001\(\alpha^{181}\)13710001001\(\alpha^{74}\)
5000110010\(\alpha^{194}\)11101101111\(\alpha^{61}\)
5100110011\(\alpha^{125}\)4600101110\(\alpha^{130}\)
5200110100\(\alpha^{106}\)16410100100\(\alpha^{149}\)
5300110101\(\alpha^{39}\)19511000011\(\alpha^{216}\)
5400110110\(\alpha^{249}\)6401000000\(\alpha^{6}\)
5500110111\(\alpha^{185}\)9401011110\(\alpha^{70}\)
5600111000\(\alpha^{201}\)8001010000\(\alpha^{54}\)
5700111001\(\alpha^{154}\)3400100010\(\alpha^{101}\)
5800111010\(\alpha^{9}\)20711001111\(\alpha^{246}\)
5900111011\(\alpha^{120}\)16910101001\(\alpha^{135}\)
6000111100\(\alpha^{77}\)17110101011\(\alpha^{178}\)
6100111101\(\alpha^{228}\)1200001100\(\alpha^{27}\)
6200111110\(\alpha^{114}\)2100010101\(\alpha^{141}\)
6300111111\(\alpha^{166}\)22511100001\(\alpha^{89}\)
6401000000\(\alpha^{6}\)5400110110\(\alpha^{249}\)
6501000001\(\alpha^{191}\)9501011111\(\alpha^{64}\)
6601000010\(\alpha^{139}\)24811111000\(\alpha^{116}\)
6701000011\(\alpha^{98}\)21311010101\(\alpha^{157}\)
6801000100\(\alpha^{102}\)14610010010\(\alpha^{153}\)
6901000101\(\alpha^{221}\)7801001110\(\alpha^{34}\)
7001000110\(\alpha^{48}\)16610100110\(\alpha^{207}\)
7101000111\(\alpha^{253}\)400000100\(\alpha^{2}\)
7201001000\(\alpha^{226}\)4800110000\(\alpha^{29}\)
7301001001\(\alpha^{152}\)13610001000\(\alpha^{103}\)
7401001010\(\alpha^{37}\)4300101011\(\alpha^{218}\)
7501001011\(\alpha^{179}\)3000011110\(\alpha^{76}\)
7601001100\(\alpha^{16}\)2200010110\(\alpha^{239}\)
7701001101\(\alpha^{145}\)10301100111\(\alpha^{110}\)
7801001110\(\alpha^{34}\)6901000101\(\alpha^{221}\)
7901001111\(\alpha^{136}\)14710010011\(\alpha^{119}\)
8001010000\(\alpha^{54}\)5600111000\(\alpha^{201}\)
8101010001\(\alpha^{208}\)3500100011\(\alpha^{47}\)
8201010010\(\alpha^{148}\)10401101000\(\alpha^{107}\)
8301010011\(\alpha^{206}\)14010001100\(\alpha^{49}\)
8401010100\(\alpha^{143}\)12910000001\(\alpha^{112}\)
8501010101\(\alpha^{150}\)2600011010\(\alpha^{105}\)
8601010110\(\alpha^{219}\)3700100101\(\alpha^{36}\)
8701010111\(\alpha^{189}\)9701100001\(\alpha^{66}\)
8801011000\(\alpha^{241}\)1900010011\(\alpha^{14}\)
8901011001\(\alpha^{210}\)19311000001\(\alpha^{45}\)
9001011010\(\alpha^{19}\)20311001011\(\alpha^{236}\)
9101011011\(\alpha^{92}\)9901100011\(\alpha^{163}\)
9201011100\(\alpha^{131}\)15110010111\(\alpha^{124}\)
9301011101\(\alpha^{56}\)1400001110\(\alpha^{199}\)
9401011110\(\alpha^{70}\)5500110111\(\alpha^{185}\)
9501011111\(\alpha^{64}\)6501000001\(\alpha^{191}\)
9601100000\(\alpha^{30}\)3600100100\(\alpha^{225}\)
9701100001\(\alpha^{66}\)8701010111\(\alpha^{189}\)
9801100010\(\alpha^{182}\)20211001010\(\alpha^{73}\)
9901100011\(\alpha^{163}\)9101011011\(\alpha^{92}\)
10001100100\(\alpha^{195}\)18510111001\(\alpha^{60}\)
10101100101\(\alpha^{72}\)19611000100\(\alpha^{183}\)
10201100110\(\alpha^{126}\)2300010111\(\alpha^{129}\)
10301100111\(\alpha^{110}\)7701001101\(\alpha^{145}\)
10401101000\(\alpha^{107}\)8201010010\(\alpha^{148}\)
10501101001\(\alpha^{58}\)14110001101\(\alpha^{197}\)
10601101010\(\alpha^{40}\)23911101111\(\alpha^{215}\)
10701101011\(\alpha^{84}\)17910110011\(\alpha^{171}\)
10801101100\(\alpha^{250}\)3200100000\(\alpha^{5}\)
10901101101\(\alpha^{133}\)23611101100\(\alpha^{122}\)
11001101110\(\alpha^{186}\)4700101111\(\alpha^{69}\)
11101101111\(\alpha^{61}\)5000110010\(\alpha^{194}\)
11201110000\(\alpha^{202}\)4000101000\(\alpha^{53}\)
11301110001\(\alpha^{94}\)20911010001\(\alpha^{161}\)
11401110010\(\alpha^{155}\)1700010001\(\alpha^{100}\)
11501110011\(\alpha^{159}\)21711011001\(\alpha^{96}\)
11601110100\(\alpha^{10}\)23311101001\(\alpha^{245}\)
11701110101\(\alpha^{21}\)25111111011\(\alpha^{234}\)
11801110110\(\alpha^{121}\)21811011010\(\alpha^{134}\)
11901110111\(\alpha^{43}\)12101111001\(\alpha^{212}\)
12001111000\(\alpha^{78}\)21911011011\(\alpha^{177}\)
12101111001\(\alpha^{212}\)11901110111\(\alpha^{43}\)
12201111010\(\alpha^{229}\)600000110\(\alpha^{26}\)
12301111011\(\alpha^{172}\)18710111011\(\alpha^{83}\)
12401111100\(\alpha^{115}\)13210000100\(\alpha^{140}\)
12501111101\(\alpha^{243}\)20511001101\(\alpha^{12}\)
12601111110\(\alpha^{167}\)25411111110\(\alpha^{88}\)
12701111111\(\alpha^{87}\)25211111100\(\alpha^{168}\)
12810000000\(\alpha^{7}\)2700011011\(\alpha^{248}\)
12910000001\(\alpha^{112}\)8401010100\(\alpha^{143}\)
13010000010\(\alpha^{192}\)16110100001\(\alpha^{63}\)
13110000011\(\alpha^{247}\)2900011101\(\alpha^{8}\)
13210000100\(\alpha^{140}\)12401111100\(\alpha^{115}\)
13310000101\(\alpha^{128}\)20411001100\(\alpha^{127}\)
13410000110\(\alpha^{99}\)22811100100\(\alpha^{156}\)
13510000111\(\alpha^{13}\)17610110000\(\alpha^{242}\)
13610001000\(\alpha^{103}\)7301001001\(\alpha^{152}\)
13710001001\(\alpha^{74}\)4900110001\(\alpha^{181}\)
13810001010\(\alpha^{222}\)3900100111\(\alpha^{33}\)
13910001011\(\alpha^{237}\)4500101101\(\alpha^{18}\)
14010001100\(\alpha^{49}\)8301010011\(\alpha^{206}\)
14110001101\(\alpha^{197}\)10501101001\(\alpha^{58}\)
14210001110\(\alpha^{254}\)200000010\(\alpha^{1}\)
14310001111\(\alpha^{24}\)24511110101\(\alpha^{231}\)
14410010000\(\alpha^{227}\)2400011000\(\alpha^{28}\)
14510010001\(\alpha^{165}\)22311011111\(\alpha^{90}\)
14610010010\(\alpha^{153}\)6801000100\(\alpha^{102}\)
14710010011\(\alpha^{119}\)7901001111\(\alpha^{136}\)
14810010100\(\alpha^{38}\)15510011011\(\alpha^{217}\)
14910010101\(\alpha^{184}\)18810111100\(\alpha^{71}\)
15010010110\(\alpha^{180}\)1500001111\(\alpha^{75}\)
15110010111\(\alpha^{124}\)9201011100\(\alpha^{131}\)
15210011000\(\alpha^{17}\)1100001011\(\alpha^{238}\)
15310011001\(\alpha^{68}\)22011011100\(\alpha^{187}\)
15410011010\(\alpha^{146}\)18910111101\(\alpha^{109}\)
15510011011\(\alpha^{217}\)14810010100\(\alpha^{38}\)
15610011100\(\alpha^{35}\)17210101100\(\alpha^{220}\)
15710011101\(\alpha^{32}\)900001001\(\alpha^{223}\)
15810011110\(\alpha^{137}\)19911000111\(\alpha^{118}\)
15910011111\(\alpha^{46}\)16210100010\(\alpha^{209}\)
16010100000\(\alpha^{55}\)2800011100\(\alpha^{200}\)
16110100001\(\alpha^{63}\)13010000010\(\alpha^{192}\)
16210100010\(\alpha^{209}\)15910011111\(\alpha^{46}\)
16310100011\(\alpha^{91}\)19811000110\(\alpha^{164}\)
16410100100\(\alpha^{149}\)5200110100\(\alpha^{106}\)
16510100101\(\alpha^{188}\)19411000010\(\alpha^{67}\)
16610100110\(\alpha^{207}\)7001000110\(\alpha^{48}\)
16710100111\(\alpha^{205}\)500000101\(\alpha^{50}\)
16810101000\(\alpha^{144}\)20611001110\(\alpha^{111}\)
16910101001\(\alpha^{135}\)5900111011\(\alpha^{120}\)
17010101010\(\alpha^{151}\)1300001101\(\alpha^{104}\)
17110101011\(\alpha^{178}\)6000111100\(\alpha^{77}\)
17210101100\(\alpha^{220}\)15610011100\(\alpha^{35}\)
17310101101\(\alpha^{252}\)800001000\(\alpha^{3}\)
17410101110\(\alpha^{190}\)19010111110\(\alpha^{65}\)
17510101111\(\alpha^{97}\)18310110111\(\alpha^{158}\)
17610110000\(\alpha^{242}\)13510000111\(\alpha^{13}\)
17710110001\(\alpha^{86}\)22911100101\(\alpha^{169}\)
17810110010\(\alpha^{211}\)23811101110\(\alpha^{44}\)
17910110011\(\alpha^{171}\)10701101011\(\alpha^{84}\)
18010110100\(\alpha^{20}\)23511101011\(\alpha^{235}\)
18110110101\(\alpha^{42}\)24211110010\(\alpha^{213}\)
18210110110\(\alpha^{93}\)19110111111\(\alpha^{162}\)
18310110111\(\alpha^{158}\)17510101111\(\alpha^{97}\)
18410111000\(\alpha^{132}\)19711000101\(\alpha^{123}\)
18510111001\(\alpha^{60}\)10001100100\(\alpha^{195}\)
18610111010\(\alpha^{57}\)700000111\(\alpha^{198}\)
18710111011\(\alpha^{83}\)12301111011\(\alpha^{172}\)
18810111100\(\alpha^{71}\)14910010101\(\alpha^{184}\)
18910111101\(\alpha^{109}\)15410011010\(\alpha^{146}\)
19010111110\(\alpha^{65}\)17410101110\(\alpha^{190}\)
19110111111\(\alpha^{162}\)18210110110\(\alpha^{93}\)
19211000000\(\alpha^{31}\)1800010010\(\alpha^{224}\)
19311000001\(\alpha^{45}\)8901011001\(\alpha^{210}\)
19411000010\(\alpha^{67}\)16510100101\(\alpha^{188}\)
19511000011\(\alpha^{216}\)5300110101\(\alpha^{39}\)
19611000100\(\alpha^{183}\)10101100101\(\alpha^{72}\)
19711000101\(\alpha^{123}\)18410111000\(\alpha^{132}\)
19811000110\(\alpha^{164}\)16310100011\(\alpha^{91}\)
19911000111\(\alpha^{118}\)15810011110\(\alpha^{137}\)
20011001000\(\alpha^{196}\)21011010010\(\alpha^{59}\)
20111001001\(\alpha^{23}\)24711110111\(\alpha^{232}\)
20211001010\(\alpha^{73}\)9801100010\(\alpha^{182}\)
20311001011\(\alpha^{236}\)9001011010\(\alpha^{19}\)
20411001100\(\alpha^{127}\)13310000101\(\alpha^{128}\)
20511001101\(\alpha^{12}\)12501111101\(\alpha^{243}\)
20611001110\(\alpha^{111}\)16810101000\(\alpha^{144}\)
20711001111\(\alpha^{246}\)5800111010\(\alpha^{9}\)
20811010000\(\alpha^{108}\)4100101001\(\alpha^{147}\)
20911010001\(\alpha^{161}\)11301110001\(\alpha^{94}\)
21011010010\(\alpha^{59}\)20011001000\(\alpha^{196}\)
21111010011\(\alpha^{82}\)24611110110\(\alpha^{173}\)
21211010100\(\alpha^{41}\)24911111001\(\alpha^{214}\)
21311010101\(\alpha^{157}\)6701000011\(\alpha^{98}\)
21411010110\(\alpha^{85}\)21511010111\(\alpha^{170}\)
21511010111\(\alpha^{170}\)21411010110\(\alpha^{85}\)
21611011000\(\alpha^{251}\)1600010000\(\alpha^{4}\)
21711011001\(\alpha^{96}\)11501110011\(\alpha^{159}\)
21811011010\(\alpha^{134}\)11801110110\(\alpha^{121}\)
21911011011\(\alpha^{177}\)12001111000\(\alpha^{78}\)
22011011100\(\alpha^{187}\)15310011001\(\alpha^{68}\)
22111011101\(\alpha^{204}\)1000001010\(\alpha^{51}\)
22211011110\(\alpha^{62}\)2500011001\(\alpha^{193}\)
22311011111\(\alpha^{90}\)14510010001\(\alpha^{165}\)
22411100000\(\alpha^{203}\)2000010100\(\alpha^{52}\)
22511100001\(\alpha^{89}\)6300111111\(\alpha^{166}\)
22611100010\(\alpha^{95}\)23011100110\(\alpha^{160}\)
22711100011\(\alpha^{176}\)24011110000\(\alpha^{79}\)
22811100100\(\alpha^{156}\)13410000110\(\alpha^{99}\)
22911100101\(\alpha^{169}\)17710110001\(\alpha^{86}\)
23011100110\(\alpha^{160}\)22611100010\(\alpha^{95}\)
23111100111\(\alpha^{81}\)24111110001\(\alpha^{174}\)
23211101000\(\alpha^{11}\)25011111010\(\alpha^{244}\)
23311101001\(\alpha^{245}\)11601110100\(\alpha^{10}\)
23411101010\(\alpha^{22}\)24311110011\(\alpha^{233}\)
23511101011\(\alpha^{235}\)18010110100\(\alpha^{20}\)
23611101100\(\alpha^{122}\)10901101101\(\alpha^{133}\)
23711101101\(\alpha^{117}\)3300100001\(\alpha^{138}\)
23811101110\(\alpha^{44}\)17810110010\(\alpha^{211}\)
23911101111\(\alpha^{215}\)10601101010\(\alpha^{40}\)
24011110000\(\alpha^{79}\)22711100011\(\alpha^{176}\)
24111110001\(\alpha^{174}\)23111100111\(\alpha^{81}\)
24211110010\(\alpha^{213}\)18110110101\(\alpha^{42}\)
24311110011\(\alpha^{233}\)23411101010\(\alpha^{22}\)
24411110100\(\alpha^{230}\)300000011\(\alpha^{25}\)
24511110101\(\alpha^{231}\)14310001111\(\alpha^{24}\)
24611110110\(\alpha^{173}\)21111010011\(\alpha^{82}\)
24711110111\(\alpha^{232}\)20111001001\(\alpha^{23}\)
24811111000\(\alpha^{116}\)6601000010\(\alpha^{139}\)
24911111001\(\alpha^{214}\)21211010100\(\alpha^{41}\)
25011111010\(\alpha^{244}\)23211101000\(\alpha^{11}\)
25111111011\(\alpha^{234}\)11701110101\(\alpha^{21}\)
25211111100\(\alpha^{168}\)12701111111\(\alpha^{87}\)
25311111101\(\alpha^{80}\)25511111111\(\alpha^{175}\)
25411111110\(\alpha^{88}\)12601111110\(\alpha^{167}\)
25511111111\(\alpha^{175}\)25311111101\(\alpha^{80}\)

ブロックごとの誤り訂正コード語数が\(h\)のとき、生成多項式は

\begin{align} g(y) &= (y-\alpha^0)(y-\alpha^1)(y-\alpha^2)\cdots (y-\alpha^{h-1}) \end{align}

と定義される。(このとき\(\left\lfloor\frac{h}{2}\right\rfloor\)個までの符号語に誤りが発生しても訂正することができる)

BCH符号と同様に、(ブロック分割された)データコード語\(a(y)\)に\(y^h\)を掛けて\(g(y)\)で割った余り\(r(y)\)を用いることで、RS符号\(w(y):=a(y)y^h+r(y)\)が得られる。
このとき、\(r(y)\)の係数を羅列したものが(ブロックごとの)誤り訂正コード語となる。

例1

最も単純な例として、バージョン1・誤り訂正レベルLで、データが文字列「QRコード」の場合を考える。

(ブロックごとの)誤り訂正コード語数は7なので、生成多項式は

\begin{align} g(y) &= (y-\alpha^0)(y-\alpha^1)(y-\alpha^2)(y-\alpha^3)(y-\alpha^4)(y-\alpha^5)(y-\alpha^6) \\ \end{align}

となる。この式は、上記の表を参照して例えば

\begin{align} (y-\alpha^5)(y-\alpha^6) &= (y+\alpha^5)(y+\alpha^6) \\ &= y^2 + (\alpha^5 + \alpha^6)y + \alpha^5\alpha^6 \\ &= y^2 + (00100000 \:\mathrm{XOR}\: 01000000)y + \alpha^{11} \\ &= y^2 + 01100000\cdot y + \alpha^{11} \\ &= y^2 + \alpha^{30}y + \alpha^{11} \\ \end{align}

という風に展開していくことができ、最終的に

\begin{align} g(y) &= (y-\alpha^0)(y-\alpha^1)(y-\alpha^2)(y-\alpha^3)(y-\alpha^4)(y-\alpha^5)(y-\alpha^6) \\ &= y^7 + \alpha^{87}y^6 + \alpha^{229}y^5 + \alpha^{146}y^4 + \alpha^{149}y^3 + \alpha^{238}y^2 + \alpha^{102}y + \alpha^{21} \\ &= y^7 + 127y^6 + 122y^5 + 154y^4 + 164y^3 + 11y^2 + 68y + 117 \\ \end{align}

と表すことができる。

データは「40 B5 15 2E 38 2B 3E 38 3B CE 38 38 90 EC 11 EC 11 EC 11」の19コード語となり、多項式で表すと次の通り。

\begin{align} a(y) &= \mathrm{0x40}y^{18} + \mathrm{0xB5}y^{17} + \mathrm{0x15}y^{16} + \mathrm{0x2E}y^{15} + \mathrm{0x38}y^{14} + \mathrm{0x2B}y^{13} + \mathrm{0x3E}y^{12} + \mathrm{0x38}y^{11} + \mathrm{0x3B}y^{10} + \mathrm{0xCE}y^9 + \mathrm{0x38}y^8 + \mathrm{0x38}y^7 + \mathrm{0x90}y^6 + \mathrm{0xEC}y^5 + \mathrm{0x11}y^4 + \mathrm{0xEC}y^3 + \mathrm{0x11}y^2 + \mathrm{0xEC}y + \mathrm{0x11} \\ &= 64y^{18} + 181y^{17} + 21y^{16} + 46y^{15} + 56y^{14} + 43y^{13} + 62y^{12} + 56y^{11} + 59y^{10} + 206y^9 + 56y^8 + 56y^7 + 144y^6 + 236y^5 + 17y^4 + 236y^3 + 17y^2 + 236y + 17 \\ \end{align}

したがって、\(r(y)\)は次のように求めることができる。(\(\mathbb{F}_{2^8}\)上の掛け算・引き算であることに注意)

\begin{align} 64\,\phantom{00}3\,127\,\phantom{0}24\,234\,106\,221\,183\,132\,141\,\phantom{0}43\,219\,232\,218\,\phantom{0}13\,\phantom{0}19\,221\,111\,188\, \\ 1\,127\,122\,154\,164\,\phantom{0}11\,\phantom{0}68\,117 \enclose{longdiv}{\phantom{0}64\,181\,\phantom{0}21\,\phantom{0}46\,\phantom{0}56\,\phantom{0}43\,\phantom{0}62\,\phantom{0}56\,\phantom{0}59\,206\,\phantom{0}56\,\phantom{0}56\,144\,236\,\phantom{0}17\,236\,\phantom{0}17\,236\,\phantom{0}17\,\phantom{00}0\,\phantom{00}0\,\phantom{00}0\,\phantom{00}0\,\phantom{00}0\,\phantom{00}0\,\phantom{00}0} \\ \underline{\phantom{0}64\,182\,235\,\phantom{0}73\,114\,250\,208\,\phantom{0}12} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \phantom{000\,00}3\,254\,103\,\phantom{0}74\,209\,238\,\phantom{0}52\,\phantom{0}59 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{3\,129\,142\,179\,241\,\phantom{0}29\,204\,159} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 127\,233\,249\,\phantom{0}32\,243\,248\,164\,206 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{127\,241\,111\,243\,203\,\phantom{0}94\,\phantom{0}87\,208} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 24\,150\,211\,\phantom{0}56\,166\,243\,\phantom{0}30\,\phantom{0}56 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{24\,124\,\phantom{00}4\,241\,219\,232\,\phantom{0}46\,140} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 234\,215\,201\,125\,\phantom{0}27\,\phantom{0}48\,180\,\phantom{0}56 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{234\,189\,216\,252\,179\,\phantom{0}32\,151\,119} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 106\,\phantom{0}17\,129\,168\,\phantom{0}16\,\phantom{0}35\,\phantom{0}79\,144 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{106\,204\,\phantom{0}19\,110\,\phantom{0}87\,201\,\phantom{0}42\,111} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 221\,146\,198\,\phantom{0}71\,234\,101\,255\,236 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{221\,\phantom{0}37\,171\,226\,\phantom{0}67\,220\,\phantom{0}10\,\phantom{0}36} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 183\,109\,165\,169\,185\,245\,200\,\phantom{0}17 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{183\,233\,184\,140\,\phantom{0}20\,\phantom{0}21\,\phantom{0}32\,\phantom{0}75} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 132\,\phantom{0}29\,\phantom{0}37\,173\,224\,232\,\phantom{0}90\,236 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{132\,144\,\phantom{0}62\,192\,\phantom{0}78\,197\,176\,209} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 141\,\phantom{0}27\,109\,174\,\phantom{0}45\,234\,\phantom{0}61\,\phantom{0}17 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{141\,\phantom{0}48\,179\,254\,163\,150\,238\,\phantom{0}43} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 43\,222\,\phantom{0}80\,142\,124\,211\,\phantom{0}58\,236 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{43\,\phantom{00}5\,130\,189\,129\,\phantom{0}56\,190\,\phantom{0}22} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 219\,210\,\phantom{0}51\,253\,235\,132\,250\,\phantom{0}17 \phantom{\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{219\,\phantom{0}58\,170\,153\,188\,230\,143\,\phantom{00}7} \phantom{\,000\,000\,000\,000\,000\,000\,000}\, \\ 232\,153\,100\,\phantom{0}87\,\phantom{0}98\,117\,\phantom{0}22\,\phantom{00}0\phantom{\,000\,000\,000\,000\,000\,000}\, \\ \underline{232\,\phantom{0}67\,\phantom{0}44\,213\,230\,\phantom{0}54\,\phantom{0}31\,157} \phantom{\,000\,000\,000\,000\,000\,000}\, \\ 218\,\phantom{0}72\,130\,132\,\phantom{0}67\,\phantom{00}9\,157\,\phantom{00}0\phantom{\,000\,000\,000\,000\,000}\, \\ \underline{218\,\phantom{0}69\,208\,\phantom{00}3\,\phantom{0}24\,237\,203\,114} \phantom{\,000\,000\,000\,000\,000}\, \\ 13\,\phantom{0}82\,135\,\phantom{0}91\,228\,\phantom{0}86\,114\,\phantom{00}0\phantom{\,000\,000\,000\,000}\, \\ \underline{13\,\phantom{0}65\,120\,108\,\phantom{0}71\,127\,\phantom{0}83\,\phantom{0}51} \phantom{\,000\,000\,000\,000}\, \\ 19\,255\,\phantom{0}55\,163\,\phantom{0}41\,\phantom{0}33\,\phantom{0}51\,\phantom{00}0\phantom{\,000\,000\,000}\, \\ \underline{19\,\phantom{0}34\,125\,230\,\phantom{0}99\,173\,248\,156} \phantom{\,000\,000\,000}\, \\ 221\,\phantom{0}74\,\phantom{0}69\,\phantom{0}74\,140\,203\,156\,\phantom{00}0\phantom{\,000\,000}\, \\ \underline{221\,\phantom{0}37\,171\,226\,\phantom{0}67\,220\,\phantom{0}10\,\phantom{0}36} \phantom{\,000\,000}\, \\ 111\,238\,168\,207\,\phantom{0}23\,150\,\phantom{0}36\,\phantom{00}0\phantom{\,000}\, \\ \underline{111\,\phantom{0}82\,156\,166\,\phantom{0}89\,238\,\phantom{0}99\,211} \phantom{\,000}\, \\ 188\,\phantom{0}52\,105\,\phantom{0}78\,120\,\phantom{0}71\,211\,\phantom{00}0 \, \\ \underline{188\,183\,193\,155\,172\,\phantom{0}80\,246\,\phantom{0}91} \, \\ 131\,168\,213\,212\,\phantom{0}23\,\phantom{0}37\,\phantom{0}91 \, \\ \end{align}

\(r(y)\)の係数を羅列したものが誤り訂正コード語であり、16進表記で表すと「83 A8 D5 D4 17 25 5B」となる。

012345678910111213141516171819202122232425
Block 040B5152E382B3E383BCE383890EC11EC11EC1183A8D5D417255B

例2

バージョン5・誤り訂正レベルHで、データが文字列「QRコード」の例を考える。

ブロックごとの誤り訂正コード語数は22なので、生成多項式は

\begin{align} g(y) &= (y-\alpha^0)(y-\alpha^1)(y-\alpha^2)\cdots (y-\alpha^{21}) \\ &= y^{22} + \alpha^{210}y^{21} + \alpha^{171}y^{20} + \alpha^{247}y^{19} + \alpha^{242}y^{18} + \alpha^{93}y^{17} + \alpha^{230}y^{16} + \alpha^{14}y^{15} + \alpha^{109}y^{14} + \alpha^{221}y^{13} + \alpha^{53}y^{12} + \alpha^{200}y^{11} + \alpha^{74}y^{10} + \alpha^{8}y^9 + \alpha^{172}y^8 + \alpha^{98}y^7 + \alpha^{80}y^6 + \alpha^{219}y^5 + \alpha^{134}y^4 + \alpha^{160}y^3 + \alpha^{105}y^2 + \alpha^{165}y + \alpha^{231} \\ &= y^{22} + 89y^{21} + 179y^{20} + 131y^{19} + 176y^{18} + 182y^{17} + 244y^{16} + 19y^{15} + 189y^{14} + 69y^{13} + 40y^{12} + 28y^{11} + 137y^{10} + 29y^9 + 123y^8 + 67y^7 + 253y^6 + 86y^5 + 218y^4 + 230y^3 + 26y^2 + 145y + 245 \\ \end{align}

となる。

前節の例からデータコード語は4つに分割され、それぞれ誤り訂正コード語は次の表のようになる。(計算過程は省略)

0123456789101112131415161718192021222324252627282930313233
Block 040B5152E382B3E383BCE3831BCE3E0142EE87EC2E833575342AAF10375ED860528
Block 13890EC11EC11EC11EC11EC69E6058BCA703F461A9DE16639077FC84BA1BA776840
Block 211EC11EC11EC11EC11EC11EC177344F57D42CBEB5558AEB2E5B576942CAFD5F31BD7
Block 311EC11EC11EC11EC11EC11EC177344F57D42CBEB5558AEB2E5B576942CAFD5F31BD7

コード語の配置

これまでの手順で得られたデータコード語と誤り訂正コード語をQRコードに配置する。

データコード語と誤り訂正コード語に次のように番号を振る。(バージョン5・誤り訂正レベルHの例)

0123456789101112131415161718192021222324252627282930313233
Block 0D1D2D3D4D5D6D7D8D9D10D11E1E2E3E4E5E6E7E8E9E10E11E12E13E14E15E16E17E18E19E20E21E22
Block 1D12D13D14D15D16D17D18D19D20D21D22E23E24E25E26E27E28E29E30E31E32E33E34E35E36E37E38E39E40E41E42E43E44
Block 2D23D24D25D26D27D28D29D30D31D32D33D34E45E46E47E48E49E50E51E52E53E54E55E56E57E58E59E60E61E62E63E64E65E66
Block 3D35D36D37D38D39D40D41D42D43D44D45D46E67E68E69E70E71E72E73E74E75E76E77E78E79E80E81E82E83E84E85E86E87E88

このとき、これらのデータコード語を「D1 D12 D23 D35 D2 D13 … D33 D45 D34 D46 E1 E23 … E66 E88」というように縦方向に取り出して並び替える。

こうして得られたコード語の列を、下図のように右下からジグザグに1ビットずつ配置していく。
また、最後に残余ビットが生じた場合は0で埋める。下図では「R」と書かれた左下の領域が残余ビットにあたる。


コード語の配置順 (バージョン5・誤り訂正レベルH)

コード語の配置順 (バージョン5・誤り訂正レベルH, ビット単位)

バージョン5・誤り訂正レベルHで、データが文字列「QRコード」の場合、並び替えたコード語は「40 38 11 11…」で、ビット列で表すと「01000000 00111000 00010001 00010001…」となる。上記の順序でジグザグに書き込むと下図のようになる。


マスク前のQRコード (バージョン5・誤り訂正レベルH)

マスク

QRコードの白セル・黒セルの個数のバランスを調整し、更にFinder Patternとの誤認識を防ぐため、符号語領域の白黒を特定パターンで反転させる操作を行う。この操作をマスク処理と言う。

マスクパターンは8種類定められている。左上を\((i,j)=(0,0)\)とした\(i\)行\(j\)列のセル座標に対して、次の条件を満たす座標のセルが反転される。(「/」は余りを切り捨てる割り算を意味し、「%」は剰余演算を意味する)

マスクパターン 条件 備考
0 (i+j)%2 = 0
1 i%2 = 0
2 j%3 = 0
3 (i+j)%3 = 0
4 ((i/2)+(j/3))%2 = 0
5 (i*j)%2 + (i*j)%3 = 0 (i*j)%6 = 0 と同義
6 ((i*j)%2 + (i*j)%3)%2 = 0 (i*j)%6 < 3 と同義
7 ((i*j)%3 + (i+j)%2)%2 = 0 ((i*j)%3 + i + j)%2 = 0 と同義


12x12のマスクパターン (黒が反転させる位置を表す)

8種類のマスクから最適なマスクを選定するため、次のように各マスクのペナルティを計算する。マスク前のQRコードに8種類のマスクをそれぞれ適用し、次の表の4項目に基づいて合計値を計算する。
8種類の内でペナルティが最小のQRコードが最終的なQRコードになる。(ペナルティ最小ではないQRコードも多くの機器では読み取ることは可能)

項目 条件 1個ごとのペナルティ
1 同じ色のセルが5個以上縦か横に連続する (連続する個数)-2
2 同じ色のセルの2x2の塊が存在 3
3 縦か横の黒:白:黒:白:黒=1:1:3:1:1のパターンの前後に4つ以上の白が続く 40
4 黒セルと白セルの個数の割合に差がある 10×⌈|黒セル割合-0.5|×20-1⌉
  • 1に関して
    例えば7連続する黒セルが存在するときにその中に含まれる5連続・6連続の黒セルに対して重複してペナルティを課すことはしない。
  • 4に関して
    [45%, 55%]のときに0点、[40%, 45%)∪(55%, 60%]のときに10点、…という風にペナルティを課す。

バージョン5・誤り訂正レベルHで、データが文字列「QRコード」の例を考える。


マスク前のQRコードの例
灰色の部分は未確定のFormat Information


マスクをそれぞれ適用した結果

それぞれのペナルティは次の表の通りなので、ペナルティの最も小さいマスク5が最終的な出力となる。

マスク ペナルティ1 ペナルティ2 ペナルティ3 ペナルティ4 合計
0 396 420 200 0 1016
1 378 414 240 0 1032
2 467 423 80 0 970
3 391 438 120 0 949
4 390 423 200 0 1013
5 399 426 80 0 905
6 412 483 200 0 1095
7 379 423 160 0 962

ペナルティが最小のQRコード (バージョン5・誤り訂正レベルH)

参考

解説

実装例