群ですか?
Are you a group?
kinaba
群 (Group)
集合 G と二項演算 ☆ が以下の3条件を満たしてたら群と呼ぶ
問題
N × N の表が渡されたときに
群になってるかどうか�判定してね
☆ | 0 | 1 | 2 | 3 |
0 | 0 | 1 | 2 | 3 |
1 | 1 | 2 | 3 | 0 |
2 | 2 | 3 | 0 | 1 |
3 | 3 | 0 | 1 | 2 |
自明な解法
G.any? { |e|
G.all? { |a| e☆a==a && a☆e==a }
}
&&
G.all? { |a|
G.any? { |z| a☆z==e && z☆a==e }
}
&&
G.all? { |a|
G.all? { |b|
G.all? { |c| (a☆b)☆c == a☆(b☆c) }� }
}
O(N3)
よんだ論文
O(N2 log N)
B = a set of generators of G
G.all? { |a|
B.all? { |b|
G.all? { |c| (a☆b)☆c == a☆(b☆c) }}}
おまけスライド: technical detail
O(N2) randomized
注: 群の判定ではなく、結合性の判定のみを行う手法
( "群じゃなさそうだったら(結合性があっても)捨て!"
ができないので、こちらの方が難しい!)
十分な回数のループ {
if( (結合則が成り立つなら必ず true
成り立たないなら、1/8 以上の確率で false
を返す O(N2) アルゴリズム) == false )
return false;
}
return true;
確率 1/8
Random に X = {a1, a2, ..., ax} ⊆ G を選ぶ� Random に Y = {b1, b2, ..., by}⊆ G を選ぶ� Random に Z = {c1, c2, ..., cz} ⊆ G を選ぶ� (X☆Y)☆Z = X☆(Y☆Z) かどうか確かめる�
ただし集合同士の ☆ は xor っぽい雰囲気で定義
確率 1/8 であることの証明の雰囲気
おまけスライド: technical detail
Further Reading