1989年

1989年2月,紆余曲折を経て, やっとわれわれのグループの総決算ともいえるデータ圧縮特集が, The BASIC の3月号に掲載されました。

1989年4月からは,距離的にもやや仕事がきつい高校に移ったので, あまり圧縮については考えられなくなってしまいました。 その代わり,ときどき CompuServe などを覗き,あちらの人と話し合うのが楽しくなってきました。

#1091/1977 計算機と算法
★タイトル (SCIENCE )  89/ 5/10   1:27  ( 20)
CompuServeだより
★内容
 昨日CompuServeのIBMPROのLHARC関連のボードに初めて行
ってみました。今朝見たらもうたくさんの返事がくっついていたので驚きました。
 SEAからはやはりARCという名前はつけてほしくない旨のコメントがかつて
あったようですが、その後あまり問題になっていないところを見るとたいしたこと
もないのかな。
 Phil KatzはLZとShannon−Fano法をくっつけようとして
いるとのことです。うまくいくのかな。
 SysOp Conrad Kageyama氏の質問。なぜスイッチはケース
センシティブなのか。提案。例えばMYFILE.EXEなる自己解凍ファイルが
あれば、MYFILE /dのようにするとその中身のディレクトリだけ見れるよ
うにしてはどうか。ただしサイスがあまり増えるようならいらない。また、MYF
ILE FILE.1のように特定のファイルを指定して自己解凍できないか。こ
れによってどのくらい自己解凍ファイルのサイズが増えるか。
 Grant Ellsworth氏から。LZHUFの頻度テーブルの変更法は
もっとうまくできるのではないかという気がする。
 その他、5「ろいろなメッセージがありましたが、まだ具体的なアルキSリズムにつ
いての話には残念ながらなっていません。

追伸:おっとこれは何日も前に書いたものだった。もうポストしたものかな。
いずれにせよ昨日とかあるのはやや前の話です。

ここで一つアイデアが浮かびました。 データ圧縮の考え方を使ったバイナリ差分です。

#1099/1982 計算機と算法
★タイトル (SCIENCE )  89/ 5/14  19:42  ( 36)
もう一つのデータ圧縮/奥村
★内容
 以下に書くことは、確かどこかで読んだことのある内容だと思うのですが、ソー
スが思い出せません。オリジナルなアイデアではありません。とりあえず手もとに
ある本などを参考にして、その議論を復元してみます。
 データ圧縮というと、与えられたテキストなり画像なりを圧縮することだけを考
えがちですが、われわれにとって有用なもう一つの圧縮があります。
 われわれはプログラムを作るとき第1版、第2版、……と改良を重ねていくわけ
ですが、それらの間にはほぼ共通の部分もたくさんあるはずです。そこで、第2版
を発表したときは、第1版との違いの部分だけをうまく提示することができれば、
第1版をもっているものにとっては、かなり小さい「修正箇所」だけのファイルを
もらうだけで第2版が復元できるはずです。
 といっても、パッチを当てるというわけではなく、ある部分に新しいコードが挿
入されてその後の部分は後ろにずれるという類のことにも対応できなければなりま
せん。
 こういったことは、絶対ジャンプ命令の多い実行ファイルではあまりうまくいか
ないかもしれませんが、ソースプログラムなどではたいへん効力を発揮するのでは
ないかと思います。
 UNIXのdiffは(といっても私はUNIX使ったことないのですが)、こ
ういう考えの一つの実現と見ることができるでしょう。diffはMcIlroy
の作ったプログラムで、テキストファイルにしか適用できません。そのアルゴリズ
ムは例えば
    J. W. Hunt and T. G. Szymanski, A fast algorithm for computing
    longest common subsequences, CACM (May 1977)
にあるそうです(読んでない)。diff自体のアルゴリズムは
    M. D. McIlroy and J. W. Hunt, An algorithm for differential file
    comparison, Bell Labs Computing Science Technical Report 41 (1976)
にあるそうです。
 データ圧縮の文脈ではincremental codingの一種と考えられ
ます。これについては、例えば
    M. Visvalingam, Indexing with coded deltas: a data compaction
    technique, Software Practice and Experience 6, 397-403 (1976)
に言及されているそうです。
 どうも「そうです」が多くてすみません。どなたか研究してみてくださいません
か。われわれがBBSで交換するプログラムは、完成品が1つあるだけというので
はなく、皆の意見を聞いては少しずつ手を加えて改良していくというタイプが多い
ように思いますので、この種の「圧縮」はけっこう役に立つのではないかと思いま
す。どうでしょうか。
#1115/1982 計算機と算法
★タイトル (SCIENCE )  89/ 6/ 3   6: 2  ( 16)
圧縮<CompuServe/奥村
★内容
 PKZIP1.0はあと1〜2週間ほどでベータ版になるとか。今月中には完成
するらしい。新アルゴリズムは3つのバリエーションがあり、ファイルの性質によ
って使い分けるとのこと。欠点はPKZIP、PKUNZIP、ZIP2EXEと
3つに分かれていて使いにくく、自己解凍ファイルは15480バイトも増える。
このことからアルゴリズムはLHARCと違うことがわかる。
 PKシリーズの作者Phil Katzはミルウォーキーあたりに住む26才の
青年。CompuServeにはほとんど現れない。CompuServeではZ
enith Forumにときどき現れる程度。そこのSysopはJoseph
(Joe) Katzというノースキャロライナに住む英語の教授だがPhilの
親類ではないらしい。PKは自前のBBSを持つが、回線が少ないので、主にEX
EC−PCというローカルBBSで圧縮関係の話をしているらしい。そこでの話の
内容がご隠居先生がポストしてくださったexec.pkというファイルらしいの
ですが、残念ながら私には回線不良(?)のため読めない。それに何かアルゴリズ
ムについて書いてあるならどなたか教えてください。
 まちがえた、exec.pkはNIFTYだった。PC−VANでもどこかにあ
るんでしょうか。

私の頭の中には,LZHUF の Huffman 部分を dynamic Huffman ではなく古典的な2パス Huffman にして高速化するアイデアが出はじめました。

#1150/1982 計算機と算法
★タイトル (SCIENCE )  89/ 6/14   6:14  ( 43)
LZHUFの高速化のアイデアなど/奥村
★内容
 CompuServeではLHarcが良いかPKZIPが良いかというような
議論が続いていました。アルゴリズムについては全然といってよいほど話題が出ま
せん。日本のBBSはかつて米国でCP/Mはなやかなりし頃のように趣味でプロ
グラムを作る人でにぎわっているが、米国のBBSではMS−DOSの時代になっ
てから既存のプログラムを利用する方法に関心が移ってしまったということです。
 LHarcを高速にするには、ひとつにはある程度大きいファイルについては適
