1960年代に P. Elias によって考案された符号が、記号(文字)列全体を1つの符号語にするもので、符号化や復号化に算術演算(四則演算)によって実行されることから算術符号と総称されている。算術符号は幅広く研究がなされるようになったのは1970年代の後半であり、当時では一般的にあまり知られていなかった。
算術符号は理論上、平均符号長がエントロピーとなる。つまり、平均符号長に関しては、算術符号は最適符号だ。これに対して、よく知られている ハフマン符号はその平均符号長は必ずしもエントロピーにならない。しかし算術符号においては、符号化の際、無限桁の実数演算が理論上必要となるので、実用上有限桁の整数で近似する工夫が必要であろう。
算術符号は入力記号(文字)の出現確率に基づいて単位区間 [0, 1)(左端が0 を含み、右端が1を含まない区間)を逐次縮小し、最終的に得られた区間内の値を符号とする符号である。ハフマン符号では出現確率の大きい記号に短い符号語を割り当てるのに対して、算術符号では、出現確率の大きい文字に幅の大きい区間を振り分ける。
<関数名>
enArith 算術符号
deArith 算術符号からの復号
<形式>
算術符号
long enArith(unsigned char *code, long clen,
unsigned char *text, long tlen);
算術符号からの復号
long deArith(unsigned char *text, long tlen,
unsigned char *code, long clen);
<引数>
算術符号関数において
code (入出力)算術符号を格納する配列
clen (入力) 配列codeの長さ
text (入力) テキストを格納する配列
tlen (入力) 配列textの長さ
算術符号からの復号関数において
text (入出力)テキストを格納する配列
tlen (入力) 配列textの長さ
code (入力) 算術符号を格納する配列
clen (入力) 配列codeの長さ
<関数値>
算術符号関数について
算術符号の長さ。符号化に失敗したときは -1L。
算術符号からの復号関数について
テキストの長さ。復号に失敗したときは -1L。
<用例>
<関数本体>
arithmetic.c