2つの正の数の2種類の連結は、もとの数を循環節とする循環小数で比較できることの理由付け
2つの正の数の文字列表現 a, b が与えられた時に、それらを結合した ab, ba のどちらが数として大きいかを判定する。 これには ab, ba を数として、あるいは辞書順で比較すればよいが、循環小数 0.(a), 0.(b) を比較しても ab, ba の大小を判定できる。 以下はこの事の(無用に複雑な)理由付け。
a が b の接頭辞であり、b は a の1回以上の繰り返しである場合(ab = ba)。
- b = a… で、0.(a) は 0.(aa) 0.(aaa) … に等しいので、0.(b) に等しい。
- したがって、0.(a) と 0.(b) を比較しても同じ結果になる。
- a と b の関係が逆の場合も同様。
a が b の接頭辞であり、b は a の1回以上の繰り返しに r が残る場合。
- b = a…r とすると ab 対 ba は、aa…r と a…ra を比較することに等しい。
- これは(先頭の a… を無視して)
a と r をどちらか短い方の長さまで比較すればa と ra を最大でも a の長さまで比較すれば決定できるので、0.(a) 0.(a…r) を比較しても同じ結果になる。 - a と b の関係が逆の場合も同様。
それ以外の場合。
- a と b のどちらか短い方の長さまで比較すれば判定できるので、
- 0.(a) と 0.(b) を比較しても同じ結果になる。
以上。
なお、代数的にもっと簡潔な証明ができる。
追記:
@plonk1 二番目のケース、
a=1234
b=12341234123 (r=123)
だと
aとrの短い方まででの比較じゃ大小を決められない
— ハツネツ (@hatsunetsu7) 2015, 5月 30
間違ってた……。