応型をやめて2パスでハフマン(または算術または後続文字集合)圧縮するのが良
いかもしれません。こうすると特に解凍はうまくすると表を引くだけでできるので
非常に速くなるでしょう。もう一つはスライディング辞書部分をまったく書き換え
てしまって2分木でなくtrieのようなものにするという方法が考えられます。
あと、一致位置については、表をもっていると自己解凍ファイルが大きくなるので、
次のように単純化することを考えたんですが、LHarcでは一致位置が9ビット
から始まるのに対してこれは8ビットから始まるので、中程度の距離ではかえって
ビット数が多くなってしまい、ファイルの性質にもよりますが、圧縮比はやや落ち
る傾向にあります。ISHとLHarcで解凍してください。

 ROM男さん、私は最初、理論的には255ビットまで行くかと思ったのですが、
吉崎さんに言ったら、頻度がある程度おおきくなると全部を2で割るので根の頻度
に上限があり、そのため計算してみると二十何ビットまで(ちょっと忘れた)にし
かならないというふうなことでした。いずれにしても当初16ビットまでと考えた
のは違っていたのでlongに変えることにしたということで、新しいLZHUF
では32ビット整数を使っています。

 みるくさんどうも。NIFTYでも同時に同じこと書いたら、吉崎さんがメール
でソースを送ってくださいました。このcompress.cは
 * Revision 4.0  85/07/30  12:50:00  joe
というもの(16ビット版)です。PKZIPのソースという話は知りません。ま
だベータテスト結果くらいしか出てないのでは?

 MASSANさんお久しぶりです。ぜひまた手伝ってください。Hu−Tucker
というのはよく知らないので調べておきます。

次のログには抜けがあるようです。

#1159/1982 計算機と算法
★タイトル (SCIENCE )  89/ 6/17   6:15  ( 38)
簡略化2次ハフマン圧縮/奥村
★内容
 1文字圧縮部分のアルゴリズムだけです。
 原理はいたって簡単です。各文字の直後に最も頻繁に現れる16個の文字を表
に登録します。表にない文字が来ると「00」に続いてその文字自体を送り、表
の右端に登録します。表があふれたら右側から捨てていきます。表にある文字は、
表の左にある文字ほど短いビット数で送り、そのすぐ左側の文字と交換します。
こうするうちに、頻繁に現れる文字ほど表の左に集まります。
 復元部分はまだ書いていませんが、6ビットずつ読んで表を引けばよいでしょ
う。どなたか作ってみてください。
 ふつうの適応型ハフマンより速く圧縮比も良いのですが、Storerの本に
あるダイナミックディクショナリ法の方が圧縮比は良いようです。
 Phil Katzのいっている「後続文字集合(follower set
)」の方法よりこちらの方がきっと良いでしょう。
 ただし、2文字の相関は、スライディング辞書アルゴリズムがすでに考慮して
くれているので、それと組み合わせても単純なハフマンより圧縮比が良くなるこ
とはないようです。
 むしろスライディング辞書アルゴリズムを高速化して通常の2パスハフマンを
使うことの方が期待できます。この場合も、ハフマンコードの復元には表を使い
ます。コードのほとんどは12ビット以下ですから、4Kバイトの表を作れば、

については、例えば表からリストをつないで探索します。あるいはlzssでや
ったように、根が4K個ある2分木で探索すればさらに速くなるでしょう。
#1210/1982 計算機と算法
★タイトル (SCIENCE )  89/ 6/25  16:28  ( 49)
PKZIPのアルゴリズム/奥村
★内容
 大久保先生がポストしてくださったunzipを読んで推測してみました。
 PKZIPでは3つの方法がサポートされているようです。
  ・store  単に各文字をコピーするだけ
  ・shrink ダイナミック辞書(LZWの改良版)
  ・reduce スライディンク辞書+後続文字集合(LZHUFの変形)
 このうち特に問題となっているreduceアルゴリズムについて記します。
 アルゴリズムは、前段がスライディング辞書エンコーダ、後段に後続文字集合
によるエンコーダがあります。
 スライディング辞書エンコーダは、バッファにそれまで読んだ4096バイト
の文字を保管しておき、新しく読んだ文字列との最長一致の位置と長さ(≧3)
を送るか、一致が3文字に満たないなら1文字を出力します。
 2パスのため、この段の出力はすべて1バイト単位にしてあります。そのため、
余分の1ビットで文字そのものを送るか《位置・長さ》ペアを送るかの区別をす
るということができないので、エスケープシーケンスを用いています。エスケー
プ文字はアスキーコード144の文字です。ただし、本当に144という文字を
送りたいときは144に続けて0を送ります。144のすぐ後が0以外なら《位
置・長さ》ペアを意味します。
 以下はパラメータf=1,2,3,4によってビットの扱いが異なります。こ
のパラメータの値はヘッダに入っています。
 144の次の2ないし3バイトが《位置・長さ》ペアを表します。
 まず、144のすぐ次のバイトは、下位(8−f)ビットが(一致長さ−3)
を表し、上位fビットが一致位置のオフセットの上位バイトの値を表します。
通常は、その次に送るバイトが一致位置のオフセットの下位バイトです。ただし、
オフセット0が1つ前、オフセット1が2つ前、……のような数え方をします。
 ここで、もし144のすぐ次のバイトの下位(8−f)ビットがすべて立って
いれば、そのすぐ次にもう1バイト送り、実際の(一致長さ−3)は、最初のバ
イトの下位(8−f)バイトの値+次のバイトの値となります。そして3バイト
目が一致位置のオフセットの下位バイトとなります。
 上述の前段エンコーダの出力は、さらに2パスで圧縮されます。その方法は、
1パス目ですべてを走査し、各文字の次に最も頻繁に現れるn文字の表を作りま
す。ただし0≦n<64で、nの値は各文字ごとに異なっていてもかまいません。
とにかくオプティマルな値を決めます。
 こうしてできた後続文字集合の表をまず送ります。表は最大(6+8×63)
×256ビットの大きさで、256種類の文字のおのおのについて次の情報を持
っています。
  ・後続文字集合の大きさn(0≦n<64)……6ビット
  ・後続文字集合のn個の要素……8nビット
 それに続けて、2パス目で次のような符号化を行います。
 まず、1つ前の文字をcとします(c=0に初期化します)。
 文字を読むごとに、それがcの後続文字集合に属しているかどうか調べ、属し
ているかいないかの区別を1ビットで送ります(例外としてcの後続文字集合の
大きさが0のときはこのビットは不要です)。
 次に、その文字が表のk番目に登録されていたならば(0≦k<n)、kの値
