|
===================================== 〔語彙分解〕的な部分一致の検索結果は以下の通りです。 ・ 循環 : [じゅんかん] 1. (n,vs) circulation 2. rotation 3. cycle ・ 環 : [わ, かん] 【名詞】 1. circle 2. ring 3. link 4. wheel 5. hoop 6. loop ・ 検出 : [けんしゅつ] 1. detection 2. sense ・ 出 : [で] 1. (n,n-suf) outflow 2. coming (going) out 3. graduate (of) 4. rising (of the sun or moon) 5. one's turn to appear on stage ・ 法 : [ほう] 1. (n,n-suf) Act (law: the X Act)
フロイドの循環検出法(英: Floyd's cycle-finding algorithm)とは、任意の数列に出現する循環を検出するアルゴリズムである。任意の数列とは、例えばデータ構造でもよいし、O(1)領域でその場で生成される数列(特にグラフや擬似乱数列)でもよい。ロバート・フロイドが1967年に発明した。ウサギとカメのアルゴリズムと呼ばれることもある。 グラフの最短経路問題を解くワーシャル-フロイド法とは異なる。 == アルゴリズム == 以下では、擬似乱数列を対象としている。フロイドの循環検出法は擬似乱数発生器の分析に重要であるし、ポラード・ロー素因数分解法でもそれが重要となるためである。擬似乱数は最初は無作為だが、ある時点から循環して同じ数列を繰り返すようになる。 まず、擬似乱数函数 ''f'' を次のように表す。 : ここで、''S'' は元の個数(cardinality)が ''n'' の有限集合である。数列 ''a''''i'' は次のように定義される。 : 明らかに、このような数列は、擬似乱数函数がとりうる値が ''n'' 種類しかないので、最高でも ''n'' 回繰り返すまでに循環を発生させる。循環の長さを知る素朴な方法は、数列をいちいち記録していって、並びが同じ部分を総当り的に探すことである。このとき必要な記憶領域は O(μ + λ) であり、μ は循環部分の長さ、λ は循環していない部分の長さである。 ここで注目すべきは、2つの要素に以下の関係が成り立つとき : その間の要素数 |''i'' − ''j''| は循環の長さの整数倍となる。なぜなら、循環数列の定義から、次が成り立つからである。 : この2つの要素のインデックスの差は ''k''μ であり、循環部分の長さの整数倍となっている。フロイドの循環検出法は、2つのインデックス変数を並行して増やしていき(ただし、一方はもう一方の2倍の速度で増やす)、このように一致する場合を探すのである。すなわち一方のインデックスを1ずつ増やし、もう一方を2ずつ増やしていく。すると、ある時点で次のようになる。 : ここで、2''m'' − ''m'' = ''m'' を割り切れる任意の数が循環の長さとなる(循環に入る前の部分 λ は、λ > ''m'' - μ でかつ λ <= ''m'' の任意の値と考えられる)。 一致が見つかったら、λ を決定する。これは、一方は から、もう一方は数列の最初から値を求めて比較していくことで分かる(共に1つずつ進めて行く)。 は循環の先頭地点から ''m'' - λ ステップ進んだ地点であり、そこから λ ステップ進むと循環の先頭地点からは ''m'' ステップの地点である。''m'' は μ の整数倍であるから、それはつまり、循環の先頭地点に他ならない。従って、λ ステップ後に両者は循環の先頭地点に到達し、そこまでの繰り返し回数が λ となる。 λ が分かれば、巡回の開始地点から第一段階と同じアルゴリズムを繰り返すことで μ を見つけることができる。この場合、λ が 0 なので、新たな ''m'' は μ の整数倍ではなく、μ そのものであることが保証される。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「フロイドの循環検出法」の詳細全文を読む スポンサード リンク
|