(57)【要約】【課題】下限と上限の区間を再分割しながら下限と上限の区間を絞り込むといった演算を必要とせず、高速化を図る。【解決手段】変形ベルヌーイ写像を遡る式を用いて、伸長コードの１単位データ毎に圧縮値の上限値と下限値とを算出し前記圧縮値の範囲を得る演算を反復して行う圧縮処理手段１１０と、前記圧縮処理手段１１０により最終的に求められた圧縮値の範囲から圧縮コードを生成する圧縮コード生成手段１２０とを具備する。【選択図】図１
2019047450.tif 000002
【特許請求の範囲】
【請求項１】
変形ベルヌーイ写像を遡る式を用いて、伸長コードの１単位データ毎に圧縮値の上限値と下限値とを算出し前記圧縮値の範囲を得る演算を反復して行う圧縮処理手段と、
前記圧縮処理手段により最終的に求められた圧縮値の範囲から圧縮コードを生成する圧縮コード生成手段と
を具備することを特徴とする本発明に係る圧縮処理装置。
【請求項２】
圧縮処理手段は、伸長コードの最後尾の１単位データから最前の１単位データへ向かって１単位データ毎に圧縮値の範囲を得る演算を行うことを特徴とする請求項１に記載の圧縮処理装置。
【請求項３】
圧縮処理手段は、上限値を求める演算と下限値を求める演算を、別個に行うことを特徴とする請求項１または２に記載の圧縮処理装置。
【請求項４】
圧縮コード生成手段は、最終的に求められた圧縮値の範囲において最も少ないビット列で表すことが可能な２進数の小数を圧縮コードとすることを特徴とする請求項１乃至３のいずれか１項に記載の圧縮処理装置。
【請求項５】
変形ベルヌーイ写像を遡る式は、伸長コードを構成する１単位データの種類に対応して分かれていることを特徴とする請求項１乃至４のいずれか１項に記載の圧縮処理装置。
【請求項６】
圧縮コード生成手段は、上限値と下限値との差分値と、上限値または下限値のみを求め、上限値のみを求めた場合には最終的に求めた上限値から上記差分値を引いて最終的な下限値を求め、下限値のみを求めた場合には最終的に求めた下限値に上記差分値を加えて最終的な上限値を求めることを特徴とする請求項１乃至５のいずれか１項に記載の圧縮処理装置。
【請求項７】
演算を整数演算化して行い、圧縮値及び圧縮値の範囲を、伸長コードを構成する１単位データの数（Ｍ）倍することを特徴とする請求項１乃至６のいずれか１項に記載の圧縮処理装置。
【請求項８】
変形ベルヌーイ写像を遡る式
の係数を、約分することを特徴とする請求項７に記載の圧縮処理装置。
【請求項９】
圧縮コード生成手段により生成された圧縮コードの伸長コードに対する圧縮率を求める圧縮率算出手段と、
前記圧縮率算出手段により算出された圧縮率が所定値よりも大きい場合に、変形ベルヌーイ写像を遡る式の係数を変更して圧縮コードを求める処理を行うことを特徴とする請求項７または８に記載の圧縮処理装置。
【請求項１０】
二分探索法により新たな係数を求めて係数を変更し、圧縮コードを求める処理を行うことを特徴とする請求項９に記載の圧縮処理装置。
【請求項１１】
伸長コードを構成する１単位データの数が２の倍数となり、且つ変形ベルヌーイ写像を遡る式の係数を、約分可能となるように、伸長コードに所定の１単位データをパディングし、圧縮コードを求める処理を行うことを特徴とする請求項７乃至１０のいずれか１項に記載の圧縮処理装置。
【請求項１２】
圧縮コードに対し変形ベルヌーイ写像の式を用いた演算を施して、伸長コードの１単位データに対応する値を得る計算である１単位データ取得計算及び、この得られた値を前記変形ベルヌーイ写像の式を用いた演算に用いて次の１単位データを得る１単位データ取得計算を、所定回となるまで繰り返す反復計算を行う伸長処理手段と、
前記伸長処理手段の１単位データ取得計算毎に得られる値を、前記変形ベルヌーイ写像の式の係数に基づき伸長コードの１単位データに変換する伸長コード生成手段と
を具備することを特徴とする伸長処理装置。
【請求項１３】
変形ベルヌーイ写像の式は、伸長コードを構成する１単位データの種類に対応して分かれていることを特徴とする請求項１２に記載の伸長処理装置。
【請求項１４】
演算を整数演算化して行い、圧縮値及び圧縮値の範囲を、伸長コードを構成する１単位データの数（Ｍ）倍することを特徴とする請求項１２または１３に記載の伸長処理装置。
【請求項１５】
コンピュータを、
変形ベルヌーイ写像を遡る式を用いて、伸長コードの１単位データ毎に圧縮値の上限値と下限値とを算出し前記圧縮値の範囲を得る演算を反復して行う圧縮処理手段、
前記圧縮処理手段により最終的に求められた圧縮値の範囲から圧縮コードを生成する圧縮コード生成手段
として機能させることを特徴とする圧縮処理用プログラム。
【請求項１６】
コンピュータを更に、伸長コードの最後尾の１単位データから最前の１単位データへ向かって１単位データ毎に圧縮値の範囲を得る演算を行う圧縮処理手段として機能させることを特徴とする請求項１５に記載の圧縮処理用プログラム。
【請求項１７】
コンピュータを更に、上限値を求める演算と下限値を求める演算を、別個に行う圧縮処理手段として機能させることを特徴とする請求項１５または１６に記載の圧縮処理用プログラム。
【請求項１８】
コンピュータを更に、最終的に求められた圧縮値の範囲において最も少ないビット列で表すことが可能な２進数の小数を圧縮コードとする圧縮コード生成手段として機能させることを特徴とする請求項１５乃至１７のいずれか１項に記載の圧縮処理用プログラム。
【請求項１９】
変形ベルヌーイ写像を遡る式は、伸長コードを構成する１単位データの種類に対応して分かれていることを特徴とする請求項１５乃至１８のいずれか１項に記載の圧縮処理用プログラム。
【請求項２０】
コンピュータを更に、上限値と下限値との差分値と、上限値または下限値のみを求め、上限値のみを求めた場合には最終的に求めた上限値から上記差分値を引いて最終的な下限値を求め、下限値のみを求めた場合には最終的に求めた下限値に上記差分値を加えて最終的な上限値を求める圧縮コード生成手段として機能させることを特徴とする請求項１５乃至１９のいずれか１項に記載の圧縮処理用プログラム。
【請求項２１】
演算を整数演算化して行い、圧縮値及び圧縮値の範囲を、伸長コードを構成する１単位データの数（Ｍ）倍することを特徴とする請求項１５乃至２０のいずれか１項に記載の圧縮処理用プログラム。
【請求項２２】
変形ベルヌーイ写像を遡る式の係数を、約分することを特徴とする請求項２１に記載の圧縮処理用プログラム。
【請求項２３】
コンピュータを更に、
圧縮コード生成手段により生成された圧縮コードの伸長コードに対する圧縮率を求める圧縮率算出手段として機能させ、
前記圧縮率算出手段により算出された圧縮率が所定値よりも大きい場合に、変形ベルヌーイ写像を遡る式の係数を変更して圧縮コードを求める処理を行うことを特徴とする請求項２１または２２に記載の圧縮処理用プログラム。
【請求項２４】
二分探索法により新たな係数を求めて係数を変更し、圧縮コードを求める処理を行うことを特徴とする請求項２３に記載の圧縮処理用プログラム。
【請求項２５】
伸長コードを構成する１単位データの数が２の倍数となり、且つ変形ベルヌーイ写像を遡る式の係数を、約分可能となるように、伸長コードに所定の１単位データをパディングし、圧縮コードを求める処理を行うことを特徴とする請求項２１乃至２４のいずれか１項に記載の圧縮処理用プログラム。
【請求項２６】
コンピュータを、
圧縮コードに対し変形ベルヌーイ写像の式を用いた演算を施して、伸長コードの１単位データに対応する値を得る計算である１単位データ取得計算及び、この得られた値を前記変形ベルヌーイ写像の式を用いた演算に用いて次の１単位データを得る１単位データ取得計算を、所定回となるまで繰り返す反復計算を行う伸長処理手段、
前記伸長処理手段の１単位データ取得計算毎に得られる値を、前記変形ベルヌーイ写像の式の係数に基づき伸長コードの１単位データに変換する伸長コード生成手段
として機能させることを特徴とする伸長処理用プログラム。
【請求項２７】
変形ベルヌーイ写像の式は、伸長コードを構成する１単位データの種類に対応して分かれていることを特徴とする請求項２６に記載の伸長処理用プログラム。
【請求項２８】
演算を整数演算化して行い、圧縮値及び圧縮値の範囲を、伸長コードを構成する１単位データの数（Ｍ）倍することを特徴とする請求項２６または２７に記載の伸長処理用プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、様々なデータを圧縮しまた伸長して元のデータに戻す場合に好適な、１次元写像による可逆の圧縮・伸長を行う圧縮処理装置、伸長処理装置、圧縮処理用プログラム、伸長処理用プログラムに関するものである。
【背景技術】
【０００２】
従来技術の可逆圧縮を行う代表的アルゴリズムとして、ハフマン符号、Lempel-Ziv圧縮、算術符号が知られている。この中で繰り返しのパターンが多い（出現確率の偏りが大きい）データに圧縮率が最も大きいとされるものが算術符号である。
【０００３】
算術符号では演算精度を保証するアルゴリズムとしてJONES符号やレンジコーダが知られている。このアルゴリズムによれば、圧縮と伸長処理の計算過程においてデータの頻度を元に区間を再分割しながら下限と上限の２つの区間を絞り込む計算を繰り返す必要があった。算術符号では、伸長処理の演算については、圧縮過程と同じ処理となる。即ち、下限と上限を再分割しながら、区間を絞り込んでいく計算を必要とする。このため、その分の演算コストがかかるという問題があった。
【０００４】
また、従来の圧縮アルゴリズムはデータパターンの頻度が等しく、パターン化が難しい（良質な乱数、または圧縮済みである情報エントロピーが大きい）データに関しては、それ以上圧縮が難しくなるため、圧縮を行っても辞書領域（オーバーヘッド）分データが大きくなるといった問題がある。
【０００５】
特許文献１には、算術デコーダでは、復号オペレーションを開始する際に、デコーダがビットのグループを先読みするので、不一致又は非対称性が生じ得るとことが記載されている。上記の非対称性を補償するため、従来の一解決策では、エンコーダにおいて符号化データに余分なビットを追加しているものがあり、別の解決策では、追加の符号化ビットを発生させず、デコーダにおいて、符号化データのビットストリームを先読みした後、後戻りさせていることが紹介されている。
【０００６】
上記特許文献１では、上記の解決策は、両者ともに、効率が悪いものとして、符号化アルゴリズム及び復号アルゴリズムの複雑さを低減し、符号化、送信、及び復号を行うデータを減らし、更に、記憶の必要性を緩和するために、より効率の良い解決策が要望されているため、これに応えるものとしている。
【０００７】
特許文献１のデータ符号化方法は、イベントシーケンスにおける複数のイベントを符号化して、符号化データを生成するステップと、当該符号化データを用いてビットストリームを生成するとともに、当該符号化データの後のビットストリームにゼロ以上のスタフィングビットを追加することを含むステップとを備えるものである。ここに、ゼロ以上のスタフィングビットは、符号化されたイベントの量と、符号化されているブロックの数と、ビットストリームにおけるビットの数との間の関係を実質的に維持するように機能するものとしている。
【０００８】
また、特許文献１の算術デコーダは、イベントシーケンスのイベントに対してコンテクスト識別子を生成するシーケンサと、ＬＰＳの値及びＬＰＳの確率推定値を決定する確率推定器と、ＬＰＳのレンジに値を割り当てるレンジレジスタを含む復号エンジンとを備えている。コンテクスト識別子がインデックスに等しくない場合に、当該値は、ＬＰＳの確率推定値と、レンジレジスタに記憶された値と、ＬＰＳのレンジへのコンテクスト識別子とに基づき、また、コンテクスト識別子がインデックスに等しい場合に、当該値は、レンジレジスタに記憶された値に基づかないものである。復号エンジンは、更に、ＬＰＳのレンジの値及び情報シーケンスからのビットに基づいて２進イベントの値を決定するように動作する。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２０１２-７５１５０号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
上記の特許文献１の発明は、その００６６欄に記載の通り、エンコーダ４００は、算術符号化のオペレーションを実行するものである。従って、算術符号化のアルゴリズムからの抜け出しは不十分と言わざるを得ないものであった。
【００１１】
本発明は上記のようなデータの圧縮処理、伸長処理の分野における現状に鑑みなされたもので、その目的は、圧縮処理では変形ベルヌーイ写像を逆に演算する式を用いることによって、算術符号のように圧縮演算の過程において下限と上限の区間を再分割しながら下限と上限の区間を絞り込むといった演算を必要としない圧縮処理装置及び圧縮処理用プログラムを提供することである。
【００１２】
また、伸長処理では、変形ベルヌーイ写像を一方向的に反復演算することにより、算術符号の圧縮過程と同じ処理のような、下限と上限を再分割しながら区間を絞り込んでゆく計算を必要とせず、これによって高速に伸長することができる伸長処理装置及び伸長処理用プログラムを提供することである。
【００１３】
更に、これまでは高い圧縮効果が得られなかった情報エントロピーが高いデータについても、フラクタルな特性を持つ一次元写像である変形ベルヌーイ写像を採用することにより効果的な圧縮が可能となり、高い圧縮率を得ることができる圧縮処理装置及び圧縮処理用プログラムを提供することである。
【課題を解決するための手段】
【００１４】
本発明に係る圧縮処理装置は、変形ベルヌーイ写像を遡る式を用いて、伸長コードの１単位データ毎に圧縮値の上限値と下限値とを算出し前記圧縮値の範囲を得る演算を反復して行う圧縮処理手段と、前記圧縮処理手段により最終的に求められた圧縮値の範囲から圧縮コードを生成する圧縮コード生成手段とを具備することを特徴とする。
【００１５】
本発明に係る圧縮処理装置では、圧縮処理手段は、伸長コードの最後尾の１単位データから最前の１単位データへ向かって１単位データ毎に圧縮値の範囲を得る演算を行うことを特徴とする。
【００１６】
本発明に係る圧縮処理装置では、圧縮処理手段は、上限値を求める演算と下限値を求める演算を、別個に行うことを特徴とする。
【００１７】
本発明に係る圧縮処理装置では、圧縮コード生成手段は、最終的に求められた圧縮値の範囲において最も少ないビット列で表すことが可能な２進数の小数を圧縮コードとすることを特徴とする。
【００１８】
本発明に係る圧縮処理装置では、変形ベルヌーイ写像を遡る式は、伸長コードを構成する１単位データの種類に対応して分かれていることを特徴とする。
【００１９】
本発明に係る圧縮処理装置では、圧縮コード生成手段は、上限値と下限値との差分値と、上限値または下限値のみを求め、上限値のみを求めた場合には最終的に求めた上限値から上記差分値を引いて最終的な下限値を求め、下限値のみを求めた場合には最終的に求めた下限値に上記差分値を加えて最終的な上限値を求めることを特徴とする。
【００２０】
本発明に係る圧縮処理装置では、演算を整数演算化して行い、変形ベルヌーイ写像の式の係数を、伸長コードを構成する１単位データの数（Ｍ）倍することを特徴とする。
【００２１】
本発明に係る圧縮処理装置では、変形ベルヌーイ写像を遡る式の係数を、約分することを特徴とする。
【００２２】
本発明に係る圧縮処理装置では、圧縮コード生成手段により生成された圧縮コードの伸長コードに対する圧縮率を求める圧縮率算出手段と、前記圧縮率算出手段により算出された圧縮率が所定値よりも大きい場合に、変形ベルヌーイ写像を遡る式の係数を変更して圧縮コードを求める処理を行うことを特徴とする。
【００２３】
本発明に係る圧縮処理装置では、二分探索法により新たな係数を求めて係数を変更し、圧縮コードを求める処理を行うことを特徴とする。
【００２４】
本発明に係る圧縮処理装置では、伸長コードを構成する１単位データの数が２の倍数となり、且つ変形ベルヌーイ写像を遡る式の係数を、約分可能となるように、伸長コードに所定の１単位データをパディングし、圧縮コードを求める処理を行うことを特徴とする。
【００２５】
本発明に係る伸長処理装置は、圧縮コードに対し変形ベルヌーイ写像の式を用いた演算を施して、伸長コードの１単位データに対応する値を得る計算である１単位データ取得計算及び、この得られた値を前記変形ベルヌーイ写像の式を用いた演算に用いて次の１単位データを得る１単位データ取得計算を、所定回となるまで繰り返す反復計算を行う伸長処理手段と、前記伸長処理手段の１単位データ取得計算毎に得られる値を、前記変形ベルヌーイ写像の式の係数に基づき伸長コードの１単位データに変換する伸長コード生成手段とを具備することを特徴とする。
【００２６】
本発明に係る伸長処理装置では、変形ベルヌーイ写像の式は、伸長コードを構成する１単位データの種類に対応して分かれていることを特徴とする。
【００２７】
本発明に係る伸長処理装置では、演算を整数演算化して行い、変形ベルヌーイ写像の式の係数を、伸長コードを構成する１単位データの数（Ｍ）倍することを特徴とする。
【００２８】
本発明に係る圧縮処理用プログラムは、コンピュータを、変形ベルヌーイ写像を遡る式を用いて、伸長コードの１単位データ毎に圧縮値の上限値と下限値とを算出し前記圧縮値の範囲を得る演算を反復して行う圧縮処理手段、前記圧縮処理手段により最終的に求められた圧縮値の範囲から圧縮コードを生成する圧縮コード生成手段として機能させることを特徴とする。
【００２９】
本発明に係る圧縮処理用プログラムでは、コンピュータを更に、伸長コードの最後尾の１単位データから最前の１単位データへ向かって１単位データ毎に圧縮値の範囲を得る演算を行う圧縮処理手段として機能させることを特徴とする。
【００３０】
本発明に係る圧縮処理用プログラムでは、コンピュータを更に、上限値を求める演算と下限値を求める演算を、別個に行う圧縮処理手段として機能させることを特徴とする。
【００３１】
本発明に係る圧縮処理用プログラムでは、コンピュータを更に、最終的に求められた圧縮値の範囲において最も少ないビット列で表すことが可能な２進数の小数を圧縮コードとする圧縮コード生成手段として機能させることを特徴とする。
【００３２】
本発明に係る圧縮処理用プログラムでは、変形ベルヌーイ写像を遡る式は、伸長コードを構成する１単位データの種類に対応して分かれていることを特徴とする。
【００３３】
本発明に係る圧縮処理用プログラムでは、コンピュータを更に、上限値と下限値との差分値と、上限値または下限値のみを求め、上限値のみを求めた場合には最終的に求めた上限値から上記差分値を引いて最終的な下限値を求め、下限値のみを求めた場合には最終的に求めた下限値に上記差分値を加えて最終的な上限値を求める圧縮コード生成手段として機能させることを特徴とする。
【００３４】
本発明に係る圧縮処理用プログラムでは、演算を整数演算化して行い、変形ベルヌーイ写像の式の係数を、伸長コードを構成する１単位データの数（Ｍ）倍することを特徴とする。
【００３５】
本発明に係る圧縮処理用プログラムでは、変形ベルヌーイ写像を遡る式の係数を、約分することを特徴とする。
【００３６】
本発明に係る圧縮処理用プログラムでは、コンピュータを更に、圧縮コード生成手段により生成された圧縮コードの伸長コードに対する圧縮率を求める圧縮率算出手段として機能させ、前記圧縮率算出手段により算出された圧縮率が所定値よりも大きい場合に、変形ベルヌーイ写像を遡る式の係数を変更して圧縮コードを求める処理を行うことを特徴とする。
【００３７】
本発明に係る圧縮処理用プログラムでは、二分探索法により新たな係数を求めて係数を変更し、圧縮コードを求める処理を行うことを特徴とする。
【００３８】
本発明に係る圧縮処理用プログラムでは、伸長コードを構成する１単位データの数が２の倍数となり、且つ変形ベルヌーイ写像を遡る式の係数を、約分可能となるように、伸長コードに所定の１単位データをパディングし、圧縮コードを求める処理を行うことを特徴とする。
【００３９】
本発明に係る伸長処理用プログラムは、コンピュータを、圧縮コードに対し変形ベルヌーイ写像の式を用いた演算を施して、伸長コードの１単位データに対応する値を得る計算である１単位データ取得計算及び、この得られた値を前記変形ベルヌーイ写像の式を用いた演算に用いて次の１単位データを得る１単位データ取得計算を、所定回となるまで繰り返す反復計算を行う伸長処理手段、前記伸長処理手段の１単位データ取得計算毎に得られる値を、前記変形ベルヌーイ写像の式の係数に基づき伸長コードの１単位データに変換する伸長コード生成手段として機能させることを特徴とする。
【００４０】
本発明に係る伸長処理用プログラムでは、変形ベルヌーイ写像の式は、伸長コードを構成する１単位データの種類に対応して分かれていることを特徴とする。
【００４１】
本発明に係る伸長処理用プログラムでは、演算を整数演算化して行い、変形ベルヌーイ写像の式の係数を、伸長コードを構成する１単位データの数（Ｍ）倍することを特徴とする。
【発明の効果】
【００４２】
本発明によれば、圧縮処理においては、変形ベルヌーイ写像を逆に演算する式を用いるので、算術符号のように圧縮演算の過程において下限と上限の区間を再分割しながら下限と上限の区間を絞り込むといった演算を必要としないという効果を奏する。
【００４３】
本発明によれば、伸長処理では、変形ベルヌーイ写像を一方向的に反復演算することになるので、算術符号の圧縮過程と同じ処理のような、下限と上限を再分割しながら区間を絞り込んでゆく計算を必要とせず、これによって高速に伸長することができるという効果を奏する。
【００４４】
本発明によれば、これまでは高い圧縮効果が得られなかった情報エントロピーが高いデータについても、フラクタルな特性を持つ一次元写像である変形ベルヌーイ写像を採用することにより効果的な圧縮が可能となり、高い圧縮率を得ることができるという効果を奏する。
【図面の簡単な説明】
【００４５】
【図１】本発明に係る圧縮処理装置と伸長処理装置の第１の実施形態の構成を示すブロック図。
【図２】本発明に係る実施形態において用いた、データパターンが２種のときにおける、変形ベルヌーイ写像の一例のマップを示す図。
【図３】本発明に係る実施形態において用いた変形ベルヌーイ写像の一例における時系列の値変化を示す図。
【図４】本発明に係る実施形態において採用された変形ベルヌーイ写像の一例を用いた伸長処理により得られた伸長コードと、その際に用いた式との対応関係を示す図。
【図５】本発明に係る実施形態において採用された変形ベルヌーイ写像の一例を用いた伸長処理により得られる４ビットの伸長コードと、各４ビットの伸長コードに対応する初期値の座標を変形ベルヌーイ写像の線分と共に示した図。
【図６】図５の４ビットの伸長コードと、各４ビットの伸長コードに対応する初期値の上限値と下限値とを対応付けて示した図。
【図７】図５の例において、傾きp を変動させた場合の対応する初期値の変化を示す図。
【図８】６ビットの伸長コードを生成した場合において、傾きp を変動させた場合の対応する初期値の変化を示す図。
【図９】４ビットの伸長コードを生成した場合において、傾きp に対して採り得る初期値の区間を、変形ベルヌーイ写像の場合と算術符号の場合とで比較して示した図。
【図１０】データパターンが２種のときにおいて、所定伸長コードが与えられた場合に圧縮コードを得るまでの工程を示した図であり、（ａ）は算術符号の場合を示す図、（ｂ）は変形ベルヌーイ写像の場合を示す図。
【図１１】データパターンが３種のときにおいて、所定伸長コードが与えられた場合に圧縮コードを得るまでの工程を示した図であり、（ａ）は算術符号の場合を示す図、（ｂ）は変形ベルヌーイ写像の場合を示す図。
【図１２】本発明に係る実施形態において用いた、データパターンが３種のときにおける、変形ベルヌーイ写像の一例のマップを示す図。
【図１３】本発明に係る実施形態において、データパターンが３種のときにおける、伸長コード生成過程における演算の結果の値xiと、生成される１単位の伸長コードの対応を示す図。
【図１４】本発明に係る実施形態において、データパターンが３種のときに、傾きpaと傾きpb を変動させた場合の対応する初期値の変化を示す図であり、（ａ）はデータ列"abaacb"の場合の図、（ｂ）はデータ列"caabac"の場合の図。
【図１５】本発明に係る実施形態の、圧縮処理の動作を示すフローチャート。
【図１６】本発明に係る実施形態の、データパターンが３種のときにおける圧縮処理の過程において、下限Xiと上限Xi、PA ,PB ,MXの値の変化を示す図。
【図１７】データパターンが３種のときにおけるバイナリで圧縮コードを求めるために、下限X0と上限X0をMXで割る割算をビット値同士で行う演算手法を示す図。
【図１８】本発明に係る実施形態において、データパターンが３種のときに、得られる圧縮コードのファイル内容の一例を示す図。
【図１９】本発明に係る実施形態の伸長処理の動作を示すフローチャート。
【図２０】本発明に係る実施形態の、データパターンが３種のときにおける初期パラメータの演算精度幅を拡大する処理を示す図。
【図２１】本発明に係る実施形態の、データパターンが３種のときにおける伸長処理の過程において、演算値Xi、PA ,PB ,演算幅倍率の値の変化を示す図。
【図２２】本発明に係る実施形態４において用いる５種のデータパターンの文字列を示す図。
【図２３】本発明に係る実施形態４において用いる５種のデータパターンの文字列を合計１２８個用いて第１のランダムに並べ変えた第１のファイルαの先頭１０行を示す図。
【図２４】本発明に係る実施形態４において、図２３の第１のファイルαと、これと同様にして別のランダムな並べ方で生成した第２のファイルβ、γを含めた３種のファイルα、β、γの圧縮結果を示す図。
【図２５】本発明に係る実施形態４において、第１のファイルαを圧縮した工程における各パラメータ等の変遷を示す図。
【図２６】本発明に係る実施形態４において、第１のファイルαを圧縮した結果、得られた圧縮コードのファイル内容の一例を示す図。
【図２７】本発明に係る実施形態４において、伸長処理における拡大処理によって生成される各種のパラメータを示す図。
【図２８】本発明に係る実施形態４において、第１のファイルαを伸長した工程における演算値と伸長コードの変遷を示す図。
【図２９】本発明に係る実施形態５において、２値の所定データの圧縮処理を行った場合の演算値XiとPAの値の遷移を示す図。
【図３０】本発明に係る実施形態５において、２値の所定データの圧縮処理を行った場合に得られた圧縮コードのファイル内容の一例を示す図であり、図３０（ａ）は１０進数による表記の図であり、図３０（ｂ）は２進数による表記の図。
【図３１】本発明に係る実施形態５において、図２９の場合に用いた傾きpと異なる値の傾きを用いて、２値の所定データの圧縮処理を行った場合の演算値XiとPAの値の遷移を示す図。
【図３２】本発明に係る実施形態５において、２値の所定データの圧縮処理を行った場合に得られた圧縮コードのファイル内容の一例を示す図であり、図３２（ａ）は１０進数による表記の図であり、図３２（ｂ）は２進数による表記の図。
【図３３】本発明に係る実施形態５において、図３１の場合に用いた傾きpを用いて、２値の所定データの圧縮処理結果を伸長する処理を行った場合の演算値XiとPAの値の遷移を示す図。
【図３４】本発明に係る実施形態６によって、所与のデータ列を圧縮処理した工程における各パラメータ等の変遷を示す図。
【図３５】本発明に係る実施形態６によって、所与のデータ列を圧縮処理した結果に得られる圧縮データファイルに含まれるデータ内容を示す図。
【図３６】本発明に係る実施形態６によって、所与のデータ列を圧縮処理した結果に対する伸長処理の過程において、変遷する演算値Xi値を示す図。
【発明を実施するための形態】
【００４６】
以下、添付図面を参照して本発明に係る圧縮処理装置、伸長処理装置、圧縮処理用プログラム、伸長処理用プログラムの実施形態を説明する。各図において同一の構成要素には同一の符号を付して重複する説明を省略する。図１に、本発明に係る圧縮処理装置１００と伸長処理装置２００と実施形態の構成図を示す。圧縮処理装置１００には、圧縮処理手段１１０と圧縮コード生成手段１２０が備えられている。伸長処理装置２００には、伸長処理手段２１０と伸長コード生成手段２２０が備えられている。
【００４７】
圧縮処理装置１００と伸長処理装置２００はそれぞれ別のコンピュータによって構成することができ、また、一台のコンピュータによって構成するようにしても良い。３００は、伸長コードの格納部を示し、圧縮処理装置１００や伸長処理装置２００の内部にあっても良いし、外部の記憶装置や他のコンピュータにあっても良い。更に、４００は、圧縮コードの格納部を示し、圧縮処理装置１００や伸長処理装置２００の内部にあっても良いし、外部の記憶装置や他のコンピュータにあっても良い。
【００４８】
伸長コードは、圧縮処理装置１００によって圧縮され得るディジタルデータであって、画像データや文字データ等のようなデータでも良く、一度圧縮されて伸長されたデータでなくとも良い。また、圧縮コードは圧縮処理装置１００によって圧縮されたディジタルデータを指す。
【００４９】
圧縮処理手段１１０は、変形ベルヌーイ写像を遡る式を用いて、伸長コードの１単位データ毎に圧縮値の上限値と下限値とを算出し上記圧縮値の範囲を得る演算を反復して行うものである。ここに、圧縮値は圧縮コードに対応する初期値とこれを演算して得られるもので、以下では" Xi "として表記される値である。圧縮コード生成手段１２０は、上記圧縮処理手段１１０により最終的に求められた圧縮値の範囲から圧縮コードを生成するものである。伸長コードの１単位データとは、伸長コードが１と０の数値により構成されている場合には、この１と０を指す。また、伸長コードがａｂｃｄ・・・のようにアルファベットから構成されているときには、ａ、ｂ、ｃ、ｄ、・・・の１文字を指す。更に、後に説明するが、伸長コードが"Hello World!!\ "のような文字列（一般的には、データ列）を１つのコードとして構成されているときは、この"Hello World!!\ "のような文字列（一般的には、データ列）を指す。
【００５０】
伸長処理手段２１０は、圧縮コードに対し変形ベルヌーイ写像の式を用いた演算を施して、伸長コードの１単位データに対応する値を得る計算である１単位データ取得計算及び、この得られた値を前記変形ベルヌーイ写像の式を用いた演算に用いて次の１単位データを得る１単位データ取得計算を、所定回となるまで繰り返す反復計算を行うものである。伸長コード生成手段２２０は、上記伸長処理手段２１０の１単位データ取得計算毎に得られる値を、上記変形ベルヌーイ写像の式の係数に基づき伸長コードの１単位データに変換するものである。
【００５１】
＜変形ベルヌーイ写像について＞
まず、本実施形態において用いる変形ベルヌーイ写像について説明する。
変形ベルヌーイ写像は以下の式（１）で定義される。
【００５２】
【数１】
2019047450.tif 000003
【００５３】
上記式（１）は、p＝0.5のとき、一般的に知られる一様な分布を持つベルヌーイ写像の式である。この式（１）は、データ伸長処理に用いられる。この変形ベルヌーイ写像のマップを示すと、図２のようであり、式（１）によるiを横軸に、xi+1 を縦軸とした時系列のデータ生成の例は図３に示すようになる。なお、図３の時系列のデータは"p = 0.5" とした場合の例である。
【００５４】
図３に示すように、xi ＜ p のときに、ビット"０"を生成し、p ≦ xi のときに、ビット"１"を生成する規則により、連続してバイナリコードとして例えば４ビット分を取得することができる。上記ベルヌーイ写像の演算より取得されたビット列の値を基に、逆に写像を辿ることで初期値x0の区間を求めることが可能である。例として、"p = 0.5" とした場合にベルヌーイ写像から生成されたビット列を４ビット分とったものが " 0  1  1  0 "であったとする。図４の一番右の列に示すように上から順にビット値が生成され、そのときに選択されたベルヌーイ写像式を"○"で表し、選択されなかったベルヌーイ写像式を"×"で表した。即ち、"○"側の式が実行されて処理が遷移する。
【００５５】
ベルヌーイ写像の最後の解 " x4 " から考えると、写像xiの値域は必ず" 0 ≦ x4 ≦ 1 "の区間であり、この区間のいずれかに " x4 "は含まれている。" x4 "を生成した式は、ビット値が"０"であることから、"○"側の式" x4 = 2 x3 "が実行されていることが判る。この式を用いて、" x3 "の値の範囲を計算すると、
" 0 ≦ x4 ≦ 1 " から " 0 ≦ 2 x3 ≦ 1 " → " 0 ≦ x3 ≦ 0.5 "
となり、この区間から必ず" x3 "は計算されたことが判る。
【００５６】
次に" x3 "を考えると、次に生成されたビット値が"１"であるとの情報から、"○"側の式" x3 = 2 x2 - 1 "が選択されたことが判る。これを" 0 ≦ x3 ≦ 0.5 "に代入することにより、" 0 ≦ 2 x2 - 1 ≦ 0.5 "→ " 1 ≦ 2 x2  ≦ 1.5 "
→ " 0.5 ≦ x2 ≦ 0.75 "となり、" x2 "の区間が絞られる。
【００５７】
同様の処理により、次に生成されたバイナリコードは、ビット値"１"のため、" x1 "の区間は、" 0.5 ≦ x2 ≦ 0.75  " →  " 0.5 ≦ 2 x1 - 1 ≦ 0.75  "
→  " 1.5 ≦ 2 x1 ≦1.75  " → " 0.75 ≦ x1 ≦ 0.875  "となる。
【００５８】
最後に、初期値" x0 "の区間について考察すると、次に生成されたバイナリコードは、祖のビット値が"０"であることにより、" 0.75 ≦ x1 ≦ 0.875 "
→ " 0.75 ≦ 2 x0 ≦ 0.875 " → " 0.375 ≦ x0 ≦ 0.4375 "となり、初期値" x0 "は0.375から0.4375の区間内のいずれかから始まっていたことが判る。この区間内に初期値" x0 "が存在したから、 p = 0.5 としてベルヌーイ写像の式（１）を実行し、上記の図３を用いて説明した「xi ＜ p のときに、ビット"０"を生成し、p ≦ xi のときに、ビット"１"を生成する」という規則によってビット列を生成すると、必ず、" 0  1  1  0 "が出力される。
【００５９】
ここで、 p = 0.5 とした場合のベルヌーイ写像の初期値x0 の区間を16等分したものを図５に示す。図５に示した各初期値x0の区間内から xi < 0.5 のとき、ビット"０"を生成し、0.5 ≦ xi の時ビット"１"を生成させた場合に図６に示す16通りのビット列になり、上記ビット列" 0  1  1  0 "で示した例は図６の<７>になる。ここで、初期値x0 の区間の境界については、上限の値を含まず、図６<７>のように"0.375 ≦x0 < 0.4375 "となる。つまり、半開区間[0.375,0.4375)となる。
【００６０】
上記のように、１次元写像から生成されたビット情報を遡り、初期値x0の区間を求める方法については、特願２０１６−０３８７９４と特願２０１６−０３８７９５によって本願の発明者らが紹介した。
【００６１】
ベルヌーイ写像の上記例では、 p = 0.5 とした場合の初期値x0を絞り込む計算方法を示した。ベルヌーイ写像においては、傾き"p"は0.5以外の変数" 0.0 < p < 1.0 "としても同様に絞り込みの計算を行うことができることは言うまでもない。
【００６２】
上記のように、式（１）の写像を遡る場合の処理を、変数（パラメータ）を傾き pとして数式化する。即ち、式（１）を変形して"xi＝・・・"の式求めると、式（１）によって生成されるビット列を[b0,b1,…,bi,…,bn-1] として、以下の式（２）で表現できる。
【００６３】
【数２】
2019047450.tif 000004
【００６４】
ここで、ビット数は " n " となり、" xn  "の下限と上限は"0 ≦ xn ≦ 1 " から始められるため、最初(i = n - 1である場合)においては、" xn " の右辺は" xn = 1 "とし、左辺は" xn = 0 "として別々に計算を行ってゆき、最終的に" x0 "の下限と上限の区間として算出できる。
【００６５】
図６の１６通りにビット列を４ビット分与え、" xn = 1  "（上限）と" xn = 0  "（下限）として別々に計算し、傾き p を "０ ＜ p ＜ １" の区間で振り、各々の傾き p に対して初期値x0 の下限と上限をプロットすると、図７のようになる。図７は、横軸を傾きp、縦軸を初期値x0 としたものであり、それぞれの傾き p（横軸） に対して各々の初期値x0 の下限と上限の区間（縦軸）を読み取ることが可能なグラフとなっている。
【００６６】
図７においては、それぞれ線分で囲まれた領域を<１><２><３>・・・と示している。この線分は、図６の<１><２><３>・・・に対応するビット列についての各々の傾きパラメータp （０ ＜ p ＜ １）に対応する初期値x0 の組み合わせの境界線と同一の意味を有している。パラメータpと初期値x0の組み合わせによって、この<１><２><３>・・・領域内のいずれかを選択することになる。伸長処理に用いる式（１）により得られたxiについて、xi < p のときビット"０"を生成し、p ≦ xi のときビット"１"を生成させる処理を行うことにより、必ず図６の<１><２><３>・・・に対応するビット列が得られることを意味している。
【００６７】
図６で示した p = 0.5 の場合において、初期値x0 の区間は、図７の p = 0.5 における初期値x0の区間に相当する。ここで、図７の p = 0.25 と p = 0.75とのときの初期値x0における区間に着目する。図７のp = 0.25 と p = 0.75上に、上下の矢印を表記してある。これは、図７の<１><２><３>・・・のビット列を確認すると判るように、 p = 0.25のときには "0"の数が１個（"1"の数は３個）、p = 0.75のときは "0"の数が３個（"1"の数は１個）となっている。つまり、p = 0.25とp = 0.75のときは"0"と"1"の数に偏りがあるポイントの例である。この例示ポイントは、図９にも示すように、以下で説明する算術符号のアルゴリズムで圧縮を行った場合の区間と同等になっている。
【００６８】
ここで、図８に、情報量として６ビットにより構成される伸長コードの全パターン６４通りについて、式（２）における傾き p を "０＜ p ＜１" の区間で振って下限x0 と上限x0 の区間を絞り込んでプロットしたものを示す。各６ビットのパターン応じた領域は６４領域に分かれており、この領域内における傾きpと初期値x0の組み合わせから式（１）の演算を行い、演算結果のxi がxi < pのとき"０"、p ≦ xiのとき"１"を出力させて連続してビット列を取得することで各領域に応じた伸長コードとしてのビットパターンを再現することができる。
【００６９】
＜算術符号のアルゴリズム＞
以下においては、変形ベルヌーイ写像の式或いは変形ベルヌーイ写像を遡る式を、用いた本発明実施形態のアルゴリズムが算術符号のアルゴリズムにより優れていることを明らかにするために、算術符号のアルゴリズムを説明する。算術符号はデータパターンの偏り具合（出現確率の偏り）が大きいものに対して最も効率よく圧縮が行えるアルゴリズムとして知られている。算術符号の圧縮過程を図１０（ａ）に示す。図１０（ａ）の例は、ビット列が"0 0 1 0"（"0"が３個）の場合であり、この場合の圧縮過程を図示しながら説明する。この場合、算術符号のアルゴリズムを適用すると全ビットの数が４個であり、４個中、ビット値"0"の頻度は３のため、区間[0.0,1.0)において、ビット"0"の区間は３／４の[0.0,0.75)の半開区間、ビット"1"の区間は１／４の[0.75,1.0)の半開区間に分けられる。
【００７０】
圧縮処理がスタートとなると、伸長コード中の最初のビット値は"0"であるため、区間を[0.0,0.75)に更新する。伸長コード中の次のビット値は"0"であるため、区間幅の0.75を3/4にした[0.0,0.5625)に更新する。伸長コード中の更に次のビット値は"1"であるため、0.5625を3/4にした0.421875が下限となり、区間を"1"側へ0.421875だけ振った [0.421875,0.5625)に更新する。伸長コード中の最終のビット値は"0"であるため、区間[0.421875,0.5625)を3/4に分けて、ビット"0"側へ寄った区間[0.421875,0.52734375)に最終的に更新する。
【００７１】
上記において得られた区間内において、２進数の小数で最も少ないビット数で表されるものを探索する。すると１０進数の0.5が相当し、２進数で表すと(0.1000…)2になるため小数点以下のビット"１"が圧縮コードとなり、情報量として１ビット(1/4)に圧縮される。以上が算術符号の圧縮の原理である。
【００７２】
伸長処理では、伸長コードのビット値の頻度数（"0"が３個、"1"が１個）は事前に情報として知っている（保持している）必要がある。以下、圧縮コード"1"から伸長コード（元のビット列）である"0 0 1 0"に戻す処理を行う。圧縮コードは"1"であり、２進数では(0.1000…)2であるから１０進数では0.5となる。保持している伸長コードのビット値の頻度から区間を分割して"０"の頻度の区間[0.0,0.75)と１の頻度の区間[0.75,1.0)から圧縮コード0.5は"０"の頻度の区間[0.0,0.75)に含まれることが検出される。このため、最初に伸長コードとしてビットデータとして"0"が出力される。圧縮処理と同様に最初のビット値が"0"のため、区間を[0.0,0.75)に更新する。
【００７３】
次に、区間[0.0,0.75)は、保持しているビット頻度から区間[0.0,0.5625)と[0.5625,0.75)に分割する。ここで、圧縮コード0.5は区間[0.0,0.5625)に含まれるため、２つ目の伸長コードとしてビットデータとして"0"を出力する。３回目も圧縮処理同様に、区間[0.0,0.5625)を保持しているビット頻度から区間[0.0,0.421875)と[0.421875,0.5625)に分割する。ここで、圧縮コード0.5は区間[0.421875,0.5625)に含まれるため、３つ目の伸長コードとしてビットデータ"1"を出力する。
【００７４】
最後の４回目は、上記の区間[0.421875,0.5625)を保持してあるビット頻度から区間[0.421875,0.52734375)と[0.52734375,0.5625)に分割する。ここで、圧縮コード0.5は区間[0.421875,0.52734375)に含まれるため、最後の４つ目の伸長コードとしてビットデータとして"0"を出力し、圧縮前のビット列"0 0 1 0"が得られたことで伸長処理が完了する。
【００７５】
算術符号による圧縮ではデータの頻度の偏りが大きいほど、最後の上限と下限の区間を広く確保できるため圧縮率が大きくなるといった特徴を持っている。図９に算術符号のアルゴリズムを適用したビット列４ビット分で１６通り伸長コードに対して圧縮処理を行ったときの、それぞれの下限と上限の区間を算術符号の欄に示す。
【００７６】
＜実施形態１  変形ベルヌーイ写像を遡る圧縮アルゴリズム＞
図９と図１０に示すように、本実施形態に係る変形ベルヌーイ写像を遡る圧縮処理では、圧縮を行う対象のビット列に対して算術符号と同じ区間において絞り込みを行うことができる。図１０（ｂ）に、変形ベルヌーイ写像を遡る式(2)を実行することで得られる処理手順を示す。算術符号の例と同じビット列"0 0 1 0"（"0"が３個）の場合の圧縮過程を説明する。変形ベルヌーイ写像を遡ることによる圧縮では、算術符号の例とはビット列を逆順である"0 1 0 0"にして順番に処理を行う。つまり、変形ベルヌーイ写像を遡る式を用いる場合には、圧縮処理手段１１０は、伸長コードの最後尾の１単位データから最前の１単位データへ向かって１単位データ毎に圧縮値の範囲を得る演算を行う。本実施形態では、前述した算術符号と同様に、"0"が３個であり、式(2)のパラメータpが p = 0.75(=3/4)である場合について図１０（ｂ）で示す計算過程を以下において説明する。
【００７７】
ベルヌーイ写像の最後の解 " x4 "について考えると、写像xiの値域が閉区間[0,1]であるため、" 0 ≦ x4 ≦ 1 "の区間のいずれかに必ず含まれている。式（１）において" x4 "を生成した式は、伸長コードの最後尾の１単位データがビット"0"であることから、" x4 =  x3 / 0.75 "が実行されたことが推定され、" x3 "の値を求める計算をすると、" 0 ≦ x4 ≦ 1 " から " 0 ≦ x3 / 0.75 ≦ 1 " → " 0 ≦ x3 ≦ 0.75 " となり、この区間から必ず" x3 "が計算されていることが判る。
【００７８】
次に" x3  "について考えると、伸長コードの１単位データがビット"１"であるという情報から、 " x3 = (x2 - 0.75) / (1 - 0.75) "が選択されたことが判る。そこで、上記の式を" 0 ≦ x3 ≦ 0.75 "に代入することで、
" 0 ≦ (x2 - 0.75) / 0.25 ≦ 0.75 "→ " 0 ≦ x2 - 0.75  ≦ 0.1875 "
→ " 0.75 ≦ x2 ≦ 0.9375 " が得られる。このようにして、" x2 "の区間を絞ること  ができる。
【００７９】
次の伸長コードの１単位データがビット" ０"であるから、" x1 "の区間は、
" 0.75 ≦ x2 ≦ 0.9375 " → " 0.75 ≦ x1 / 0.75 ≦ 0.9375 "
→ " 0.5625 ≦ x1 ≦ 0.703125 "となる。
【００８０】
伸長コードの最後の１単位データがビット"０"であるから、
" 0.5625 ≦ x1 ≦ 0.703125 " → " 0.5625 ≦ x0 / 0.75 ≦ 0.703125 " 
→ " 0.421875 ≦ x0 ≦ 0.52734375 "となる。
【００８１】
上記により、圧縮コードに対応する初期値x0 は0.421875から0.52734375の区間内（前述したように正しくは下限を含む半開区間[0.421875,0.52734375）とする)のいずれかの値であることが判る。このようにして得られる区間内の初期値x0 （圧縮コード）から"p = 0.75" としてベルヌーイ写像式（１）を用いた伸長処理を実行し、上記規則にてビット列を生成すると必ず" 0  0  1  0 "となる。
【００８２】
求めた区間は図９（図９の圧縮対象のビット列について変形ベルヌーイ写像を遡る場合は算術符号と逆順に処理するため一番右のビットから１ビットずつ左へと処理する）と、図１０に示すように、前述の算術符号の例と同じ区間になっていることが判る。本実施形態でも、圧縮コードは、この区間内で一番少ないビット列で表すことができる小数点ビット値として求められる。この一番少ないビット列で表せられる小数点ビット値は、(0.1)2となり１０進数では0.5となる。このように、圧縮コード生成手段１２０は、最終的に求められた圧縮値の範囲において最も少ないビット列で表すことが可能な２進数の小数を圧縮コードとする。
【００８３】
＜実施形態１  変形ベルヌーイ写像による伸長アルゴリズム＞
上記において用いた伸長コードにおいて、"0"の頻度は3/4のため、変形ベルヌーイ写像の式（１）において、傾きp = 0.75、初期値 x0 = 0.5 に設定して演算を行い（伸長処理手段２１０）、演算結果が0.75未満のときにビット"０"を出力し、0.75以上のときにビット"１"を出力する規則で反復演算する（伸長コード生成手段２２０）伸長処理が行われる。このような伸長処理を４回行う過程では、以下の通りに、ビット列"0 0 1 0"からなる伸長コードが得られる。
写像xi                出力ビット
x0 = 0.500000         ０
x1 = 0.666667         ０
x2 = 0.888889         １
x3 = 0.555556         ０
上記では、小数点以下６桁目までを表示してある。
【００８４】
＜データパターンが３種類の場合の算術符号による圧縮アルゴリズム＞
上記の実施形態では、伸長コードの１単位データにおいては、ビット値が"0"か"1"の２種類（符号長１）の場合を示したが、算術符号と同様に３種類以上のデータパターンでも圧縮を行うことができる。例として"a", "b", "c"の３種類のデータパターンを用意し、データ列"abaacb"（合計６個）に対しての圧縮処理を説明する。図１１（ａ）に算術符号を用いて圧縮を行った場合の圧縮過程を示し、図１１（ｂ）に本実施形態に係るベルヌーイ写像を遡る式を用いて圧縮を行った場合の圧縮過程を示す。
【００８５】
まず、算術符号を用いて圧縮を行った場合の圧縮過程から説明を行う。ここでは、上限と下限の値は小数点以下第６位まで記載する。伸長コードのデータパターンの頻度として、"a"は３個、"b"は２個、"c"は１個であるという情報を保持している。これに基づき、累積頻度はpa=3/6=0.5、pb=5/6=0.833333に設定される。また、図１１（ａ）に示すように、０から１までの半開区間[0.1)は、"a"の区間として[0,0.5)と、"b"の区間として[0.5, 0.833333)と、 "c"の区間として[0.833333,1)とに分割される。
【００８６】
算術符号では、伸長コードのデータ列の最初の１単位データから順番に圧縮処理を行う。最初の１単位データが"a"であるため、区間[0.1)を[0,0.5)に更新し、[0,0.5)において頻度に応じた再分割を行う。即ち、"a"の区間は[0,0.5 x 0.5)= [0,0.25) 、"b"の区間は[0.5 x 0.5, 0.5 x 0.833333) = [0.25,0.416667)、"c"の区間は[0.5 x 0.833333, 0.5 x 1)= [0.416667,0.5)に分割される。
【００８７】
伸長データ中の２つ目の１単位データは、"b"であり、区間[0,0.5)を[0.25,0.416667)に更新し、頻度に応じた再分割を行う。"a"の区間は[0.25,(0.41667-0.25)x0.5 + 0.25)=[0.25,0.333333)、"b"の区間は[0.333333, (0.41667-0.25)x0.833333 + 0.25) =[0.333333,0.388889)、 "c"の区間は[0.388889, 0.416667)に分割される。
【００８８】
図１１（ａ）に示すように、上記と同様な処理を残りのデータパターン"a", "a", "c", "b"についても行って、再分割を繰り返し、上限と下限の区間を狭めてゆく。最終的に半開区間[0.288194444444..., 0.290509259259...)が得られる。これを小数点以下のビット列（小数点以下12bitまでを表示）で表すと、下限(0.010010011100)2  〜  上限(0.010010100101)2になる。この区間内で一番短いビットで表せられる値は、(0.0100101)2となり１０進数で表すと0.28906250となる。得られる圧縮コードは、" 0100101"になるため圧縮後のビット量は７ビット分になる。
【００８９】
算術符号による伸長処理では、予め辞書領域に"a"が３つ、"b"が２つ、"c"が１つ合計６個あるという情報が保持されている。この情報が、圧縮後ファイルにおける圧縮コード以外のオーバヘッド部になる。上記辞書領域の情報により、累積頻度が" 3/6, (3+2)/6, (3+2+1)/6 "として得られ、最初は半開区間[0,0.5),[0.5,0.833333),[0.833333,1)に分割される。
【００９０】
圧縮コードである(0.01001)2 から求められる１０進数の"0.28906250"は、区間[0,0.5)に含まれるため、最初に１単位データとして"a"を出力する。次に、区間[0,0.5)を頻度に応じて再分割する。この結果、"a"の区間は[0,0.5 x 0.5)= [0,0.25) 、"b"の区間は[0.5 x 0.5, 0.5 x 0.833333) = [0.25,0.416667)、"c"の区間は[0.5 x 0.833333, 0.5 x 1)= [0.416667,0.5)に分割される。
【００９１】
圧縮コードに対応する圧縮値である0.28906250は、"b"の区間に含まれるため、２番目に１単位データとして"b"を出力する。以降、圧縮処理と同様に区間を分割して、いずれの区間に圧縮値が含まれるかを検出して、伸長コードの１単位データを出力する。この処理が繰り返されて、残りのデータパターン"a", "a", "c", "b"が得られ、伸長処理が終了する。
【００９２】
＜実施形態２  データパターンが３種類の場合の変形ベルヌーイ写像を遡る圧縮アルゴリズム＞
図１１（ｂ）を参照して、データパターン３種類の場合の変形ベルヌーイ写像を遡る圧縮アルゴリズムについて説明する。算術符号の例と同じくデータ列"aabcba"の出現頻度から設定された累積頻度paとpbを基に、変形ベルヌーイ写像のマップ図を描いたものが図１２である。累積頻度paは"0.5"であり、累積頻度pbは"0.833333..."である。変形ベルヌーイ写像の式（３）は、以下の３つの式から構成される。
【００９３】
【数３】
2019047450.tif 000005
【００９４】
累積頻度paが"0.5"であり累積頻度pbが"0.833333..."であるから、データパターン"a"が生成される場合は式（３）における一番上の式 xi / pa が選択され、"b"が生成される場合は式（３）における上から二番目の式 (xi - pa)/(pb - pa)、"c"が生成された場合は式（３）における一番下の式 (xi - pb)/(1 - pb)、が選択されることが判る。
【００９５】
図１１（ｂ）に示す変形ベルヌーイ写像を遡る圧縮アルゴリズムを説明する伸長コードの最後尾の１単位データから順番に圧縮処理を進めるために、データ順は（上記算術符号の例との逆）"bcaaba"となる。累積頻度はpa = 0.5(=3/6)、pb = 0.833333(=5/6)とする。ここでは、小数点以下６桁までの表記である。
【００９６】
圧縮処理対象の最初の１単位データは、データパターン" b "であるから、式（３）の上から二番目の式が選択されたことが判り、" 0 ≦ x4 ≦ 1 " から
" 0 ≦ (x3 - 0.5)/(0.833333 - 0.5) ≦ 1 " → " 0 ≦ x3 - 0.5 ≦ 0.333333 " 
→ " 0.5 ≦ x3 ≦ 0.833333 "となる。
【００９７】
圧縮処理対象の第２番目の１単位データは、データパターン"c"であるから、式(3)の上から三番目を選択されたことが判り、" 0.5 ≦ x3 ≦ 0.833333 "
→ " 0.5 ≦ (x3 - 0.833333)/(1 - 0.833333) ≦ 0.833333 "
→ " 0.0833333 ≦ x2 - 0.833333 ≦ 0.138889 "
→ " 0.916667 ≦ x2 ≦ 0.972222 "が得られる。
【００９８】
以上と同様の処理を、図１１（ｂ）に示すように残りのデータパターン"a", "a", "b", "a"に対して同様に繰り返すことで、最終的に算術符号の例で示した区間と同じ半開区間[0.288194444444..., 0.290509259259...)が得られる。これを小数点以下のビット列で表す（小数点以下12bitまでを表示）と下限(0.010010011100)2  〜  上限(0.010010100101)2となるため、この区間において一番短いビットで表せられる値を検索して、その値が(0.0100101)2として求められる。この値(0.0100101)2を１０進数で表すと0.28906250となる。このように、得られた圧縮コードは" 0100101"になるため圧縮後のビット量は７ビット分になる。
【００９９】
以上のような圧縮処理を式（３）の変形ベルヌーイ写像を遡る処理として考え、傾き"pa"と"pb" を変数（パラメータ）として数式化すると、データパターンが"a", "b", "c"の３種類である場合のベルヌーイ写像を遡る式は以下の式（４）になる。
【０１００】
【数４】
2019047450.tif 000006
【０１０１】
式（４）は３つの式から構成され、データパターンとして式（４）の右側括弧に示した "Wi" として、"a" or "b" or "c"が出現した場合に応じてその左に記載の式を選択して圧縮処理を行う。ここで、始めに、下限をxn = 0、上限をxn = 1 に設定して、下限と上限の区間を絞り込む演算を行う。式（４）の傾きpaと傾きpbには、累積頻度としてpa = 3/6 = 0.5、pb = 5/6 =0.833333…を設定する。このように圧縮処理手段１１０による圧縮処理は、式（４）の演算となるから、算術符号のように圧縮演算の過程において下限と上限の区間を再分割しながら下限と上限の区間を絞り込むといった演算を必要としないものである。
【０１０２】
上記例で示したデータの順番"bcaaba"にて式（４）による反復計算を行うと図１１（ｂ）の圧縮過程に示すように、下限のxiと上限のxiが遷移される。最終的な下限と上限によって示す区間としては、半開区間[0.288194444444…, 0.290509259259…)が得られる。
【０１０３】
図１１（ａ）と図１１（ｂ）から判るように、算術符号と本発明の実施形態による手法とを比べると圧縮過程の途中で絞り込まれる下限と上限の区間は異なるが、最終的に絞り込まれる下限x0と上限x0の値は同一のものとなっている。
【０１０４】
次に、変形ベルヌーイ写像による伸長処理を説明する。伸長処理は式（３）により行われる。累積頻度としてpa = 3/6 = 0.5、pb = 5/6 = 0.833333…を設定する。また、初期値x0 については圧縮コードが(0.01001)2であるから、１０進数で表した初期値x0 = 0.28906250を設定する。
【０１０５】
本実施形態の伸長処理では、式（３）による演算を行う（伸長処理手段２１０）。演算結果の値 xi が半開区間[0,0.5) に入っている場合には１単位データのデータパターン"a"を出力し、演算結果の値 xi が[0.5,0.833333…)に入っている場合には１単位データのデータパターン"b"を出力し、演算結果の値 xi が[0.833333…,1) に入っている場合にはデータパターン"c"を出力する（伸長コード生成手段２２０）。このような処理６回分の反復写像を行うことで連続して出力する。本実施形態によれば図１３に示したようにxiが変遷され、対応するデータパターンを出力し伸長後のデータ列"abaacb"（合計６個）が得られる。
【０１０６】
本実施形態と算術符号とを比較すると、算術符号ではデータパターンに応じて区間を１単位データの処理毎に再分割する必要があるが、本発明の実施形態では頻度に応じた区間を１単位データの処理毎に再分割することはない。しかも、圧縮処理では下限 xn = 0 と上限 xn = 1 を初期設定して式（４）からデータパターンに応じた式を選択して一意的に実行すれば良いため、分割する計算が不要であり高速化できるといった効果がある。
【０１０７】
以上の例では式（４）による下限と上限を並行して計算することを示した。しかしながら、式（４)からは、最終的に得られる下限と上限の差分は、式（４）の傾き成分"pa", "pb-pa", "1-pc"（データパターン毎の頻度）の使用回数による累乗を乗算したものとして得られ、これが"0"と"1.0"の間に対する割合となることが、読み取れる。
【０１０８】
上記の例ではpa が３回、pb-pa が２回、1-pb が１回用いられている。このため、
pa3 x (pb-pa)2 x (1-pb) = (3/6)3 x (2/6)2 x (1/6) = 0.002314814815
となり、この値は、上記の下限x0 = 0.288194444444と上限x0 = 0.290509259259の差分になっていることが判る。
【０１０９】
このことから圧縮過程では下限と上限の双方を計算することなく、下限のみを計算して行き、最後に上記の差分を下限に足し算することで上限が得られるといったアルゴリズムを採用することが考えられる。この手法を採用すると、絶えず下限と上限を並行して算出する手間を省き高速な処理が可能である。このため、計算過程では下限（または上限）のみを一意に導出すればよくなり、算術符号と比べても下限と上限の区間を再分割し更新するといった手間が小さくなるといったメリットがある。このように、圧縮処理手段１１０は、上限値を求める演算と下限値を求める演算を、別個に行う構成を採用しても良い。
【０１１０】
即ち、圧縮コード生成手段１２０は、上限値と下限値との差分値と、上限値または下限値のみを求め、上限値のみを求めた場合には最終的に求めた上限値から上記差分値を引いて最終的な下限値を求め、下限値のみを求めた場合には最終的に求めた下限値に上記差分値を加えて最終的な上限値を求める。
【０１１１】
図７はデータパターンが２種類（"1" or "0"）であり、情報量が４ビットの場合であり、傾きpを "0 < p < 1" に振った傾きpに対する初期値x0の下限と上限の区間を式（２）により導出した２次元のグラフになっている。これに対し、データパターンが３種類で、ここでは上記例の１単位データが６単位からなるデータ列"abaacb"の場合において、初期値x0 の集合を図示してみる。ここで、式（４）おいて、傾きpaと傾きpbを 0.0 < pa < pb < 1.0（常にpa < pb）に振った場合においては、初期値x0の区間を導出して初期値x0 の集合を表示すると、図１４（ａ）に示す如くなる。図１４（ａ）は、X軸が傾きpaであり、Y軸が傾きpbであり、Z軸がx0であるようにして、３次元で表現したものである。この図１４（ａ）を、Z軸の上から見ると三角形の薄く平坦で湾曲したZ軸方向に僅かに初期値x0 の区間分の厚みがある３次元の集合となっている。
【０１１２】
図１４（ａ）においては、点の集合として示している。上記の例において圧縮処理を行った(pa,pb,x0)座標は( 0.5, 0.833333…, [0.288194444444, 0.290509259259) )である。x0 は式（４）より求められた半開区間[)となる薄い厚みの部分である。これ以外の集合座標の(pa,pb,x0)の組み合わせが各pa, pbに応じたx0の区間内にあれば、対応するパラメータを式（３）のpa,pb,x0に設定して、反復演算を行うことにより伸長コードのデータ列"abaacb"が生成できることを意味する。
【０１１３】
また、図１４（ｂ）に図１４（ａ）とは別の集合の例を示す。図１４（ｂ）例は、データ列"caabac"の場合であり、図１４（ａ）の例と同様に式（４）による初期値x0の区間を導出したものを示している。データの累積頻度からpa = 3/6 = 0.5、pb = 4/6 = 0.666666…になり、このパラメータによる初期値の座標(pa,pb,x0)は、(0.5, 0.666666…, [0.712962962963, 0.715277777778))となる。上記図１４（ａ）でも説明したが、これ以外の集合座標の(pa,pb,x0)の組み合わせが各pa, pbに応じた図１４（ｂ）のx0の区間内にあれば、パラメータpa,pbとx0を式（３）に設定しデータ列を生成（伸長処理）した場合、データ列" caabac"が得られるものである。
【０１１４】
以上では、データパターンが３種類までの場合の傾きパラメータに応じた初期値x0 の集合を視覚的に図７や図１４に示した。データパターンが４種類以上の場合では直行系のデカルト座標では（軸が含まれてしまうため３次元までの表示となり）初期値x0 の集合を図で表すことができなくなる。しかし、１単位データであるデータパターンがＮ種類とした場合にも、傾きパラメータ群と初期値x0 はＮ次元の集合の座標として表すことができることは言うまでもない。
【０１１５】
１単位データであるデータパターンがＮ種類の場合の変形ベルヌーイ写像の式は、Ｎ個の式の集合となることが式（１）と式（３）により明らかであろう。Ｎ個の式は、式（３）のように、Ｎ段に記載することができ、第１の１単位データ、第２の１単位データ、第３の１単位データ、・・・、第Ｎの１単位データの頻度を、Ｋ１、Ｋ２、Ｋ３、・・・、ＫＮとする。これにより、上記Ｎ個の式においては、第１の１単位データに対応する式は、
（ｘi／Ｋ１）と記載することができ、
第２の１単位データに対応する式は、
（ｘi−Ｋ１）／（Ｋ２−Ｋ１）と記載することができ、
第３の１単位データに対応する式は、
（ｘi−Ｋ２）／（Ｋ３−Ｋ２）と記載することができ、
・・・・
第Ｎの１単位データに対応する式は、
（ｘi−Ｋ（Ｎ−１））／（１−Ｋ（Ｎ−１））と記載することができる。このように、変形ベルヌーイ写像を遡る式は、伸長コードを構成する１単位データの種類に対応して分かれている。
【０１１６】
上記の変形ベルヌーイ写像の式は、伸長処理に用いられる。上記変形ベルヌーイ写像の式において、ｘiついて解いてｘi+1の関数として表すと、変形ベルヌーイ写像を遡る式となる。この、変形ベルヌーイ写像を遡る式においても、伸長コードを構成する１単位データの種類に対応して分かれている。
【０１１７】
＜実施形態３  整数演算化アルゴリズム＞
演算精度について考察すると、ベルヌーイ写像を遡る式による圧縮処理とベルヌーイ写像の式による伸長処理は、算術符号と同様な問題を有している。即ち、一般的なパーソナルコンピュータによるディジタル演算では、演算精度が固定値のため、丸め誤差が生じ、有効桁を超えた場合に誤差が生じ正しく演算ができなくなる。このため整数演算化（正規化演算）することで、ビット値による圧縮・伸長処理の演算が行える構成を採用したものが本実施形態である。
【０１１８】
本実施形態は、１単位データのデータパターンが３種類である場合には、式（３）を用いた伸長処理と式（４）を用いた圧縮処理が行われることに鑑み、式（３）を整数演算化したものが式（５）であり、式（４）を整数演算化したものが式（６）である。即ち、本実施形態では、式（５）を用いた伸長処理と式（６）を用いた圧縮処理を実行する。
【０１１９】
【数５】
2019047450.tif 000007
【０１２０】
【数６】
2019047450.tif 000008
【０１２１】
本実施形態では、１単位データが"a", "b", "c"の３種類からなるデータ列"abaabac"を用意し圧縮処理を行う。図１５に圧縮処理のフローチャートを示し、これに従って圧縮処理の動作説明を行う。圧縮処理では３種類のデータパターンを処理する式（６）を用いる。このフローチャートに対応するプログラムをコンピュータが実行して圧縮処理装置が実現される。最初に圧縮対象とするデータ列である伸長コード（圧縮前コード）を読み込み（Ｓ１１）、データパターンの頻度から各パラメータを設定するため、圧縮対象とするデータ列からデータパターンの頻度をカウントする（Ｓ１２）。
【０１２２】
次に、初期パラメータのセットを行う（Ｓ１３）。このステップＳ１３では、読み込んだデータ列"abaabac"の総数は７個であるため、"n = 7"（逆写像回数）となるので、式（６）のMに、 “M = 7"に設定する。データ列"abaabac"の内、データパターン"a"は４個であるため、"A = 4"、またPAには最初はAと同じく "PA = 4"を累積頻度として設定する。更に、データパターン"b"は２個であるため、データパターン"a"の個数に加えることで累積頻度は 4 + 2 = 6となり、"B = 6"となる。また、PBには最初はBと同じく "PB = 6"を累積頻度として設定する。以上で式（６）の初期パラメータ設定の処理（ステップＳ１３）が終了する。
【０１２３】
次に、ベルヌーイ写像を遡る式（６）では、伸長コードであるデータ列"abaabac"の最後尾の１単位データから順に処理を行うため、データパターン"c"を最初に読み出して式（６）による実施を行って行く（Ｓ１４）。最初に処理するデータパターンは、"c"であるため、式（６）の一番下の式が選択され。次に区間の絞り込みの計算を行うために、初めのXn (=X7)について下限ｎにはX7 = 0、上限には最大の演算幅となるMの値であるX7 = 7を設定する。本実施形態の例では図１６に示すように、最初の区間は、[0,PA),[PA,PB),[PB,M) = [0,4),[4,6),[6,7)となっている。
【０１２４】
ここで式（６）の一番下の式に着目し、傾き係数となる"(M-B)/M"については、常に固定値"(M-B)/M"="1/7"であり、一連の処理が終わるまで変わらない勾配係数であるため保持することが好適である。式（６）の他の式における傾き係数も、同様に常に"A/M"="4/7"、 "(B-A)/M"="2/7"となるため、保持することが好適である。
【０１２５】
次に、Xi+1と傾き係数の掛け算"((M-B)/M) Xi+1 " を実行後は、Mで割り切れない解になる場合があるため、計算する前に予め演算精度幅を拡大しておくことで必ず割り切れるように演算を行う（Ｓ１５）。即ち、演算を整数演算化して行う場合には、圧縮値及び圧縮値の範囲を、伸長コードを構成する１単位データの数（Ｍ）倍する。
【０１２６】
このため、区間（圧縮値の範囲）とXiをM倍に拡大し、区間は[0,PA),[PA,PB),[PB,MX) = [0,28),[28,42),[42,49)に更新（ここでMXは、拡大計算によって更新される演算精度幅の上限とする）し、XiもM倍することで必ず解が割り切れるように更新を行う。このように、式（６）を計算する前に、この拡大処理を経た後演算を行う。このため、データパターンを判定する閾値PAとPBについては、初期値はAとBと同じ値であるが、演算の都度拡大更新される変数となっている。
【０１２７】
データパターン"c"の処理では、PA ,PB ,Xi をM=7倍後に、変形式ベルヌーイ写像を遡る式（６）を用いた整数演算処理を行う（Ｓ１６）。ここでは、データパターン"c"の処理であるから式（６）の"((M-B)/M)Xi+1 + PB"を実行する。前述の通り、伸長コードであるデータ列"abaabac"のデータ個数は n = 7のため下限はX7 = 0、上限はX7 = 49を代入する。この結果、下限としては"X6 = (1/7)0 + 42 = 42 "が得られ、上限としては "X6 = (1/7)49 + 42 = 49 "が得られる。
【０１２８】
次にステップＳ１７において、ＮＯへ分岐し、伸長コードの次の１単位データに対する処理であるステップＳ１４へ戻って更にステップＳ１５とステップＳ１６の処理を続ける。次に処理するデータパターンは"a"であるため、式（６）の"(A/M)Xi+1 "が選択される。計算の前に拡大計算として、M=7倍を行い、区間を[0,PA),[PA,PB),[PB,MX) = [0,196),[196,246),[246,343)に更新し、先に求めた下限及び上限は同じく７倍に更新して、X6 = 294 、X6 = 343とした後、"(A/M)X6 "を計算し、下限は"X6 = (4/7)294 = 168 "となり、上限は"X6 = (4/7)343 = 196 "が得られる。
【０１２９】
次にステップＳ１７において、ＮＯへ分岐し、伸長コードの次の第３番目の１単位データに対する処理であるステップＳ１４へ戻って更にステップＳ１５とステップＳ１６の処理を続ける。３回目に処理するデータパターンは "b"のため、式（６）中の"((B-A)/M)Xi+1 + PA"が選択される。計算の前に拡大計算であるM=7倍を行い、区間を[0,PA),[PA,PB),[PB,MX) = [0,1372),[1372,2058),[2058,2401)に更新する。この結果、先に求めた下限及び上限はそれぞれ、X6 = 1176、X6 = 1372へ７倍とする更新を行った後、" ((B-A)/M)X6 + PA "を計算する。これにより、下限は"X6 = (2/7)1176 + 1372 = 1708 "とされ、上限は"X6 = (2/7)1372 + 1372 = 1764 "が得られる。以降残りのデータパターン "aaba" についても同様にステップＳ１４からステップＳ１６の処理を行う。この処理によって下限Xi、上限Xi、PA、PB、MXが図１６に示されるように遷移されて一連の処理が行われる。
【０１３０】
最終的にステップＳ１７においてＹＥＳへ分岐し、ステップＳ１８へ進む。図１６に示す通り、最終的に下限X0 = 2101008、上限X0 = 2108176が得られる。この場合、下限と上限の実数が0.0〜1.0の範囲におけるどの区間になるかについては、求めた下限X0と上限X0 に対して、拡大してきた演算精度幅MX = 5764801(=78)による割算を行うことで求めることができる。ここで求められた下限X0と上限X0、演算精度幅MXを２進数のビット値で表すと、次のようである。
【０１３１】
下限X0  →          "1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0"
上限X0  →           "1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 0"
演算精度幅MX→ "1 0 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 0 0 0 0 0 1"
【０１３２】
上記の下限X0と上限X0、演算精度幅MXを用いて、"X0 / MX" の計算を行って１０進数の小数点以下６桁まで求めると
下限X0 = 0.364455
上限X0 = 0.365698
となり、これを２進数ビット値として小数点以下２２桁まで示すと以下の通りである。
【０１３３】
下限X0 = "0. 0 1 0 1 1 1 0 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1" 
上限X0 = "0. 0 1 0 1 1 1 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0 0"
【０１３４】
上記のように求められた下限X0と上限X0の間で、圧縮コードとなる最小のビット量で表せられる値は、"0. 0 1 0 1 1 1 0 1 1" である。圧縮コードとして小数点以下の９ビットを取得する。この値を１０進数で表すと、"0.365234375"となる。
【０１３５】
本実施形態に係るアルゴリズム上において、バイナリで圧縮コードを求めるための"X0 / MX" のビット演算手法を図１７に示す。
【０１３６】
図１７の演算手法では、下限X0と上限X0をMXで割る割算をビット値同士で行う。計算開始直後では下限と上限のビット値は上位桁から同じビット値が出力されて行く。この２つの出力について、同じ桁でビット値を比較して行き、異なる値を検出し、上限X0に演算の余りがあればそこで計算を打ち切る。上記の異なる値の前の桁までの数値を圧縮コードとするというアルゴリズムである。この割算を行う装置は、ビット同士の大小比較器と引き算器から構成することができる。
【０１３７】
ただし、上限X0が割り切れる場合には、区間の上限は含まないため下限の演算を続けて行くことになる。例えば、上限が割り切れた場合には、上限側の"0. 0 1 0 1 1 1 0 1 1"以降は0が永久に続くことがわかるため、下限側の割算の実行を続け、"0. 0 1 0 1 1 1 0 1 0 1 1 1 1 0"の下線部のように"1"が続いても、"0"が生じたところで計算を打ち切り、圧縮コードを"0. 0 1 0 1 1 1 0 1 0 1 1 1 1 1"とすることで下限と上限との間に入る値を必ず得るようにする工夫が必要である。
【０１３８】
前述の小数演算により圧縮処理を行う実施形態に関する説明において、下限のみの計算を実行し、最後に、各傾き係数の使用回数による累乗を掛算して区間[0,1)の割合を求め、これを差分として上記下限に足し算することで上限の値を算出することが可能である旨を述べた。上記に鑑み、整数演算化した式（６）の例では、各傾き係数の使用回数による累乗の乗算である、"(4/7)4 (2/7)2 (1/7) "から差分を得ることができる。初期設定したM=7に対して７を掛け算した回数は、反復演算の回数と同じ７回である。従って、分母になっている最終的なMXは、MX = 7 x 77 (=78=5764801)となり、分子については初期設定の最大演算精度幅が M = ７であったことを考慮し計算すると、7 x 44 x 22 x 1 = 7168となり、これを下限X0 = 2101008に足し算すると"2108176"になり、上限X0 = 2108176を得ることができる。
【０１３９】
圧縮した圧縮コードのファイル内容の一例を図１８に示す。最初の行には、求めた圧縮コード"0 1 0 1 1 1 0 1 1"がセットされるのであるが、ここでは、圧縮コードを伸長処理のため初期値X0として、整数値の１０進数である１８７により表わしてある。ファイルの２行目からは辞書領域（オーバーヘッド）となり、各データパターンの個数の後、アンダースコア後にデータパターンを記述してある。ここで圧縮コードはバイナリにすると情報量は９ビット、各個数は上から４、２、１となるためこれをバイナリ（４は(11)2、２は(1)2、１は(0)2 を割り当てる）にすると情報量として２ビット、１ビット、１ビットのため合計４ビットとなり、"a", "b", "c"はアスキーコードとした場合それぞれ8ビットのため合計８ｘ３＝２４ビット、これらから伸長に最低限必要な情報量は９＋４＋２４＝３７ビットとなる。
【０１４０】
このため圧縮前の情報量は、元のデータがアスキーコードとすると、一文字あたり８ビットのため８ｘ７＝５６ビットとなり、これに対し、圧縮後の情報量が３７ビット（圧縮率約６６％）となる。
【０１４１】
次に、本発明の実施形態に係る伸長処理装置を説明する。伸長演算は、整数演算化した変形ベルヌーイ写像の式（５）を用いて行う。図１９に、伸長処理のフローチャートを示す。このフローチャートに対応するプログラムをコンピュータが実行して伸長処理装置が実現される。
【０１４２】
図１９のフローチャートに示す処理がスタートとなり、最初に圧縮コードのファイルを読み出し（Ｓ２１）、辞書領域の各データパターンとその個数を読み出す等のステップＳ２２の処理が行われる。このステップＳ２２では、式（５）のAにデータパターン"a"の累積頻度A = 4を、Bにデータパターン"a"と"b"の頻度(4と2)を足した累積頻度B = 6を設定し、データパターン"c"は頻度１のため、"a", "b", "c" (4と2と1)の累積頻度に上限M = 7が設定される。
【０１４３】
また、ステップＳ２２において、写像の回数もｎ＝７に設定される。ただし、実際の写像回数は最初に写像演算を行う前に閾値から伸長処理のデータを出力するため、この場合６回分の写像を行えば７個分の伸長データが出力できることから伸長の演算回数は "n - 1" で終了できる。
【０１４４】
ステップＳ２２においては次の処理も行われる。初期値X0に対応する圧縮コード"0 1 0 1 1 1 0 1 1"を読み込む。圧縮コードを小数で表すと"(0.010111011)2"となり、実数の最大区間幅"1.0"(１０進数)に対応するビットコードは"(1.000000000)2"（２進数）になるが、圧縮コード"0 1 0 1 1 1 0 1 1"を整数とした場合１０進数では１８７になり、この実数の最大区間幅"1.0"に対応するビットコード"(1000000000)2"は１０進数の整数では５１２となる。
【０１４５】
次に、変形ベルヌーイ写像の式を構成する初期パラメータをセットする（Ｓ２３、Ｓ２４）。具体的には、図２０に示すように、式（５）のPAとPBの設定等がなされる。更に、圧縮コードX0 と、累積頻度による分割される区間"0,A,B,M"との割合が合うように拡大を行う（Ｓ２４）。累積頻度の区間の大きさ1を512倍することでPA = 512 x 4 = 2048, PB = 512 x 6 = 3072に設定し、初期値X0 は187 x 7 = 1309とする。式(6)の傾き係数"M/A"と"M/(B-A)"は演算精度の拡大に関わらず勾配係数は変化しないため、そのままの値" M/A = 7/4", "M/(B-A) = 7/2"を設定する。
【０１４６】
式（５）の反復写像を実行する（Ｓ２５〜Ｓ２７）、ここでは、圧縮処理で行った処理と同様に拡大を行いながら反復演算を実行する。閾値によりXiがXi ＜ PAに該当する場合には、１単位データ"a"を出力し、PA ≦ Xi ＜ PBでは１単位データ"b"を出力し 、PB ≦ Xiでは１単位データ"c"を出力する（Ｓ２５）。
【０１４７】
計算過程を図２１に示す。即ち、最初ステップＳ２５において、初期値X0 = 157 x 7 = 1309はX0 < PA(=2048)であるため、１単位データ"a"を出力し、ステップＳ２７では式（５）の(M/A) X0を実行する。このステップＳ２７を実行する前にステップＳ２６にて "A" の割り算による演算結果に余りが出ないよう、図２１のようにPAとPB、X0 について演算幅をA(=4)倍に拡大(PA=8192,PB=12288,X0=5236)した後に(M/A) X0を実行する。これによって、図２１に示すようにX1 = 9163となり、ステップＳ２８を介し再びステップＳ２５に戻ってPA ≦ X1 ＜ PB となるため１単位データ"b"を出力する。
【０１４８】
以降は、ステップＳ２８においてＮＯへ分岐するとステップＳ２５〜Ｓ２７が繰り返される。即ち、上記と同様に図２１に示すように分母のA,B-A,M-Bに応じて割り算の余りが出ないようPA, PB, Xiを拡大しながら式（５）の反復演算を実行し、Xiと閾値PAとPBの大小に対応する１単位データであるデータパターンを出力し、合計 "n - 1" 回の写像演算を行えば圧縮前のデータである伸長コードを復元させることができる。
【０１４９】
＜実施形態４  圧縮率の検証＞
本発明の実施形態に係る圧縮処理装置と伸長処理装置は、前述で整数演算化した式（５）と式（６）を用いて図１５と図１９で示した圧縮と伸長の処理フローチャートに示すような処理を行うものである。本実施形態による圧縮率の効果を確かめるため、少し大きなデータ量のファイルを３つ用意し、本アルゴリズムが得意とする同じデータパターンの偏りが多いデータ列を用意して検証を行った。
【０１５０】
ここでは、図２２に示すように５種類のデータパターンを用意した。図２２の<１>により示すデータパターンを６４個、<２>により示すデータパターンを３２個、<３>により示すデータパターンを１６個、<４>により示すデータパターンを８個、<５>により示すデータパターンを８個用意した。上記<１>〜<５>の合計１２８個を第１のランダムに並べ変えた第１のファイルαと、上記<１>〜<５>の合計１２８個を第２のランダムに並べ変えた第２のファイルβと、上記<１>〜<５>の合計１２８個を第３のランダムに並べ変えた第３のファイルγとを用意した。第１のファイルαと第２のファイルβと第３のファイルγとは、それぞれが合計１２８行分の上記<１>〜<５>のデータパターンを有する。図２３は、第１のファイルαの内容における最初の１０行分を示したものである。
【０１５１】
データ容量については、１文字はアスキーコード１byte（8bit）であるため、最後の改行コード"\"を１byte分として含めて各データパターンのバイト容量は、
"Hello World!!\"       →      １４byte
"This is Test.\"       →      １４byte
"Belnui Mapping\"      →      １５byte
"Compression\" →      １２byte
"as an example.\"      →      １５byte
である。従って、ファイルの容量は、14 x 64 + 14 x 32 + 15 x 16 + (12+15) x 8 = 1800 byte となる。
【０１５２】
上記のように作成されたファイルに対しては、図１５に示したフローチャートに基づく圧縮処理を行った。データパターンの種類は５つであるため、圧縮時に用いた式は整数演算化した変形ベルヌーイ写像を遡る５つの式からなる以下に示す式（８）を用い、伸長時には５つの式からなる以下に示す変形ベルヌーイ写像の式（７）を用いた。
【０１５３】
【数７】
2019047450.tif 000009
【０１５４】
【数８】
2019047450.tif 000010
【０１５５】
圧縮した結果を図２４に示す。図２４では各データパターンの並びを
Hello World!!\         →      a
This is Test.\         →      b
Belnui Mapping\               →       c
Compression\           →      d
as an example.\               →       e
と置き換えて、128個分のデータの並びが３種類（α、β、γ）となっている。
【０１５６】
図２４の第１のファイルαをピックアップし、式（８）を用いた圧縮処理を説明する。式（８）の初期パラメータについては、頻度の合計M=128、各データパターンの累積頻度A=64, B=96, C=112, D=120を設定する。また、拡大計算を行うパラメータの初期値も同様に累積頻度PA=64, PB=96, PC=112, PD=120に設定できるが、ここで区間の比を考えると (0:64:96:112:120:128)の比は(0:8:12:14:15:16)と同等の比であるため、初期パラメータはA=PA=8、B=PB=12、C=PC=14、D=PD=15、M=16として式（８）に設定を行う。
【０１５７】
また、式（８）の傾き係数に着目すると、A/M=8/16, (B-A)/M=4/16, (C-B)/M=2/16, (D-B)/M=1/16, (M-D)/M=1/16 となるため、約分すると、A/M=1/2, (B-A)/M=1/4, (C-B)/M=1/8, (D-B)/M=1/16, (M-D)/M=1/16 となるので、この約分結果を設定し、演算精度幅を節約した。本発明に係る圧縮処理装置の実施形態では、変形ベルヌーイ写像を遡る式の係数を、約分する。これにより演算の高速化を図っている。
【０１５８】
このため、図２５の最右列の欄に数値を記載して示すように、係数による割り算の余りが出ないようにするための拡大演算について、Aのときは２、Bのときは４、Cのときは８、Dのときは１６、Eのときは１６の倍数を指定して拡大する。前述していることではあるが、この拡大処理を行った後に式（８）の演算を実行する。
【０１５９】
Xn(=X128)の最初の下限値として、 X128 = 0 を設定して図１５のフローチャートを用いて演算を行う。最初のi=128からi=125までの４回分と、最後のi=2,i=1,i=0の３回分の演算結果を図２５に示す。
【０１６０】
式(8)を反復演算し、得られた下限値となる初期値X0は、
下限X0 = 23733347491256793664341091291605177003932093283721057794934496021699944736
の７４桁の整数値となる。これを２進数で表すと初期値X0は、以下の合計244[bit]のビット列になる。
1101011011101011111011001000111011111101011111010111101101100111010011000100110000010010010001011010100010100010000111010001001110110001011011111100011110110101100001001100011110001011001010001111100001000011101000100000001110001110000100100000
【０１６１】
他方、上限値となる初期値X0は、前述のように各傾き係数の使用回数による累乗を掛け算した" (1/2)64 (1/4)32 (1/8)16 (1/16)8 (1/16)8 "の値を差分として、上記下限値X0に足し算して得られる。ここでは、最初の最大演算精度幅が M = 16であること考慮し、傾き係数の分子を演算回数分掛け算すると
16 x 164 x 132 x 116 x 18 x 18 = 16となる。
これを先ほどの下限値に足し算すると１０進数は、
上限X0 = 2373334749125679366434109129160517700393209328372105779493449602169994475  2
が得られる。
【０１６２】
前記上限X0を２進数で表すと下限ビットに(10000)2 を足した合計244[bit]のビット列
1101011011101011111011001000111011111101011111010111101101100111010011000100110000010010010001011010100010100010000111010001001110110001011011111100011110110101100001001100011110001011001010001111100001000011101000100000001110001110000100110000
が得られる。
【０１６３】
最終的(i=0)に得られる最大演算精度幅をMXは、各傾き係数の分母の値の使用回数による累乗を掛け算して導出する。
ここでも、最初の最大演算精度幅が M = 16であることを考慮して、
MX = 16 x 264 x 432 x 816 x 168 x 168 = 24 x 264 x 264 x 248 x 232 x 232
= 24+64+64+48+32+32 = 2244
となる。
【０１６４】
下限X0と上限X0の区間について実数"0.0 〜 1.0"の区間への対応を考えると、前述したように下限X0と上限X0を最大区間で割り算することで得られる。最大演算精度幅は 2244 の２の乗数のため、上記の下限X0と上限X0の２進数ビット値を２４４ビット分右シフトした値になる。そして、上記ビット列の情報量は、244[bit]のため上記のビット列の頭に"0."をつけた値となる。
【０１６５】
圧縮コードは、下限X0と上限X0の中から一番短いビットを選ぶことになる。ここに、下限側は区間に含んでもよいため、下限X0の値をそのまま圧縮コードに割り当てることができる。ここで下限X0の下位５ビット分が全て"０"であるため、下位５ビットを取り除いた以下の数値となる。
11010110111010111110110010001110111111010111110101111011011001110100110001001100000100100100010110101000101000100001110100010011101100010110111111000111101101011000010011000111100010110010100011111000010000111010001000000011100011100001001
【０１６６】
上記の合計239[bit]分の数値が、図２４の第１のファイルαの行方向欄における圧縮コードの列に示す圧縮コードである。このビットを１０進数整数値で表すと、図２４の第１のファイルαの横方向欄における「圧縮後初期値X0（10進数）」の列に示すように、初期値
X0 = 741667109101774802010659102862661781372877915116283056091703000678123273
となる。
【０１６７】
圧縮後の圧縮データファイルに含まれるデータ内容の一例を図２６に示す。図１８に示したファィル内容と同じく、最初の行には初期値X0に相当する圧縮コード（図２６では１０進数）が記述され、２行目からは辞書領域（オーバーヘッド）となっており、各データパターンに関する情報が記述されている。本実施形態では、データパターンの種類が5種類であるから５行に亘って記述されている。各行には、そのデータパターンの存在個数に続いて、アンダースコア後にデータパターンの文字列が記述されている。図２４に示すように、圧縮コードはバイナリにすると情報量は２３９ビットである。
【０１６８】
辞書領域（オーバーヘッド）分の容量は、各存在個数情報が上から６４、３２、１６、８、８と表記されるため、これをバイナリにすると、６４は(111111)2、３２は(11111)2、１６は(1111)2 、８は(111)2となる。これらの情報量としては、６ビット、５ビット、４ビット、３ビット、３ビットの合計２１ビットとなる。各データパターンの情報量は、前述した各データパターンのバイト数を足すと、７０バイト、ビット数では560ビットになり、合計21 + 560 = 581ビットとなる。これに圧縮コード239ビットを足し合わせることで伸長に最低限必要な情報量は５８１＋２３９＝８２０ビットとなる。バイト数で表すと切り上げて１０３バイトとなる。このため圧縮前の情報量は元のデータは１８００バイトであり、圧縮後の情報量が１０３バイトであるから圧縮率は約５．７％である。
【０１６９】
図２４の最も右側の列に参考として、オペレーティングシステムLinux(登録商標)でコマンドユーザインターフェース(CUI)として提供されている圧縮ツール " gzip "(Lempel-Zivとハフマン符号からなるアルゴリズム)と"bzip2"により同じファイルを圧縮した結果を示す。本実施形態に係る変形ベルヌーイ写像による圧縮については、辞書領域や圧縮コードの格納方法などプロトコルを決めることで実際は伸長に必要なデータを最小限で見積もったものより大きくなるが、圧縮後のデータ量は" gzip "の約半分になっている。
【０１７０】
次に、図１９に示したフローチャートによる手順によって、式（７）を用いて伸長処理を行うと、次のようになる。初期パラメータ設定は、図２６に示されている圧縮のイメージの辞書領域のデータを用いて、累積頻度A=64, B=96, C=112, D=120, M=128として設定することができる。また、傾き係数パラメータ M/A, M/(B-A), M/(C-B), M/(D-C), M/(M-D) は、128/64, 128/32, 128/16, 128/8, 128/8、であるが、約分することで、
( M/A, M/(B-A), M/(C-B), M/(D-C), M/(M-D) ) = ( 2, 4, 8, 16, 16 )
が得られる。
【０１７１】
圧縮コードは、初期値X0に設定される。閾値となるPA, PB, PC,PDについては、初期値X0の情報から、最大演算精度幅 (1.0000…)2 を２３９ビット左シフトしてMXとして求めると
MX =   883423532389192164791648750371459257913741948437809479060803100646309888
が得られる。
【０１７２】
図２７に示すように、初期値X0は16倍、累積頻度の区間の比率からPA=8, PB=12, PC=14, PD=15が与えられ、それぞれMX倍に拡大処理を行うことで初期値X0と累積頻度区間の比率が得られる。これらの値は、以下のようである。
PA = 7067388259113537318333190002971674063309935587502475832486424805170479104
PB = 10601082388670305977499785004457511094964903381253713748729637207755718656
PC = 12367929453448690307083082505200429610792387278129332706851243409048338432
PD = 13251352985837882471874731255571888868706129226567142185912046509694648320
【０１７３】
以上の初期パラメータを式（７）に設定し、変形ベルヌーイ写像の反復演算を行う。第１のファイルαでの伸長処理の過程について、最初３回分と最後３回分を図２８に抜粋して示す。図２８ではXi < PAの場合には "a"を出力し、PA ≦ Xi ＜ PBでは"b"を出力し 、PB ≦ Xi ＜ PCでは"c"を出力し 、PC ≦ Xi ＜ PDでは"d"を出力し 、PD ≦ Xi では"e" を出力する。１２７ (n-1) 回の反復処理を行うことでデータが伸長（復号）されて伸長コードが出力される。図２８を参照すると、第１のファイルαの最初の３つのデータ列（ｃｂｃ）と最後の３つのデータ列（ｂａｂ）に図２４の結果が一致していることが確認できる。なお、本実施形態では、データパターンが２文字以上のものを用いたが、データパターンの検索アルゴリズムとして文字列を巡回させるブロックソートを用いることが考えられる。
【０１７４】
＜実施形態５  頻度が等しくランダムなデータの圧縮＞
実施形態３では、データパターンの頻度（度数）を変形ベルヌーイ写像の傾きパラメータとして設定を行っている。これは算術符号もデータパターンの頻度として設定する点で同じである。従来の一般的な可逆圧縮アルゴリズムでは、頻度が等しくランダムなデータ列に圧縮を行っても効果が得られなく、辞書領域分を含めるとデータ容量が元のデータ容量より大きくなってしまうといった問題がある。
【０１７５】
この問題に対して考察する。図７、図８に鑑みると、頻度となる傾き"p"を変更した場合でも各領域に対応する傾きpと初期値x0を選択すれば同じビット列が得られることが明らかになった。これまでは、傾き"p"は頻度（出現確率）により決定する手法が採用されていた。これに対し、より少ないビット列の情報によって伸長コードを得ることができるような、該当領域内の傾きpと初期値x0を探索することができるならば、圧縮率を大きくすることが可能である。
【０１７６】
例えば、符号"0"と"1"の頻度が等しく、ランダムな32ビット分のデータ列
"11000001101011010101101100100011"（１６進数で表すと" C1AD5B23"）を用意する。データ  パターンが２種類("1"か"0")の場合、式（１）と式（２）の整数化演算式として、以下に示す式（  ９）式（１０）を用いることにする。圧縮時は式（１０）を用い、伸長時は式（９）を用いる。
【０１７７】
【数９】
2019047450.tif 000011
【０１７８】
【数１０】
2019047450.tif 000012
【０１７９】
図１５で示したアルゴリズムにて、上記の２値のデータの圧縮処理を行う。AとBの頻度はともに１６となり、合わせると３２ビット分のデータになる。ここで、式（１０）の傾きはA/M = 16/32 = 1/2、(M-A)/M = 16/32 = 1/2（実数ではp=0.5）になり、始めにPA=1、下限X32=0を設定して式（１０）により圧縮処理を行うと図２９に示すように演算値XiとPAの値が遷移し、下限X0は
下限X0 = 6498727494が得られる。これを２進数ビット列で表すと、
110000011010110101011011001000110
になる。
【０１８０】
上限X0について、開始時には最大演算幅 M = 2 であることを考慮して、傾きの分子の掛け算より差分は、2 x (1)32 = 2となる。そこで、この差分を下限X0に足すと、
上限X0 = 6498727496が得られ２進数ビット列は、
110000011010110101011011001001000
が得られる。
【０１８１】
この区間に上限X0は含まれないため、この区間内における最小数ビットとしては下限X0が選択され、下位１ビットが０であるため、この下位１ビット"０"を取り除くことで圧縮コードは３２ビット分の以下の値となる。
11000001101011010101101100100011
これを、１０進数で表すと"3249363747"となる。
【０１８２】
この例では、圧縮コードが圧縮前のデータ列と同じになったが、図５と図６と図７を参照すると判るように、図７の"p = 0.5"における縦軸の初期値x0の区間幅は、それぞれのデータ列で均等に分割されている。また、図５では"p = 0.5"であり、横軸の初期値x0の区間幅が均等に分けられおり、それぞれの区間内からベルヌーイ写像を行ったときの生成されるコードが図６に示されている。データ列として初期値x0を与え、圧縮処理で求められる図７における"p = 0.5"の縦軸の初期値x0の区間幅は、図５における横軸の区間幅と等しくなっている。つまり"p = 0.5"にて圧縮前のデータ列として初期値x0が与えられると、圧縮処理で求めた初期値x0が同じになる場合があるためである。
【０１８３】
この圧縮後の圧縮データファイルに含まれるデータ内容が図３０に示すようになる。図３０（ａ）は１０進数の表記であり、図３０（ｂ）は２進数による表記である。ここで圧縮コードは、バイナリにすると情報量は３２ビットであり、"0"と"1"の各個数は、上から１６、１６となる。このため、これをバイナリ（１６は(1111)2 を割り当てる）にすると情報量として合計８ビット、データパターン情報となる"0"と"1"は１ビット＋１ビットのため合計２ビットとなる。これらから伸長に最低限必要な情報量は、３２＋８＋２＝４２ビットとなる。この情報を辞書領域に保持させることが必要で、元（圧縮前）の３２ビットの情報量より１０ビット分だけ情報量が大きくなり、圧縮の効果が得られないものとなる。
【０１８４】
以上の処理例は、図７、図８において傾きをp=0.5とし、初期値x0の半開区間を求めたものである。ここで、傾きを"p = 0.4375"（２進数では(0.0111)2 ）に変更して、同じ32ビット分のパターン"11000001101011010101101100100011"について、式（１０）による圧縮処理を実行してみる。
【０１８５】
上記の傾きpは、整数ビットでは(0111)2となり、１０進数では、"７"となるため、式（１０）の傾きは A/M=7/16(=傾きp)であり、(M-A)/M=9/16と設定して、下限X32=0から始めて、図１９のフローチャートにて圧縮を実行した結果の遷移状態を図３１に示す。
求められた下限X0は、
下限X0 = 3743106035727648088261746893080105275376となり、
上限X0は、下限X0に差分16 x 716 x 916 = 985300660482914638629239767056を足した以下の値となる。
上限X0 = 3743106036712948748744661531709345042432
【０１８６】
下限X0と上限X0をビットで表すとX0の区間は、
下限X0 =
101011111111111111111111111111111010111010101110001100001001111010001000101100010101010010110000101111100100110100110100111111110000
上限X0=
101100000000000000000000000000000111010110101001000010100100100000001110010001101000010011110011110100011001010010110001000000000000
となり、小数点３２桁までの１０進数の実数にすると、
0.68749999992604027276854594674660…≦X0≦ 0.68750000010701139974145235100877…
となる。この半開区間内の最小限で表せられるビット値の初期値X0は、(1011)2の４ビット（ 0.0〜1.0間の実数は２進数で(0.1011)2となり１０進数では0.6875）となる。
【０１８７】
先に傾きp = 0.5として求めた圧縮コードにおいて、初期値X0は情報量３２ビットであった。これに対し、傾きをp = 0.4375に変更して圧縮処理を行った場合では、圧縮コードにおいて、初期値X0の情報量４ビット分となり比較して２８ビット分削減されている。
【０１８８】
ただし、傾きp=0.5は情報量１ビットであったが、傾きp=0.4375は４ビットであり、３ビット分増加している。図３２に、圧縮後の圧縮データファイルに含まれるデータ内容を示す。図３２（ａ）は１０進数の表記であり、図３２（ｂ）は、２進数ビット値に展開して表現したものである。図３２の１行目は初期値X0に相当する圧縮コードであり、２行目は圧縮前の元データへ伸長するために必要な写像の回数、３行目は傾きパラメータA/M("A=7")とデータパターン("0")、４行目は傾きパラメータ("(M-A)/MのM-A=9") とデータパターン("1")を示している。
【０１８９】
情報量については、圧縮コードである初期値X0は４ビット、伸長に必要な写像の回数の情報量は５ビット、傾きA/Mが４ビット、データパターン"０"は１ビット分、傾き(M-A)/Mが４ビット、データパターン"１"は１ビット分となり、これらから伸長に最低限必要な情報量は、４＋５＋４＋１＋４＋１＝１９ビットになるため、圧縮前の３２ビットと比べると１３ビット分少なくなり（圧縮率59.375%）、"p = 0.5"のとき（４２ビット）と比べても圧縮の効果が得られている。
【０１９０】
また、この例の可逆圧縮のプロトコルが、データパターンはビット２値（符号長１）のみと定めている場合には、伸長に必要な情報は初期値X0 = (1011)2、傾きA=(0111)2、伸長後のデータ容量（写像回数）n=32=(11111)2 が判れば良いため、最小限必要なデータ量は、４＋４＋５＝１３ビット分あれば３２ビット分の容量を復元することができ、圧縮率は40.625%となる。
【０１９１】
ここでパーソナルコンピュータのツールとして使えるような具体例として、データパターンはビット２値（符号長１）のみ扱うと定めて、圧縮ファイルを１つのファイルとしてまとめるプロトコルを考える。例えば、圧縮ファイルの最初の２バイト分を圧縮前ファイルの容量情報として１〜６５５３６ビット（１〜８１９２バイト）までの圧縮前ファイル容量が可能な対象とする。従って、６５５３７ビット以上の圧縮前ファイルはプログラムでエラー処理する。圧縮ファイルの次の２バイトは傾き"p"を出現確率に割り当てる。具体的には、圧縮前のファイル容量中のデータパターン"０"をカウントした個数を出現確率として、傾き"p"とする情報を入れる。カウント値は必ず６５５３６以下になる。また、本実施形態５のように、傾き"p"を変更することで初期値X0とする圧縮コードの情報量を少なくできる効果を得る構成を採用する場合には、傾き"p"を１６ビットパターンまで変更（試行）できるものとして２バイト分を使用することも考えられる。傾き"p"はどのような値でも初期値X0を導出できる。
【０１９２】
圧縮ファイルの５バイト目以降には、圧縮コードとなる初期値X0をセットする。このため、最初の４バイト分が辞書領域になる。伸長処理では最初２バイトからベルヌーイ写像の反復の回数（圧縮前ファイル容量）の情報を得て、次の２バイトで傾き"p"（式（９）ではA）の情報を得て、５バイト目以降から初期値X0を取得し、これらを初期設定して変形ベルヌーイ写像を行い圧縮前のデータ戻すといったプロトコルを考えることができる。
【０１９３】
このように構成したデータ列の例によって、情報を符号化圧縮する場合の圧縮の限界を示す情報源符号化定理を確認する。情報エントロピーH（ビット）は次の定義式である式（１１）により与えられる。
【０１９４】
【数１１】
2019047450.tif 000013
【０１９５】
また、"pi"は符号の出現確率、"M"がデータパターンの事象（種類）の数である。
例に示した32ビット分のデータ列 "11000001101011010101101100100011"では符号は"0"と"1"の２種類（符号長１）であり、"M = 2"となり、データパターンの出現確率は"0"が" 16/32=1/2"、 "1"が" "16/32=1/2"となるため、情報エントロピーHは以下の式（１２）のようになる。
【０１９６】
【数１２】
2019047450.tif 000014
【０１９７】
このデータ列で符号は"0"と"1"の２種類（符号長１）と考えた場合、平均符号長を１ビット以下にすることができなく、情報量は32ビットのためこのデータ列を表すには "32 x 1 = 32ビット" 以上が必要になることを示している。平均符号長については平均符号長をLとすると
平均符号長L= ( 符号の長さ x 出現確率 )の和
で求められ、例示したデータ列では符号は"0"と"1"と考えると、符号の長さはそれぞれ"1"、出現確率は、"1/2(=16/32)"のため
L = (1 x 1/2) + (1 x 1/2) = 1
となり、平均符号長Lは１ビットとなっている。
【０１９８】
情報源符号化定理では、平均符号長Lは情報エントロピーHよりも小さくできないとされ、不等式 "H ≦ L" が成り立ち符号化データ圧縮の限界を示している。例示したデータ列を２ビット区切りのブロック（符号長２）として解して、データ列をコンマで区切ると、"11, 00, 00, 01, 10, 10, 11, 01, 01, 01, 10, 11, 00, 10, 00, 11"となる。
それぞれの符号を数えると"00"は４つ、"01" は４つ、"10"は４つ、"11"は４つとなっているため、情報エントロピーHは符号の出現確率piがそれぞれ"1/4"、事象（種類）Mは４つのため、次の式（１３）として求められる。
【０１９９】
【数１３】
2019047450.tif 000015
【０２００】
上記式（１３）に示す通り、情報エントロピーHは２ビットとなる。ここで、データ列は２ビットずつ１６個分あるため、このデータ列を表すには "16 x 2 = 32ビット" 以上が必要になることを示している。また、平均符号長Lについて符号は、"00"、 "01"、 "10"、 "11"であるから、符号の長さはそれぞれ"２"、出現確率はそれぞれ" 1/4 (=4/16) "のため、  L = (2 x 1/4) + (2 x 1/4) + (2 x 1/4) + (2 x 1/4) = 2
となり平均符号長Lは２ビットとなる。データ列を４ビットのブロックに区切った場合も同様に、１６進数で表すと" C1AD5B23"となり、各符号は、１回ずつの出現確率のため情報エントロピーは、H=4、平均符号長L=4となり"H ≦ L"の関係となる。
【０２０１】
以上から本実施形態に係る変形ベルヌーイ写像による手法は、符号長１としたときに３２ビットの情報量を１３ビットに圧縮できることが判る。このような結果によると、平均符号長は"13/32 = 0.40625ビット" となるため、本実施形態に係る手法は、符号化圧縮（ハフマン符号、Lemple-Ziv）と異なる算術式であり圧縮率をより大きくできる利点を有している。
【０２０２】
伸長処理では、辞書領域から必要なパラメータを式（９）に読み込む。初期値 X0 = 11 = (1011)2、傾きM/Aは２進数小数点(0.0111)2になるため、Mは(1.0000)2を４ビット左シフトして得られる整数値 M = 16のためM/A = 16/7になる。傾きはM/(M-A) = 16/9になる。これら初期パラメータをセットして、伸長（復号）後のデータ量となる写像回数３２を読み込む。実際には、前述したように伸長時の写像回数は"n-1"回で復元できるため、３１回である。以上の準備が整うと、図１９のフローチャートに示す処理手順にて式（９）による伸長（復号）処理を行うことで圧縮前のデータ列である伸長コードが出力される。この伸長処理の過程を図３３に示す。
【０２０３】
以上、頻度が等しくランダムなデータに対しても、傾きpを変更することで圧縮の効果が得られることを示した。これについては、特開２０１０−２３７７３５号公報には、変形テント写像は乱数生成に有効であることが紹介されている。これに対し、本実施形態は、変形ベルヌーイ写像を逆にたどる（遡る）圧縮アルゴリズムを用いて乱数生成シードを求め、そのシードから元のデータ列を出力できる構造とした点が特徴となっている。本実施形態に係る可逆圧縮手法は、圧縮コードとして情報量が少なくなる適切なシードを設定すれば、情報エントロピーの高いデータについても圧縮効果が得られることを狙いとする。
【０２０４】
上述した本実施形態の説明から、データパターンが３種類でデータパターンの頻度が等しくランダムで圧縮効果が得られないデータ列の場合でも、図１４に３次元の初期値集合を示したように初期値x0のビット数がより小さくなるような傾きpaと傾きpbの組み合わせを３次元の集合の中から求めることで、圧縮効果があるデータを得ることが推測される。
従って、データパターンがＮ種類からなる頻度が等しくランダム性が高いデータ列の場合にも、前述したようにＮ次元の集合からより情報量が少なくなる傾きパラメータ群と初期値x0の組み合わせを選択することによって、情報エントロピーが高いデータでも圧縮を高くできる効果が得られることが期待できる。
【０２０５】
頻度として設定していた傾き"p"を変更する場合には、変更した傾き"p"によって、圧縮効果が上がるかどうか調べていく工程が発生するため、手間がかかる。しかしながら、圧縮処理では圧縮率を高めることのできる効果的な傾きパラメータを探索できることにより 、圧縮後のデータ量をより小さくできることがメリットとなる。
【０２０６】
探索方法としては、傾きpをビット数が少ないものから二分探索法で圧縮効果があるかを調べていく手法が考えられる。例えば、p=0.5より、p=0.75と0.25の場合のx0の下限と上限を計算し、次はp=0.875,p=0.625,p=0.375,p=0.125の場合のx0の区間を調べ、圧縮効果がある場合はその値を採用するといったアルゴリズムが考えられる。
【０２０７】
本実施形態に係る圧縮処理装置は、図１に示すように、圧縮コード生成手段１２０により生成された圧縮コードの伸長コードに対する圧縮率を求める圧縮率算出手段１３０を備え、上記圧縮率算出手段１３０により算出された圧縮率が所定値よりも大きい場合に、変形ベルヌーイ写像を遡る式の係数を変更して圧縮コードを求める処理を行う。ここでは、二分探索法により新たな係数を求めて係数を変更し、圧縮コードを求める処理を行う。
【０２０８】
伸長処理においては、算術符号では区間を再分割するといった圧縮と同じ過程を繰り返す必要があるが、本実施形態の手法では変形ベルヌーイ写像を一意的に演算しながらデータ列を出力して行くため、圧縮処理と比較して計算量を小さく伸長処理が行えるという効果が期待できる。このため、圧縮は高性能なサーバで処理を行い、通信トラフィックを削減してネットワーク上に分配することにより、比較的処理能力が低い携帯端末で伸長（復号）する形態に好適となる。
【０２０９】
＜実施形態６  変形ベルヌーイ写像を遡る圧縮の場合の高速化アルゴリズム＞
コンピュータで扱う数値はディジタル（離散）値になるため、圧縮処理における各パラメータ遷移を示した図１６に明らかなように、演算を積み重ねることで桁数が増えていき演算の時間とコストが増大してしまう。実施形態４で示したデータ列"a b a a b a c"について、最後尾の "c"の次にもう一つ"c"をパディングすることで演算の省力化・高速化を図る実施形態を示す。
【０２１０】
式（６）を用いて、データ列"abaabacc"に対し圧縮処理を行う。データ列"abaabacc" の総数は８個になるため"n = 8"となり、式（６）のMは “M = 8"に設定される。ここで、データパターンの頻度は、"a"が４個であるため"A = 4"、またPAには最初はAと同じく "PA = 4"を累積頻度として設定する。データパターン"b"は２個であるためデータパターン"a"の個数４を加えた累積頻度は 4 + 2 = 6となり、"B = 6"、またPBには最初はBと同じく "PB = 6"を累積頻度として設定する。
【０２１１】
更に、傾きA/M = 4/8 = 1/2と約分し、傾き(B-A)/M = 2/8 = 1/4、傾き(M-B)/M = 2/8 = 1/4 と約分して設定する。以上のように式（６）の初期パラメータ設定を行うが、累積頻度の比率 PA:PB;M = 4:6:8 であり、同比率はPA:PB:M = 2:3:4 に設定できるため、初期パラメータをPA=2,PB=3に設定できる。このため約分すれば最初に設定する下限をX8 = 0、上限をX8 = 4に設定できる。
【０２１２】
始めに、下限X8 = 0を代入して式（６）の圧縮処理演算によるパラメータXi, PA, PBの各遷移を図３４に示す。ここで、Xi, PA, PBの拡大処理について、データパターン"a"の場合は傾きA/Mから割り算Mによる余りが出ないようにするため、倍率は２倍に演算精度幅を拡大すればよく、データパターン"b"とデータパターン"c"はそれぞれの傾き1/4のため共に４倍に演算精度幅を拡大すればよい。図３４の一番右の列はこの式（６）の演算を行う前からの拡大倍率を示している。
【０２１３】
図１６ではデータ列数が素数の７(=M)であったため、演算精度の拡大処理は演算の都度７倍にしなくてはならなかった。これに対し、図３４の例では"c"を１つパディングして傾きが約分できるようになったことで分母が小さい値になり、写像回数は１回分増えたが、演算過程のパラメータを比較すると演算精度の拡大幅が少なくなったことが確認され、演算コストの省力化が実現できる。
【０２１４】
最終的に得られた下限は、X0 = 4412となり、そのときの最大演算精度幅が
16384（=214）であることを考慮して、最大演算精度幅と桁を合わせたビット値は、下限
X0 = (01000100111100)2となる。
【０２１５】
最終的に得られる下限X0と上限X0の区間の差分は(1/4)4 x (1/2)2 x (1/2)2であることを考えると、開始時の最大演算精度幅がM=4であったことを考慮して、分母側は、
4 x 24 x 42 x 42 = 16384となり、分子側は、4 x 14 x 12 x 12 = 4となる。このた  め下限X0に４を足すことで  上限X0 = 4416  が得られ、上限X0のビット値は、
上限X0 = (01000101000000)2
となる。
【０２１６】
次に、下限X0と上限X0の半開区間[4412,4416)から、最小のビット量で表せられる圧縮コードを求める。"0.0 〜 1.0"間のどの区間に相当するかを考えると、図１７では、得られた下限X0と上限X0のビット値をその演算精度幅のビット値で割ることで区間を導出して圧縮コードを得ることを示した。本実施形態のように、"c"を１つパディングした場合では、分母側はデータ量となる"M = 8"と２の乗数倍であるため、演算精度幅を拡大していき最終的には２の乗数倍の "16384（=214）"が得られた。このためビット値による演算は、上記の下限X0と上限X0のビットを" 214 "で割るため、１４ビット分右シフトすればよい。
【０２１７】
上記の下限X0と上限X0は情報量１４ビットであるため、小数点以下では
下限X0 = (0.01000100111100)2〜上限X0 = (0.01000101000000)2の間となる。
【０２１８】
圧縮コードを求めると、前述したように上限X0は半開区間で含まれないため、下限X0 のビット列を上位桁から"010001001111"まで見て行くと、その次のビットは"０"になっている。そこで、このビット "０"を"１"に変更することで半開区間内に含まれる値になり、圧縮コードは “0100010011111” になる。このように、圧縮コードは合計１３ビットとなり、１０進数として "2207"が得られる。
【０２１９】
圧縮後の圧縮データファイルに含まれるデータ内容を図３５に示す。伸長処理にて元に戻したいデータ列は"abaabac"の７つ分となるが、冗長なデータとして"c"を１つ追加（パディング）して行っているため、図１８と比較して明らかなように、伸長後のデータ量に相当する写像を行う回数（７＝(110)2とする）が辞書領域の２行目に追加される。図３５に示すように、伸長に最低限必要なデータ量は圧縮コードの１３ビット、データ量（写像回数７）の３ビットである。データパターン"a"の個数が２ビット、データパターン"b"と"c"は個数が各１ビットで計４ビット、データパターン"a", "b", "c"をアスキーコード１文字当たり８ビットとすると、３ｘ８＝２４ビットとなり、圧縮後の情報量が合計で、１３＋３＋４＋２４＝４４ビット（圧縮率約７９％）となる。
【０２２０】
図１８では伸長に最低限必要な情報量は、９＋４＋２４＝３７ビットであったが、圧縮コードが９ビットであった。これに対し本実施形態では、１文字パディングした圧縮コードは１３ビットとなり４ビット分が増え、何回の写像で伸長処理を打ち切るかを示すデータ量に関する情報が必要となるため３ビット分が追加されており、比較すると合計７ビット分が増加する結果となった。
【０２２１】
しかしながら、"c"を１つパディングした効果として演算の度に更新される演算精度幅は２の乗数倍になったため、最終的な区間を求めるビット同士の割り算のコストはその乗数分を右シフトすれば良くなる。結果的には、最終的に得られる演算精度幅のビット量がデータパターン頻度数と写像回数から判るため右シフト演算も不要になり、下限X0に分子側の整数値差分をそのまま加えることによって上限X0が求められ、圧縮コードも得られた下限X0と上限X0の値そのものから求められるようになるため、計算が省力化でき高速な演算が期待できる。
【０２２２】
このように、本実施形態に係る圧縮処理装置では、伸長コードを構成する１単位データの数が２の倍数となり、且つ変形ベルヌーイ写像を遡る式の係数を、約分可能となるように、伸長コードに所定の１単位データをパディングする手段を有し、圧縮コードを求める処理を行うものである。
【０２２３】
また、本実施形態が式（５）を用いて実行する伸長処理の過程を図３６に示す。図３５の圧縮データファイルに含まれる情報から各データパターンの頻度等の情報を読み出し、Mは各頻度の足し算 M = 4 + 2 + 2 = 8 になり累積頻度A=4, B=6となる。このため、式（５）の傾きは、M/A = 8/4 = 2, M/(B-A) = 8/2 = 4, M/(M-B) = 8/2 = 4
と全て割り切れる勾配値になる。かくして、伸長処理の過程で演算精度幅を増やす必要がなくなる。
【０２２４】
また、初期値X0については圧縮コード“0100010011111”より、初期値X0 = 2207 が設定される。この演算精度幅は、213 = 8192 が設定される。閾値となるPA,PBについてはデータパターンの頻度から、"A:B:M = 2:3:4"となり、最大演算幅をMX=8192とすると、"PA : PB : MX = 4096 : 6144: 8192" と同等の比となるため、PA=4096,PB=6144を設定して、初期値X0はそのまま“2207"を割り当てることができる。
【０２２５】
以上のようにパラメータを式（５）に初期設定し、図３６に示すようにXiが演算により得られる毎に、 Xi < PAのとき１単位データであるデータパターン"a"を出力し、PA ≦ Xi ＜ PBのとき１単位データであるデータパターン"b" を出力し、 PB ≦ Xi のとき１単位データであるデータパターン"c" を出力し、図３５の２行目の情報より７回分の出力を行い、データ列 "abaabac" を復元した時点で伸長処理を終了する。
【０２２６】
図２１に示した例は、式（５）傾きの分子側がデータ量にも相当するM=７であり、例えば M/A = 7/4 の場合では割り切れない値になるものであった。そこで、演算の前に"A"の値を掛け算して演算精度を拡大することで余りが出ないように対策したため、図２１の倍率の列に示す倍数で演算精度幅が増加している。
【０２２７】
これに対し"c"を１つパディングした本実施形態では、その効果として、M=8となったため式（５）を参照して判るように、傾きの値が全て割り切れることになり、図３６の演算の遷移に示すように最初に設定された演算精度幅が最後まで変更されることなく伸長の演算が実施される。このため伸長処理でも写像の度に演算精度幅の変更による演算コストが増大することなく、より高速に演算が行えるといったメリットがある。
【０２２８】
本実施形態に係る可逆圧縮アルゴリズムは、以上の性質から圧縮対象とするデータ列については、素数などの割り切れないデータではなく、２の倍数の16,32,64,128,…,2n（ビット or バイト）単位の固定長で処理を行うことができる。このため、圧縮コード(初期値X0)の導出を、演算精度分の右シフト演算で行うことが可能になる。また、下限X0を導出してから上限X0を求める半開区間の導出は、データパターンの頻度と計算（写像）回数から求められる整数値の足し算を行い、その区間内での最小のビット量（圧縮コード）を求めれば良いことになる。これによって、右シフト演算（ビット小数点）自体が不要となる。従って、圧縮処理の対象とするデータ量としては、２の乗数倍の固定長を扱うプロトコルが望ましい。
【０２２９】
また、データパターンの種類が多い場合に実施形態４の５つのデータパターンの場合で示したように、データ量がデータパターンの各頻度で割り切れるデータ列を用意した。このため、圧縮処理では約分により演算精度の桁がそれほど増えることなく、伸長処理では演算桁数を増やすことなく最初から固定の演算精度幅にて処理を行うことができた。
【０２３０】
以上のことから、データ列の量（伸長コードを構成する１単位データの数）が２の倍数であり、かつデータパターンの頻度（変形ベルヌーイ写像を遡る式の係数）がうまく約分できるような頻度数になるように、データパターンをパディングして調整する本実施形態の構成によって、演算コストを抑えて圧縮処理と伸長処理の演算を高速化することが期待できる。
【０２３１】
以上から、本実施形態である変形ベルヌーイ写像による可逆圧縮は、圧縮対象におけるデータ列の量が２の倍数なるようなデータ、例えば、固定長の通信パケット単位のデータや、ファイルを分割した分割後のデータなど、を通信や保存する用途に好適であることが判る。
【符号の説明】
【０２３２】
１００  圧縮処理装置
１１０  圧縮処理手段
１２０  圧縮コード生成手段
１３０  圧縮率算出手段
２００  伸長処理装置
２１０  伸長処理手段
２２０  伸長コード生成手段
【図１】
2019047450.tif 000016
【図２】
2019047450.tif 000017
【図３】
2019047450.tif 000018
【図４】
2019047450.tif 000019
【図５】
2019047450.tif 000020
【図６】
2019047450.tif 000021
【図７】
2019047450.tif 000022
【図８】
2019047450.tif 000023
【図９】
2019047450.tif 000024
【図１０】
2019047450.tif 000025
【図１１】
2019047450.tif 000026
【図１２】
2019047450.tif 000027
【図１３】
2019047450.tif 000028
【図１４】
2019047450.tif 000029
【図１５】
2019047450.tif 000030
【図１６】
2019047450.tif 000031
【図１７】
2019047450.tif 000032
【図１８】
2019047450.tif 000033
【図１９】
2019047450.tif 000034
【図２０】
2019047450.tif 000035
【図２１】
2019047450.tif 000036
【図２２】
2019047450.tif 000037
【図２３】
2019047450.tif 000038
【図２４】
2019047450.tif 000039
【図２５】
2019047450.tif 000040
【図２６】
2019047450.tif 000041
【図２７】
2019047450.tif 000042
【図２８】
2019047450.tif 000043
【図２９】
2019047450.tif 000044
【図３０】
2019047450.tif 000045
【図３１】
2019047450.tif 000046
【図３２】
2019047450.tif 000047
【図３３】
2019047450.tif 000048
【図３４】
2019047450.tif 000049
【図３５】
2019047450.tif 000050
【図３６】
2019047450.tif 000051