を最小ビット数で出力します。つまり、例えばn=16なら、kを4ビットで出
力します。もし後続文字集合に属していなければ、8ビットで文字をそのまま出
力します。
 こんなところでしょうか。間違っていたら教えてください。

 Shamさん転送しておきます。
#1215/1982 計算機と算法
★タイトル (SCIENCE )  89/ 6/25  18:39  ( 44)
ハフマン法の解説/奥村
★内容
 話の流れに関係ないが、古典的ハフマン法のわかりやすい解説を考えています。
以下は試案。

 ハフマン法というのは各文字を一定のビット数の符号語に対応させるのですが、
その際、例えば1010という符号語があれば、これをプリフィックス(頭)とし
て持つ符号語(例えば10101)は存在できません。逆に、10101があれば
1010も存在できません。これをプリフィックスコードの仮定ということにしま
す。この仮定がなければ符号語の切れ目が1パスで判断できなくなります。
 さて、簡単のため、符号化すべき文字がABC……Zの26文字であり、
  Aの頻度≧Bの頻度≧……≧Zの頻度
だとしましょう。これらに符号語を割り当てるわけですが、
  Aの符号語の長さ≦Bの符号語の長さ≦……≦Zの符号語の長さ
でなければ最適な割り当てといえないことは自明でしょう(長さとはビット数です)。
 ここで、Yの符号語とZの符号語は同じ長さでなければなりません。なぜならば、
もしそうでなかったとすると、例えば
  Y:101001
  Z:1100111
のようになるわけですが、もし
    1100111
という符号語がもしあるなら、それの最後の1を取った
    110011
という符号語はあってはなりません(プリフィックスコードの仮定)。しかし、こ
ういう符号語が他にないなら、これをZの符号語としてしまえば、圧縮されたファ
イルの長さが減るはずですから、最適にコードを選んだという仮定と矛盾します。
したがって、Yの符号語とZの符号語とは同じ長さです。(さらに短い11001
という符号語もないからもう1ビット取ってしまえ……おっとこれでは「……≦Z
の符号語の長さ」の仮定に反する!)
 さて、再びプリフィックスコードの仮定から、
    11001
という符号語は存在しえません。したがって、
    110010
という符号語は存在しえます。よって、符号語の割り当てをやりくりすれば、
  Y:110010
とすることが可能です。こうすると、YとZは最後の1ビットだけで区別されるこ
とになります。そこで、今後は
    11001
という符号語を(Y,Z)の組を表すものと考え、11001が現れたら次の1ビ
ットで両者の区別をすると考えることにします。組α=(Y,Z)は1つの文字の
ように考えるわけです。そして、αの頻度はXの頻度とYの頻度の和です。
 こうすれば、アルファベットはA,B,……,X,αの25文字に減り、このア
ルファベットに対してさきほどと同様な議論をすれば、次第に文字の種類が減り、
最後には1個になってしまいます。この最後の1個に長さ0の符号語を割り当てれ
ば、全部の符号語が再帰的に決ってしまいます(頻度が等しいものの並べ方につい
ての不定性はあります)。これがハフマンコードです(最後の詰めが甘いか)。
#1216/1982 計算機と算法
★タイトル (SCIENCE )  89/ 6/25  18:40  (  7)
PKZIPのアルゴリズム補足/奥村
★内容
 日本グループの作品がバッファを最初スペース(20H)で初期化するのに対し
て、PKZIPはNUL(0)で初期化しているようです。
 後続文字集合の大きさnについて0≦n<64としましたが、実際は0、2、4、
8、16、32のいずれかだろうと思われます。とすれば個数を表す部分のビット
数は6ビットでなく3ビットですみそうですが。
 感想:意外と粗雑なアルゴリズムでびっくりしました。もしかしたら現在の版は
もっと工夫しているのかも。

NIFTY では前にわたしが考えたバイナリ差分ソフトが開発されつつあります。; 最初の頃は LDARC と言っていたのですが,後に LDIFF になりました。

#1251/1982 計算機と算法
★タイトル (SCIENCE )  89/ 6/29   1:20  ( 27)
NIFTYよりLDARC構想/奥村
★内容
……前略……
 以下奥村のコメント。
 一致長さはうんと長いものが期待できますので、仮に16バイトなり256バイ
トなりの一致があったならば、ひょっとしたらもっと長く一致しているんではなか
ろうかと勘ぐって、その位置からさらに後も一致をチェックしてみて、あれあれや
っぱりもっと一致するということなら、一致長さをうんと長く出すようにすれば如
何。長さのエンコードはFialaたちの論文の解説で紹介したunary co
deを用いれば、短い一致から長い一致まで、可変長でエンコードできます。おお
そうだ、この「最大限一致したらもっと長く一致していないか試してみる」という
アイデアはLZHUFにも応用できそうだ。こうすればFの値をあまり大きくしな
いでも、ほんのときたま現れる非常に長い一致を活かすことができるのでは。
#1258/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/ 1  15:35  ( 19)
新ZIP、PK対SEA/奥村
★内容
 6月18日、Phil KatzとSEAのThom Hendersonとを
招いて行われたGEnieのオンライン座談会の様子。大久保先生からいただだい
たファイルによります。大久保先生どうもありがとうございます。
 最初は2人とも平和に話していたのだが、次第に白熱し、とうとうPKはTho
mに「貴殿は嘘つきか。私がこれこれしかじかのことを認める証言をしたなどと書
いて貴殿が出した手紙類は何だ」などと言い放つやいなや退散してしまった。この
態度にはPKの支持者までもがあきれてしまった。
 以下はPhil Katzの発言の抜粋。
 新しいPKZIPはShannon−Fano法を2重あるいは3重に使ってい
る。LZHUFの問題点は適応型Huffman法が非常に遅いことにある。Sh
annon−Fano法についてはほとんど(1冊の)教科書だけから学んだ。P
KZIPの暗号化の方法は排他的論理和ではなくもっと安全なものである。.ZI
Pファイルフォーマットはパブリックドメインである。SEAのARCは署名が1
バイトしかないがPKZIPは4バイトもある。アーカイブファイルの最初の1バ
イトが化ければARCフォーマットでは読めなくなる。独立なサードパーティに、
ファイル化けに対する抵抗力を試してもらいたい。
 また、南アフリカ産のZEBRAという圧縮ソフトがあって、LHARCより圧
縮比が良い、ただしCで書かれていることによるオーバヘッドがある、という話題
も出ました。
#1260/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/ 2  15: 0  ( 30)
いろいろ/奥村
★内容
 CompuServeで最近の日本でのことを書いたところ返事が2通あり。

 クリスチャンセン氏からの返事:
 LHARCもいいが遅すぎる。もう少し速くならないか。ところで、ディスクを
