(←back)

スリー・ギャップ定理と黄金比

円の上に点をいくつも一定の向きに打ってゆくとする。点は直前に打った点と必ず一定の間隔で離れている。すると、円は点によっていくつもの円弧に分割される。ここではそれを円分割と呼ぶことにする。

円分割において現れる円弧の長さにはどのような法則があるだろうか。そして、最も偏りの少ない点の配置になるのは点を打つ間隔がどんな長さのときだろうか。前者に関してはユークリッドの互除法が、後者に関しては黄金比が、密接に関係してくる。

定義1(点間隔)

点を打ってゆく間隔を点間隔と呼ぶ。点間隔の長さは円周上の距離で測る。点間隔は円周の長さを超えず、ゼロではない。

定義2(始点・終点)

最初の点を始点、最後の点を終点という。点は打った順に番号が付けられている。始点の番号はゼロである。

定義3(正の向き・負の向き)

時計回りか反時計回りのどちらかを正の向きとし、その逆回りを負の向きとする。正の向きに点を打ってゆく。

定義4(端点)

円弧の両端の点を端点という。

定義5(分割)

円弧が自身の端点以外の点によって二つに分けられることを円弧の分割という。

定義6(ギャップ)

一度も分割されていない円弧をギャップという。

定義7(正余白・負余白)

始点を端点に持つ二つのギャップのうち、正の向き側のものを正余白、負の向き側のものを負余白と呼ぶ。

定義8(合余白)

終点を端点に持つ二つのギャップからなる円弧を合余白と呼ぶ。合余白はギャップではない。

定義9(親・子)

始点を端点に持たない任意の円弧に対して、二つの端点の番号が共に1だけ少ない円弧が二つあることになるが、正の向きに点間隔だけ回転移動して重なる方の円弧を、もとの円弧の親、あるいは親円弧という。親の逆を子という。

定理1

終点以外の点は、ギャップの親を分割しえない。

[証明]

もし終点以外の点が親円弧を分割しているなら、その次の点が存在し、回転移動の関係により子円弧を分割しているはずである。ゆえに、子円弧がギャップである限り、親円弧は終点以外の点によって分割されない。

定理1の系

ギャップの親は、ギャップもしくは合余白である。

定義10(先祖・子孫)

親円弧の親円弧といくつもたどったものを先祖という。逆の関係のものを子孫という。

定理2(スリー・ギャップ定理)

いくつの点を打とうとも、同時に存在するギャップの長さは高々三つしかない。正余白の長さ、負余白の長さ、合余白の長さ、この三つである。

[証明]

任意のギャップをaとする。

ギャップaの先祖を、それがギャップであり続ける限りにおいて、たどれなくなるまでたどる。定理1の系により、合余白にたどり着くか、あるいは、二つの端点どちらかの番号がゼロになって、それ以上たどれなくなる。

前者の場合、子孫のギャップaは合余白と長さが等しい。なぜなら親円弧の定義より、ここでのたどり方において円弧の長さは変わらないからである。

後者の場合、正余白または負余白にたどり着いたのである。子孫のギャップaはそれらのどちらかと長さが等しいということである。

ところで、ギャップaは任意であった。したがって、定理の主張が成り立つ。

定理3

終点は、合余白を正余白の長さと負余白の長さに分割し、かつ、正の向きに見てこの順で内分する。

[証明]

合余白においては、終点を二つの端点が挟んでいる。そこで、正の向きにたどって、最初にある方をA点、最後にある方をB点と名付ける。ここで当然、A点とB点の番号は終点のそれより若い。

よって、A点と終点の番号から数が1ずつ引かれるなら、A点が先にゼロになる。ゆえに、A点と終点を二つの端点とするギャップは、その先祖をたどったとき、正余白に行き着かねばならない。番号のより大きい端点が残りの端点に対して常に正の向き側にあるからである。

同様の論法によって、終点とB点を二つの端点とするギャップは負余白を先祖としなければならない。

ただし、合余白に行き着かなければの話だが、実際にそれはありえない。部分と全体の関係なので明らかに長さが異なるからである。

定理4

