ちゃっくのメモ帳

ちゃっくがメモしときたいことをメモしとくよ

k-bitのXORを取ると2^k-1になるような2つの非負整数から2^0~2^kの奇数を作れる

k-bitの整数を考える。
 a \oplus b = 2^k-1を満たすような2つのk-bitの整数a,b( a\geq b)の組を考える。
全ての組について考えた時、この2つの整数a,bから、 a-b [2^0,2^k]の範囲の全ての奇数を作ることができる。

具体例

例えば3-bitの場合を考える。
このとき、a,bのペアとして次のものが考えられる。
(b111,b000), (b110, b001), (b101, b010), (b100, b011)
そのため、
 b111-b000 = 7(b111)
 b110-b001 = 5(b101)
 b101-b010 = 3(b011)
 b100-b011 = 1(b001)
と、 [2^0,2^3]の奇数を全て作ることが出来ている。

証明(かなり厳密性がない気がする)

これは多分、帰納的に示すとよい。(構成的に示したかったが上手く構成出来なかった。)

まず、1-bitの時を考える。
このとき、(a,b)の組として考えられるのは(1,0)で、1-0=1より[2^0, 2^1]の範囲の奇数を作ることが出来ている。

次に、k-bitの場合に上の命題が成立するとする。
この時、k+1 bitの場合について考える。
 [2^0, 2^{k+1}]の範囲にある奇数は、 [2^0, 2^{k}]の奇数の先頭に0を付けたものと、1を付けたものから構成される。(たとえば、3-bitの場合は2-bitの\{b00,b01,b10,b11\}の先頭に0を付けたもの\{b000,b001,b010,b011\}と先頭に1をつけたもの \{b100,b101,b110,b111\}で構成される)

先頭に1をつけたものについては、k-bitのときの(a,b)の組のaの先頭に1を,bの先頭に0つけると構成できる。この構成により \
[2^k+1, 2^{k+1}]の範囲の奇数を全て生成することができる。
(例えば、2-bitの場合のa,bの組 (b10,b01)に対して、3-bitの (b110,b001)を作ると2-bitの2-1=1から3-bitでは6-1=5を作ることができる。)
これは筆算を使うとイメージしやすい。


先頭に0をつけたものについては、k-bitのときの(a,b)の組のbの先頭に1を引いたものをk+1bitのときのaとして、k-bitのときの(a,b)の組のaの先頭に0を付けたものをk+1bitのときのbとすれば、 [2^0, 2^k]の範囲の奇数を構成できる。
(例えば、2-bitの場合のa,b,の組み (b10,b01)に対して、3-bitの (b101,b010)を作ると2-1=1から5-2=3を作ることができる。)

イメージとしてはこんな感じ。
f:id:chakku000:20200705030316j:plain

コメント

証明はなんであの構成でいいのかを真面目に示してない。示すのがめんどくさくなってしまった。
間違いがあったら教えてください。
そもそも命題があんまり直感的じゃない気がするんだけど、なにかポイントに気がついたらかなり直感的な気がする。
なんか見逃してそうなので誰か教えてほしい....

そもそも、なんでこれを示そうかと思ったかというと元ネタはこれです。この解説を見ているときに気になりました。
atcoder.jp