FATを含めて圧縮する「copydisk」というのはできないか。

 エルズワース氏からの返事:
 2パスにすれば解凍はずっと速くなろうが、表を付けねばならない。シャノン・
ファノが(ハフマンのように)最適でないということは疑問である。ZIPのα版
がその証拠。算術圧縮はなんとか速くならぬものか。(LDARCのような)差分
圧縮は非常に興味がある。PAKにもそのような機能がある(エルズワース氏は私
の言ったことをバージョン管理機能と間違えているらしい)。

 話は変わりますが、ダイナミックハフマンについて。スライディング辞書圧縮が
だんだん速くなるにつれて、一致長の上限はもう少し増やしたいところ。しかし、
これでは一致長の大きいところで統計が少なすぎてハフマンで縮まりにくくなる。
したがって、一致長が大きいところでは幾つかをまとめて頻度を求めた方がよいと
思います。最も簡単には、例えば16バイト以上の一致は同じ符号にして、続く数
ビットで一致長を表せばいいでしょう。やってみましたが、微々たる違いでした。

 お恥ずかしいことですが、ROM男さんに指摘されるまで、私はMS−DOSの
ファイル比較ユーティリティFCのアスキーモードでの動作を知りませんでした。
要するにUNIXのdiffそのものでした。この出力と旧ファイルとを読み込ん
で新ファイルを復元するnewというPDSもあるとのことです。
 しかし、残念ながらFCは行単位で働き、バイナリモードでは単なるパッチをあ
てた部分を見つけるくらいにしか使えないようです。バイナリファイルについても
新旧バージョンの違いを見つけてその情報をなるべく少ないビット数で出力するよ
うなものがあればよいのですが。

 NIFTYでもあれから何も新情報は入りません。

いよいよ今の LHA のアルゴリズムが私の頭の中ではっきり形をとりはじめます。 しかしコーディングする暇がありません。

#1261/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/ 2  17:49  ( 27)
擬似2パスハフマン圧縮/奥村
★内容
 2パスは速い、しかしフロッピーディスク使用の場合はI/Oが遅い。
 この問題を解決するために、内部に例えば32Kないし64Kバイトのバッファ
を設けることを考えました。
 まず、圧縮の1パス目は、スライディング辞書圧縮します。最長一致は256バ
イトくらいにしておきます。こうすれば、1文字送出か一致発見かで1ビット、続
いて文字自体か一致長を8ビットにできます。一致長に続いて12ビットで一致位
置を表します。これらは、中間ファイルに出力する代わりに、内部バッファに入れ
て行きます。同時に、1文字(256種類)+一致長(256種類)=512種類
の「文字」について、頻度を数えていきます。
 内部バッファがいっぱいになったなら、2パス目に移ります。512種類の「文
字」は古典的なハフマン圧縮をします。表は、この前ポストしたCのソースの流儀
で出力します。あの方式では、実際に使われた「文字」だけについてハフマン木を
出力するので、小さいファイルではそれなりに小さい表になります。また、一致位
置はLZHUF方式の可変長コードで出力します。
 中規模のファイルなら、これだけで終わってしまいます。
 大きいファイルについては、上記のことを繰り返します。その際、ハフマン木は
内部バッファ一杯分ごとに新しく作ってもよいし、最初の数十Kバイト分(これは
1パス後の大きさ。圧縮前の大きさにして100Kバイトにもなるかもしれない)
での頻度分布がその後も続くと仮定して、以前のハフマン木を流用してもかまいま
せん。後者の方法なら、木は1回の送出ですみます。
 復元は、最初に木があるので、1パスでできます。これは大変高速です。
 細かい改良点として、「文字」は512種類では多すぎるので、例えば16バイ
ト以上の一致は一括して1つの「文字」で表し、“一致文字数−16−THRES
HOLD”を次の7ビット(例えば)で送ってもよいと思います。この方が、最初
に送る木の大きさが減ります。
 こういうもののプロトタイプを作ろうとずっと考えているのですが、なかなか手
がまわりません。どなたかやってみませんか。
#1269/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/ 3  19:26  ( 21)
CompuServeより/奥村
★内容
 差分圧縮を誤解した向きもあったので再度いろいろ説明したところ次の返事あり。

アーブ・ホフより:
 ディスクまるごと圧縮ならFASTBACKというのがあるよ。

グラント・エルズワースより:
 2パスにすれば圧縮比も良くなるだろう。差分圧縮は、ちゃんと管理された事後
保全の一環として行うのでなければかえって混乱をもたらすのでは?

アーブ・ホフより:
 米国ではSEAがARCという名前を登録商標にしてしまった。ARCを含む名
前をつけると法的に問題になる可能性があるし、それに.ARCという拡張子をも
たない圧縮ファイルを作るプログラムがARCを含む名前を持つことは混乱につな
がる。われわれが初めてLHARCという名を目にしたときは、.ARCファイル
を作る新しいプログラムかと思った。多くの人がこのように思い込んでしまった。
名前としてはLHARCでなく単にLHとするだけで十分であり、この方が一般に
受け入れられやすいであろう。いずれにせよLHARC113Cはほとんどの人が
LHとリネームしてしまったし、CompuServeのファイル名は6文字に限
られているのだから、LH113C.EXEなら6文字でちょうどいい。いずれに
せよ、速度が現在最も重要視されている。PKZIP1.0はLHARCの2倍の
速さだが、それでもPKPAKの半分の速さしかない。

NIFTY ではバイナリ差分プログラムがやっと完成します。

#1274/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/ 5   5:52  (  7)
LDARCをポストしました/奥村
★内容
 以下はNIFTYからダウンロードしたLDARCです。回線が悪いのか自作ソ
フトが悪いのか、あいかわらず10ブロックに1回はチェックサムエラーが起きる
という感じで心配でしたが、比較的小さいファイルのため、なんとか読むことがで
きました。NIFTYでちゃんとXMODEMで読めたのはこれが初めてかな。
 LZHUF4.CとLZHUF5.Cの差分ファイルを作ってみましたが、たっ
たの304バイト。すばらしいものです。これでバージョンアップのたびに長いフ
ァイルをアップロード/ダウンロードする手間がはぶけます。三木さんに脱帽!
#1297/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/ 9   6: 7  ( 25)
CompuServeより/奥村
★内容
以下は前回のアクセス時以降にポストされた全メッセージの要約。
jeff clough:
 Autorunは危険と思う。
Irv Hoff:
 LHARCでは改善されている。LHARCのsfxは1300弱増える程度だ