円分割における点は、一つ増えるたびにギャップを一つ分割するか、他の点に重なるかのどちらかだが、このとき次のことが言える。初めの分割を除いて、分割の片方の長さは常に既存の長さである。

[証明]

分割はすべて終点が引き起こし、また、定理3より、分割は正余白と負余白の長さである。そして、正余白と負余白の少なくとも一方は新たに誕生したものではない。なぜなら、終点は一つしかないので、正余白と負余白を同時に分割することはできないからである。

これは、最初の分割の場合、全体を正余白と負余白に分割することになるので、例外となる。

定理5

ギャップに長さの違いがあるとき、最も長いギャップがまず分割される。

[証明]

三つの長さがあるときは、合余白と等しい長さのギャップが存在している。定理2の証明から分かるように、その先祖は合余白で、合余白は現在の終点によって分割されている。ゆえに、次に分割されるのは合余白の子供のギャップであり、それは合余白と長さが等しい。

二つの長さのみがあるときは、次の点の位置に関して三つの場合に分けられる。既にある点の上に重なるか、短いギャップを分割するか、長いギャップを分割するか、である。

第一の、新たな点が既存の点に重なる場合は、以下のようにして起こりえないことが示される。

点間隔がαで円周が1のとき、番号iよりも後の番号jの点が番号iの点に重なったとする。jαの小数部はiαの小数部に等しい。ゆえに、jα-iαはjαの整数部からiαの整数部を差し引いたものに等しい。つまり、αはj-i分の1の整数倍となる。したがって、すべての点は、始点からj-i分の1ごとに刻んだj-i個の目盛り上に必ず位置することになる。

さて、まだ一度も点が重なったことがないのであれば、終点の番号をNとして、円はN+1個のギャップに区分されている。ここで、次の番号N+1の点が番号kの点に重なったとしよう。αはN+1-k分の1の整数倍になる。すなわち、すべてのギャップを構成する、言うなれば目盛り間隔は、kが最小でゼロであるから最大でもN+1個しかない。ところが、ここで考えているのはギャップの長さが二種類の場合である。点が重なったのだから長さの種類は変化しない。そして、すでにN+1個のギャップがある。どんなに少なく見積もっても、N+2個の目盛り間隔が必要になる。これは不可能である。

よって、二つの長さのみ存在するときに、点が重なるということは起きない。

第二の、短いギャップが分割される場合は、以下のようにして矛盾する。大きい長さaと小さい長さbがあって、bがさらに長さcとdに分割されたとしよう。定理3より、cとdは正余白の長さと負余白の長さである。もし長さbが残っているのなら、正余白、負余白、合余白の長さのどれでもない長さaがあることになって、定理2に反する。したがって、aが合余白の長さとなるしかない。しかし、aはc+dよりも大きいから、定理3に反する。

ゆえに、第三の、長いギャップが分割される場合に必然的になる。

定理6

円分割の生みだす長さの系列は、正余白と負余白の長さの変化に着目すれば、長さに適用されたユークリッドの互除法のそれと全く同じであり、円分割で同時に存在可能な三つの長さは、互除法の連続する二段階におけるそれぞれの長さの集合の、その和集合になっている。ただしここでいう互除法は、ユークリッドが述べたオリジナルの形の、引き算を繰り返す形式のものである。

[証明]

ここでは、長さa,b,c等の集合を考える。また、長さaのギャップn個の集合をここだけの表記法でnaと表す。

まず、aがbより大きいとして、円分割がaとbの集合をa-bとbの集合に変換することを示す。長さの集合がaとbのみからなる、つまり、長さがaとbのみ存在している円分割の状況とは、長さaのギャップがm個、長さbのギャップがn個あるとして、集合maと集合nbの和集合で表される。以下のように変換されてゆく。 maとnbの和集合、 (m-1)aと1(a-b)と(n+1)bの和集合、 (m-2)aと2(a-b)と(n+2)bの和集合、 (m-3)aと3(a-b)と(n+3)bの和集合、 以下同様で、そして、 1aと(m-1)(a-b)と(n+m-1)bの和集合、 m(a-b)と(n+m)bの和集合。 定理5により、最も大きい長さaのギャップがある限り、そのうちの一つが分割の対象に選ばれる。定理4により、分割の片方の長さはbかa-bだが、どちらを選ぼうとも結果は同じである。それゆえこのようになる。ここで、三つの長さa,a-b,bが現れているが、これらのなす集合は、aとbの集合と、a-bとbの集合との、和集合になっている。