がPKZIP1.0(8月1日に出る予定)では15480バイトも増え、aut
orunはできない。しかしLHARCより2倍ほど速く、圧縮比も1%ほど良い。
LHARCが今の3〜5倍速くなれば無敵なのだが。
Bob Tolz:
 SEAがARCの商標権を得たとは知らなかった。
Irv Hoff:
 ARC商標権獲得はSEAのヘンダーソン自身が6月18日のオンライン会議で
明らかにした。
K.OKUBO:
 法律家がarcのネーミングについてどう言うか聞いてみたい。日本では商標に
関する訴訟が多い。
Irv Hoff:
 ポピュラーなプログラムの名は2文字で十分である。スーパーディレクトリSD
を見よ。いずれにせよ多数の人がLHARC.EXEからLH.EXEにリネーム
しているようだ。SEAの登録商標ARCを避ける手でもある。
John Jurewicz:
 差分圧縮プログラムはあるか?
K.OKUBO:
 三木氏のLDARCというのができた。またしてもARCが付く。適当に改名さ
れたい。三木氏にLDではどうかと聞いてみよう。

7月10日には MASSAN さんが LHarc の名前が問題になるのなら LHa はどうかと提案されています。チベット語で神様のことだそうです。

#1312/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/11   5:58  ( 26)
CompuServeより/奥村
★内容

Grant Ellsworth:
 PKZIP1.0はLZHUFより圧縮比が良いこともあるが平均すると多少悪
い。良い場合も、一致長のためではない。PKによれば一致長は64を超えない。
しかし最小一致は3でなく2である。大きなファイルでは適応型ハフマンは2パス
ハフマンより悪い。PKZIP1.0は8Kの窓を使うので10K以上のファイル
ではLZHUFより良い。頻度の差が大きいときはハフマンよりシャノン・ファノ
が良い。

Steve Burg (PKWARE社):
 エルズワース氏の言ってくれたことでだいたいよい。ただ、バイナリファイルで
は最小一致長は2で辞書は4Kである。8K辞書を使う場合は最小一致長は3であ
る。最大一致長は元は各66、67であったが、後に1バイト付け加えたため25
6だけ増した。これで圧縮は若干良くなった。LHARCよりずっと圧縮比が良い
場合には主に8K辞書が効いている。ハフマンとシャノン・ファノの違いはほとん
ど見られなかったが、解凍は後者の方がずっと速く、表の格納も効率的にできる。
さらに一種の最適経路(オプティマル・パス)アルゴリズムでリテラル(文字をそ
のまま送る)とコピー(一致位置・長さを送る)のどちらを選ぶか決めていること
も圧縮に若干効いている。PKZIPの高速化にあたっていつもこの最適経路アル
ゴリズムに手を加えており、そのためベータテスト版より圧縮比は若干良くなって
いる。[奥村注:どういうアルゴリズムかは全く不明]

John Jurewicz:
 大久保教授がもうすぐ三木氏のLDARCをCompuServeにアップロー
ドしてくれるとのこと。“−arc”命名問題がエスカレートしてPK論争の再現
となり彼ら紳士たちに職業的・個人的支障をもたらさぬよう切に望む。
#1321/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/13   0:29  ( 38)
diffのアルゴリズムと差分圧縮/奥村
★内容
 CACM(Communications of the ACM)は日本でい
えば情報処理学会にあたる米国のACM(Association for
Computing Machinery)が出しているあまり肩のこらない専門
誌です。この最新号(といっても6月号。航空便にしてもらっていないので1〜2
か月遅れで到着する)にdiffのアルゴリズムが載っていました。diffは
Unixのfile difference utility(2つのファイルの
比較をする小道具プログラム)です。もっともこの記事はdiffのアルゴリズム
の解説が主体なのではなくLiterate Programmingと題して
Knuthの文芸的プログラミング手法を解説したものでその例題としてdiff
のなかのさわりの部分を簡略化したもののソースコードを載せているだけです。そ
れに文芸的プログラミングの解説としてもいささかかたよった記事なのであまりお
すすめできません。しかし、これでなんとかdiffの考え方が解読できました。
目的はもちろん、三木さんがldiffで実現しようとしている
differential encoding(差分圧縮)のよりよいアルゴリズ
ムを考えるためです(差分は本当はdifferenceで、
differentialとすると微分の意味になってしまうのですが、情報処理
関係では差分の形容詞形としてdifferentialを使うようです)。
 前置きが長くなりましたが、この記事による限り、diffのアルゴリズムは次
のようになっています。
 まず、旧ファイル、新ファイルをスキャンして、そのすべての行を(2分木なり
ハッシュ表なりを使って)登録します。その際、全く同じ行のダブりを検出できま
すが、旧ファイルと新ファイルにおのおの1回だけ現れる行をマークします。あと
は、このマークした行を核として前後の行を次々に調べていけば、変わっていない
ブロックがマークされることになります。結局、違いのある行だけが残ることにな
ります。
 このアルゴリズムは、ファイルが行という自然な単位で構成されていることを利
用しているので、このままではバイナリファイルには使えません。バイナリファイ
ルに適用するためには、少なくとも一方のファイルについては、すべての場所から
始まる一定長さのバイト列を登録しなければなりません。
 そこで、例えば旧ファイルについては0〜N−1、N〜2N−1、……のように
Nバイトずつに区切って表または木に登録し、次に新ファイルについてはすべての
位置から始まる文字列をこの表または木と照合して、一致が見られたら、さらに逆
方向と順方向に、こんどはNバイト単位ではなく1バイト単位でたどっていって、
正確にどのバイトからどのバイトまでが一致するかを調べる、ということが考えら
れます。
 この方法では最悪の場合2N−2バイトの一致が検出できないことがあります。
しかし、プログラムの改訂作業では、かなり長いブロックがそのまま残りますので、
この方法でも十分有効かもしれません。

このあたりで圧縮で U.S. Patent がとられているというニュースが入ってきます。

#1323/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/14   6: 3  (  4)
それは大変/奥村
★内容
 そんなものにPATENTをやるくらい米国PATENT OFFICEも
落ちたのでしょうか。Karmarkar法だとかFast Hartley
Transformだとかも。
 われわれもLARC、LHARCにパテントとりましょうか。

もちろんこの最後の部分は冗談で,パテントを維持するような財源はありません。

そうこうしているうちに,このパテントの MWS 法の PL/I ソースを入手して解読しました。

#1340/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/17  18: 3  ( 48)
MWS法解説/奥村
★内容
 これはStorerの本でいうID−LRU法のことだと思います。
 IDとはidentity heuristic、つまり前回の一致文字列と今
回の一致文字列をつないだ文字列を新たに辞書に登録するものです。辞書要素は1
〜4096の番号がついています。すべての1文字は最初から辞書の1〜256番
の要素として登録されています。LRUとはleast recently
used、つまり辞書が一杯になったら古いものから消していくことの意です。
 例えば次のようなテキストを圧縮するとします。
    THE_CAT_AT_THE_CAR_ATE_THE_RAT
 すると結果は次のようになります。

Matched    85: T
Matched    73: H
Inserted  257: TH
Matched    70: E
Inserted  258: HE
Matched    96: _
Inserted  259: E_
Matched    68: C
Inserted  260: _C
Matched    66: A
Inserted  261: CA
Matched    85: T
Inserted  262: AT
Matched    96: _
Inserted  263: T_
Matched   262: AT
Inserted  264: _AT
Matched    96: _
Inserted  265: AT_
Matched   257: TH
    ....

 一致した辞書要素の番号を出力します。したがって、圧縮されたファイルは
    85 73 70 96 68 66 85 96 262 96 257 ...
のようになります。ちなみに、前回アップしたSQUEEZE.CはAP−LRU
法、すなわちall−prefix heuristicを使っています。これは
前回の一致がTHE_で今回の一致がCATなら辞書には
  THE_C  THE_CA  THE_CAT
の3つを登録するというものです。ちなみにID_LRU法ではTHE_CATし
か登録しません。
 Storerによれば、AP法のほうが速く辞書を膨らませるが、ID法のほう
が辞書をけちって使うので長いファイルでは有効だということです。
 もちろんこのMWS法のプログラムは概念を説明するためだけのもので、実際に
はtrieにハッシュ法を使って高速化するものと思います。
 圧縮比を改選するには、辞書の小さいうちは少ないビット数を送るとか、ハフマ
ン法と組み合わせるとか、あるいは辞書のすべての要素を葉としてsplay木を
作ってそれでさらに圧縮するとか、いろいろ考えられそうです。ただし最初のもの
を除いてこれらのアイデアはあまり有効とは考えられませんが。

三木さんの LDIFF は, 三木さんがなかなかソースを見せてくれないという不満もあり, 自分でコーディングしてみることにしました。

#1349/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/19   6:20  ( 37)
簡略版バイナリ差分BDIFF/奥村
★内容
 三木さんのLDIFFのマネですが、遅いことは天下一品です。たった今完成し
たばかりで、バグがある可能性があります。メモリもこんなに使う必要はありませ
ん。そのうちちゃんとした版をアップします(期待しないでください)。
……略……

いくつかのバージョンをアップロードした末,名前を bd にしてしまいました。

#1352/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/19  19:59  ( 47)
差分圧縮ちゃんと直しました/奥村
★内容
 まともに書き直しました。すみません。混乱しないように名前はbdとしました。
ところで、どういうわけか前回の急遽取り下げたものは三木さんのldiffと同
等の圧縮比にしかなりませんが、これならそれよりさらに縮みます。どういうわけ
でしょうか。まさか三木さんが偶然私と同じヘマをしているとは思えませんので別
の原因でしょうが。どういうヘマかというと、コピーの後はリテラル、リテラルの
後はコピーと仮定してしまったのです。そんなことちっともないんですが、油断を
するととんでもない間違いをしがちです。ただし、リテラルの後はコピーというの
はこのプログラムについては正しいので、その部分だけ生かして、つまり最初にア
ップしたものと2回目の取り下げ版とを足して2で割ったようなものがこれです。
 三木さんのプログラム読まれた方は解説して下さい。昔はこれでもZ80の機械
語をハンドアセンブルした世代なのですが今はアセンブラ見ると頭痛くなる。

PKZIP 1.0 は Shannon-Fano 法を使っているようです。

#1374/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/27   6: 0  (  3)
シャノン・ファノが……/奥村
★内容
木を格納するのに便利だというわけではなさそうです。じつをいうとなぜハフマン
でなくシャノン・ファノにしたかは今もって謎です。ご本人(PK)もあまり違いが
よくわかってないんじゃないかと思います。

バイナリ diff のほうもだんだん進んできます。

#1375/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/27  17:40  ( 51)
新バイナリdiff/奥村
★内容
【アルゴリズムの概略】
 新ファイルの各文字から始まる文字列について、旧ファイル(64K未満)と比
較し、5文字以上の一致が見つかったなら、その長さ・位置を出力する。見つから
なかったなら、5文字以上の一致が見つかるまで次々に文字列を比較し、5文字以
上の一致が見つかった時点で、一致しなかった文字の個数と文字列そのものを出力
してから、一致の長さ、位置を出力する。出力はバイト単位で、圧縮はしていない
ため、LHARCでさらに圧縮できる。評価版のため、速度は考慮していない。実
際には木を使うためずっと速くなる。64K未満用。
【アルゴリズムの詳細】
 以下のソースコードを見て下さい。
【性能比較】
  BD2.EXE (22091 bytes) - BD1.EXE (21661 bytes)
    LDIFF: 5810 bytes  BD: 4623 bytes
 EXEファイルではBDの方がかなり小さくなる。

LHarc の偽物 ICE というのが米国で出回ります。 それと同時に PAK というシェアウェアも出現します。

#1391/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/30   6:33  ( 10)
CompuServeより/奥村
★内容
 LHARCより「faster and better」をうたい文句にPAK
2.0が出た。確かに速いが圧縮比はほとんど変わらない。SFXは8.5K。こ
れは$15のシェアウェア。フルスクリーン版PAKFは$30。圧縮ルーチンの
ライブラリのようなものも売り出す。
 ICEというのはLHARCと同サイズで単にバイナリをエディットした悪質な
もの。説明書きに「LHARCから改名しました」などとも。しかしこの名前はな
かなかしゃれているとの評判。

 追伸:これを書いてここにきたらもうPAKが……。大久保先生どうもありが
とうございます。

新 LZ + Huffman は吉崎氏と競争でコーディングします。

#1393/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/30  15: 7  ( 93)
奥村版静的ハフマン+LZ
★内容
 やっとバグが取れたようなのでとりあえず送ります。これから吉崎さんのを勉強
させていただきます。アルゴリズムは、できるだけ大きいバッファをメモリ上に確
保しておき、1パス目はメモリに書き出します。なるべく速くするためにメモリの
アクセスがなるべくバイト単位になるようにします。バッファがいっぱいになった
らそれをスタティックハフマンで圧縮して出します。表はあまり効率的でなく、使
った文字の種類×10(ないし11)ビット程度だと思います(あまりよく考えて
いない)。2回目にバッファを使うときからは、以前送りだした表を流用した方が
新たに表を送るより効率的な場合は、以前の表で流用するようにしました。圧縮比
の方は、ダイナミックハフマンの方が良い場合と悪い場合があります。木の大きさ
が文字種類にほぼ比例するため、長い一致はまとめて数えています。どちらの方が
良いかは一概にはいえないようです。木の送り方も含めて検討の要があるかもしれ
ません。
 解凍の速さはやはりスタティックハフマンならではです。まだ木をいちいち下り