次に、aをbで割った商がqで余りrがゼロでないとして、円分割がaとbの集合をrとbの集合に変換することを示す。以下のように変換されてゆく。 aとbの集合、 a-bとbの集合、 a-2bとbの集合、 a-3bとbの集合、 以下同様で、そして、 a-qbとbの集合。 この最後のものはrとbの集合にほかならない。

rはbより小さいから、定理5により、rとbの集合の場合においてはbが割られる長さである。割られる長さと割る長さの組として考えると、aとbの組をbとrの組に変換していることになる。

余りrがゼロになるときは、0とbの集合までは到り着かずに、直前の段階で長さbのみの集合が得られる。

そして、円分割において長さが一つしかなくなった場合、円は等分されたということである。これがn等分なら、円周を1としたときの点間隔は、分母がnの有理数で表されることになる。よって、打つ点はすべて既存の点に重なるようになり、もはや新しい長さは生まれない。つまり、長さの観点からは停止と見なせる。

ゆえに、円分割はまさにユークリッドの互除法である。

定義11(悪分割)

円分割の分割においては一つのギャップが二つのギャップに分割される。二分されてできるギャップの一方が他方の二倍よりも大きくなる分割を、悪分割という。

補題1

長さに適用されたユークリッドの互除法においては、初めの二つの長さの比が異なれば、導き出される商の系列も異なる。

[証明]

商の系列が一致すれば初めの二つの長さの比も等しいということを示せばよい。それを商の系列の長さに関する数学的帰納法で示す。

長さが1のとき、初めの二つの長さをa,b並びにc,dとして、a=bq,c=dqと表すことができる。ゆえに、a:b=c:d.

長さがnのとき主張が成り立つと仮定する。長さがn+1の場合の第一段階は、a=bq+r,c=dq+sと表すことができる。そして、それぞれの続きにあたるbとrに対する互除法とdとsに対する互除法とで商の系列が一致している。するとこれらは長さnの場合だから、仮定により、b:r=d:s.ゆえに、bq:r=dq:s.ゆえに、(bq+r):bq=(dq+s):dq.ゆえに、(bq+r):b=(dq+s):d.ゆえに、a:b=c:d.よって、長さがn+1のときも主張は成り立つ。

定理7

円分割において点が決して重ならず、かつ、悪分割が起こりえないのは、φ=(1+√)/2,円周を1として、点間隔がφ-1あるいは2-φの場合のみである。

[証明]

定理6より、円分割における長さの系列を、引き算を繰り返す形式の互除法におけるそれと見なすことができる。すると明らかに、悪分割は、減算方式の互除法に特有な「引けるだけ引く」ことが一度の引き算で終わらない場合を、ただし余りがないときのみは二度の引き算でも終わらない場合を、意味している。しかし後者の場合、互除法は停止することになる。すると、定理6の証明で述べたように、打つ点がすべて重なりだす。ゆえに、この場合は除外してよい。したがって定理の条件の下で、悪分割のない円分割を、減算方式でなく除算方式の互除法で考えるなら、互除法のすべての商が1になる場合を意味していることになる。

円周を1として、点間隔αの円分割における最初の分割は、αと1-αへの二分割である。よって、円分割に対応するのは、αと1-αから始まる互除法である。

さて、先ほども触れたようにこの互除法は止まってはならない。

ゆえに、互除法で無限に商1のみが続く場合を考えればよい。ところで、黄金比をなす二つの長さに互除法を適用するとその商の系列で無限に1のみが続くことは、簡単に示すことができる。反対に、そのようになる二つの長さは黄金比をなすもの以外にないことが、補題1より分かる。したがって、黄金比の定義「小なる部分と大なる部分の比が大なる部分と全体の比に等しい」より、αが1-αより大きい場合、(1-α):α=α:1とおける。αが1-αより小さい場合は、α:(1-α)=(1-α):1.これらを個別に解いて定理の二数を得る。