ながら解凍していますが、表を引くようにすればもっともっと速くなりそうです。

同じアイデアで出発しているのですが, ちょっとしたコーディングで違いが出ています。

#1394/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/30  16: 2  ( 11)
実験結果
★内容
               吉崎版   奥村版1  奥村版2
完成品(.EXE)の大きさ 21924 19726 19726
パソコン通信ログ39023→22595 22569 22583
Cソースコード 12853→ 4472  4458  4464
コマンド.コム 24161→15378 15361 15364
FC.EXE  14530→ 9292  9274  9278
 *奥村版1は16文字以上の一致はまとめて数える方式
 *奥村版の最大一致長はF=256
 *TC2.0(IBMPC版ラージモデル)でコンパイル
 *圧縮後の大きさは表示値でなく実測値(吉崎版では4バイト異なる)
吉崎版の中身をまだよく見ていないので、この差が何に起因するか定かでありません。
#1396/1982 計算機と算法
★タイトル (SCIENCE )  89/ 7/30  19:24  ( 70)
圧縮の算法
★内容
 吉崎さんの算譜でも勉強しようと思いましたが、やはり別の人の書いた算譜を読
むのは一苦労です。
 中座していたアルゴリズム事典の第2版にでもとりかかろうかとも思ったのです
が、何日か前の自分は他人であるとのことばもあるように、何日かたてば自分の書
いた算譜を理解するのに苦しむ羽目になるかもしれないので、算法をまとめておく
ことにしました。

 まず、圧縮すべきファイルはリングバッファに読み込んで、現在の位置より40
96文字前から1文字前で始まる4095種類の文字列と比較し、現在の位置で始
まる文字列と最も長く一致する部分を見つけます。3バイト以上の一致が見つから
なかったならば、現在位置の文字をcとして、EncodeChunk(c,0)
と唱えます。p+1文字前で始まるc+3バイトと一致するならEncodeCh
unk(256+c,p)と唱えます(c≧0、p≧0)。すると、Encode
Chunk関数が後を引き受けてくれます。
 EncodeChunk(c,p)という関数は、自分が呼び出された回数とc
の度数分布を数えると同時に、(c,p)の組を、できるだけ詰めて(しかもでき
るだけバイト単位になるようにして)内部のバッファ(64Kほどの大きさ)に貯
め込みます。
 バッファがいっぱいになると、度数分布をもとにして、ハフマン木を作ります。
 そして、いよいよ本当の出力が始まります。
 まず、呼び出された回数(これをブロック長と呼びます)を16ビットで書き出
します。次に、1ビットで、ハフマン木を送出するか否かを書き出します。このビ
ットが「1」なら、次にはハフマン木があります。「0」なら、ありません。ハフ
マン木がない場合は、前回に受け取ったハフマン木を継続使用することになります。
ですから、初回はハフマン木があるのが普通ですが、もし全くなければ、こちらで
定めた最も平均的なハフマン木を使うことになるでしょう(この辺はまだ考えてい
ません。英語については文字の出現確率の統計がいろんな本に載っています)。
 木をどういう形式で出力するかは後で述べます。
 さて、木のあとは、バッファの中身の(c,p)ペアの一つ一つについて、cの
部分は上に述べた木を使ってハフマン圧縮し、pの部分は適当な可変長プリフィッ
クスコードで圧縮し、どんどん送り出します。(c,p)ペアの個数はすでに「ブ
ロック長」として送りだしてあるので、受け手はブロックの終わりを知ることがで
きます。
 このようなブロックの連続が圧縮ファイルの中身です。
 ブロック長が0になっていたら、そこで圧縮ファイルが終わります。
 さて、木の送り出し方ですが、最初に木を構成するときに、左の子が非葉で右の
子が葉となる節があれば、左右を取り替えておきます。すると、任意の節から下を
見ると、左右とも葉、左右とも非葉、左が葉で右が非葉の3通りに分類されます。
この最後の場合が最も多いので、このような節は1ビット「0」で表します。左右
とも葉の節は2ビット「10」、左右とも非葉の節は2ビット「11」で表します。
このようにすると、根も含めた非葉はすべて1〜2ビットで表せます。葉そのもの
は(c,p)ペアのcを表すわけですが、このcの可能な値の数がふつうは512
通り以下ですので、9ビットで送り出せます。根も含めた非葉節の数は葉の数より
1個少ないので、木全体は文字の種類×(10ないし11)ビットで表せます。た
いへん複雑なように聞こえますが、実際は手続きWriteTree()の再帰的
呼出しによりとても小さくきれいな算譜になります。葉を受け取る関数ReadT
ree()も同様に再帰的な美しい関数です。
 ハフマン木の構成法自体はここで述べる余裕がありませんが、ソーティングは使
わず、優先待ち行列(priority queue)というものをヒープ(メモ
リ領域のことではなくヒープソートのヒープ)で実現したものを使いました。最も
頻度の小さい2つの節を取り出しては新しい節を登録するというハフマン木の構成
法にとてもマッチした算法だと思います。
 さて、文字の種類×(10ないし11)ビットはまだ大きすぎるでしょうか。英
語のようにスペースからzまで限られた文字しか使わない場合にはこれでもけっこ
う小さくなります。また、ファイルが小さいなら、文字種類はファイルの大きさを
超えられませんので、表自体もファイルに見合って小さくなります。
 符号語のビット数の上限をたとえば16に制限したならば、4ビット×(文字種
類の上限)で表を表すことも可能です。PKはさらに同じビット数の符号が何文字
も続くことが多いのに注目して、4ビットで繰返しの数を表しているようです。し
かし、アスキーコード順に並べた場合に符号語のビット数が同じものが連続してい
くつも現れるというのもむしろ不思議なことで、繰返しの数はむしろ4ビットに固
定せず可変長コードにするのが自然でしょうか。このあたりはもっと実験が必要で
しょう。あまり工夫すると泥臭くなり、自己解凍ファイルの大きさも増えるでしょ
うね。
 私の算譜はやっとバグがとれたてのもので、速さはもっともっと速くなるものと
思います。

 以下はオンライン。ROM男さん、どうも。いまちょっと読んだかぎりではあま
りピンとこなかったので、オフラインでじっくり考えてみます。よかったらもっと
具体的に教えてください。