応用

最後の定理7の応用として、φ-1または2-φをハッシュ表のためのハッシュ関数の定数として使う方法があり、フィボナッチ・ハッシュ(Fibonacci hashing)として知られている。ハッシュ表とはコンピュータ・プログラムにおけるデータ構造の一つで、理想的な状況においては、要素数に依存しない定数時間での高速な検索を可能にする。ハッシュ表は通例、配列として実装される。ハッシュ表を使うには、キーから配列の番号を計算するハッシュ関数が必要になる。ハッシュ関数の値をハッシュ値といい、異なるキーに対して同じハッシュ値になることを衝突という。ハッシュ関数は衝突が起きにくいほど望ましい。

フィボナッチ・ハッシュは以下のようなものである。前提として、二進数を基礎にしたコンピュータを使うとし、そのワード長はwであるとする。さらに、ここでは最も簡単な場合として、キーkは負でない整数値で、かつ、そのコンピュータが直接扱える範囲の値であるとする。

まず、黄金数(1+√)/2をφとして、定数aを a=((φ-1)×2)の整数部 あるいは a=((2-φ)×2)の整数部 と定義する。ただし、aが奇数になるようにする。φ-1と2-φは二進数表示の小数点以下の各桁で0と1が逆になっているので、これらの式のどちらかから必ず奇数のaが得られる。

そして、ハッシュ関数hを h(k)=((ak/2)の小数部×2)の整数部 と定義する。始点から正の向きにある点まで測った円周上の距離をその点の位置というとして、「(ak/2)の小数部」が、円周1の円の円分割における番号kの点の位置に相当する。それを2倍して小数を切り捨てて、0から2-1までの整数に変換する。ここで、2はハッシュ表のサイズであり、その限りにおいてdは任意である。つまり、ハッシュ表のサイズは2の累乗でしか変えられない。その見返りとして、関数hの計算に出てくる割り算はシフト演算で代用できることになる。

すなわち、実際は h(k)=a×kをw-dビットだけ右にシフト と計算する。オーバーフローを上手く利用していることに注意(言ってみれば、こちらの式は数学的ではない)。

実は、定数aが奇数でありさえすれば、ここで考えている場合において可能な2個のキーすべてをハッシュするとして、その衝突の総数はdに応じて常に同じであり、かつ、可能な限り少ない――d=wのとき2個のキーが決して衝突せずに2個の位置に再配置されることは、奇数aと2-aの最大公約数が1であることと定理6および定理5から分かり、かつ、ゼロから二つずつに区切った位置は、dが1減ると一つずつの位置にまとめられ、すなわち、それぞれの二つの位置に入っていたキーは衝突することになる――

しかし、たとえばa=1とすると、連続するキーのハッシュ値は連続するか、さもなければ衝突することになる。フィボナッチ・ハッシュの特徴は、連続したキーのハッシュ値がよく分散することであり、このことは定理7から明らかである。これによって、キーが等差数列をなしているとき、分散性――ここでいう分散性は、最も近接している箇所でどれだけ離れているか、の意味であり、つまり、分散性が高ければdを小さくしても衝突が起きにくい――が極端に悪くならないことが保証される。具体的には、公差p,初項qの等差数列をなすn個のキーは、ゼロから連続して並ぶp(n-1)+q+1個のキーがハッシュされて分散する程度の分散性を最低限、保証される。これは、後者の数列は前者の数列を内に含むのだから、自明の理である。

要するに、ゼロから連続する2個のキーすべてをハッシュすると、aが(φ-1)×2か(2-φ)×2であることと、それ以外の奇数であることとで衝突数に違いは表れないのだが、その中からキーを部分的に選んで、なおかつそれらが等差数列をなすようにすると、違いが出てくる。もちろん、前者の方が平均的に性能がよいことが期待できる。そして、人間の作り出したシステムでは、キーが部分的に等差数列をなして分布していることが非常に多いのである。

(←back)
inserted by FC2 system