CompuServe でも新 LHA への期待が高まっています。

#1400/1982 計算機と算法
★タイトル (SCIENCE )  89/ 8/ 1   6:26  (  5)
CompuServeより/奥村
★内容
 たくさんの意見の要約:
 ICEはおもしろい名前だが、実際はLHICEとして登録されている。これを
読むとliceつまりシラミに聞こえる。LHARCは絶対LHICEと改名しな
い方がよい。LHという意見が有力で、LZHというのもあった。拡張子は混乱を
防ぐため「.LZH」のままがよいということ。

8月4日には,符号長を16ビットに制限した Huffman 符号化ルーチンが完成します。

8月5日には,PK に倣って lazy evaluation を実装します。

#1405/1982 計算機と算法
★タイトル (SCIENCE )  89/ 8/ 5   9: 5  ( 55)
圧縮>スライド辞書部改良版/奥村
★内容
 PKに倣って1文字先読みにより圧縮比を改善したものです。またまたすごくな
りました。時間は(腹時計ですが)変わらないみたいです。残る仕事はいろんなパ
ラメータの調整です。例えば清適は不満の文字数N1が今は270になっていたと
思いますがあのへんはいじれますし、最大一致長が今は256になっていましたが
もっと長くしても時間はあまり変わらないでしょうから長くしてみるとか、ファイ
ルによってはリングバッファを8Kにしてみるとか、2パスハフマンの1パス目を
いれておくバッファを残メモリに応じて大きくするような工夫をするとか、1バッ
ファ分終わったら次に必ず木を再計算するかそれとも最初に作った木を繰り返し用
いるかそれとも木を作ってみてからどちらが徳か考えてみるようにするとか、いろ
いろ変形が考えられます。これで数キロバイト未満のファイルならダイナミックハ
フマン、それ以上(あるいは解凍時間を短縮するスイッチを指定する)なら静的ハ
フマンというように使い分け、あとは吉崎さんが最適なアセンブリコードを書いて
くださったなら、PKZIPなどには負けません。なお、私のコードはろくにテス
トしていないのでバグがいたり無駄な部分がある可能性が大きいのでどなたか読み
直してチェックしてください。米国のユーザも新LHに期待しています。
#1415/1982 計算機と算法
★タイトル (SCIENCE )  89/ 8/ 7   6:39  (  3)
ついでにNIFでは……/奥村
★内容
 吉崎さんが広範囲のファイル(何百?)にわたってLHARC,静的ハフマン、
だいなみっくはふまんについて比較してくださいました。やはり表の分だけ静的
ハフマンの方が大きくなる傾向のようです。残念。

われわれの bdiff と同じものを別の人が作っておられたことがわかりました。 これが現在流布している bdiff,bupdate です。

#1417/1982 計算機と算法
★タイトル (EUF07245)  89/ 8/ 7  19:27  (  3)
BDIFF>今PIGに行ってびっくり/奥村
★内容
 PSHさんがわれわれと同じ構想のその名もBDIFFというのを作られている
ではありませんか。同じような発明が同時に複数起こるとはよくあることですが、
おもしろいと思いました。
#1419/1982 計算機と算法
★タイトル (SCIENCE )  89/ 8/ 8   2:13  ( 14)
PKZIP1.0、BDIFF/奥村
★内容
 PKZIP1.0は20Kまでのコメント(テロップ?)が可能で、たとえば
PKZIP −z zipfile <HI.TXT とすれば HI.TXT
がコメントになるという。また、キーボードの配置を変えるような悪質ANSI
コメントはフィルタできるとのこと。
 話は変わるがPSHさんのBDIFFは8バイトかなんか単位でファイルを比
較し、それが何%か一致していれば同期がとれていると見るというものらしい。
そのためLDIFFより速い。出力コードには0が多くLHarcにはかかりや
すいとのこと。テキストファイルはあまり小さくならないのでバイナリ用にチュ
ーンしてあるようだ。LDIFFの方が圧縮比はずっと良いようだ。
 なお、PSHさん自身はLDIFFを知っているはずとのこと。だから偶然同
じアイデアが浮かんだということでもないらしい。
 BDIFFはMIXのV.C.でバージョンアップをしており、V.C.では
VZの98版→J3100版の差分をBDIFFで発表しているとのこと。
 どうやら差分圧縮は2つのスタンダードができてしまったようですね。
#1429/1982 計算機と算法
★タイトル (SCIENCE )  89/ 8/19   6:15  (  9)
PKZIPのリリース/奥村
★内容
 1.0版は8月21日から始まる週にはregistered usersに
送り始められるであろうとのこと。これはPhil自身のメッセージ。しかしこの
1日前にPK社に電話した人は社員から「9月1日前は無理」と聞いたという話も
あり、まだあまりはっきりしない。
 LH(arc)とどっちが先に出るか関心の的になっている。

 NIFTYでは吉崎さんがいま新LHをアセンブラで書いている途中とのことで
す。まだ何も現れません。PKZIPとどちらが早いか。
 アルゴリズムの提案はもうありませんか。
#1440/1982 計算機と算法
★タイトル (SCIENCE )  89/ 8/26   6:11  ( 17)
PKZIP1.01出来/奥村
★内容
 Compuserveはこのニュースでにぎわっていました。OS/2版も出た
ようです。
 ある人は100ほどあるLZHファイルをZIPに変換したがほとんどのものは
かえって大きくなった(数百バイトほど)と言っています。
 別の人は4MBほどのLZHをZIPに変換したがLZHよりかなり小さくなり、
特に速さはすばらしいとのこと。
 493Kの画像ファイルをZIPで圧縮した人によれば、2分35秒かかって
78KにしかならなかったがLHARCでは1分20秒で76Kになるとのこと。
PK社の人によればPKZIPはLHARCよりずっと長い最大一致長なのでファ
イルによっては非常に時間がかかる。
 PKZIPの配布版自体はPKZIPで圧縮した場合より小さくなっているが、
これはPKZIP自体は1パスだが別に2パスのオプティマイザを開発しており、
それを使ったとのこと。これで圧縮比が1−3%改善される。PKZIPの次の版
は2パスになるかもしれない。

 追伸:もう日本にも上陸しているらしいです。早いですね。さっそくどこかで
見つけてこよう。

新 LHA の実験は遅々として進みません。

この年(1989年)の10月6日には,Stac 社の Whiting 特許(米国特許 5,003,307)が出願されています(特許成立は1991年3月26日)。


リンクはご自由にどうぞ。

松阪大学 奥村晴彦 okumura@matsusaka-u.ac.jp

Last modified: Mon Feb 8 10:06:03 1999