・正しい折り目 GAI 氏
細長いテープを真ん中から、2つに折り重ねていくことを考える。2つに折るとき、右側が
左側の上になるようにして折っていく。
連続4回折ったとして再び紙を広げてみると、テープに折り跡が付いている。谷折り部分
を1、山折り部分を0で表してみると、テープ左端から、
1,1,0,1,1,0,0,1,1,1,0,0,1,0,0
なる折り目が付くことになる。4回位は何とか折れますが、これを10回連続して折り重ねて
みることはほとんど不可能。
そこで、もし、10回折り重ねたとしたら、さてテープにはいかなる折り目が出現することに
なるでしょうか?
また、折り重ねn回に対する折り目が付く折り目数列 {f(n)} の関数は構成可能か?
らすかるさんからのコメントです。(平成26年10月21日付け)
数列は、「A014577」にありますが、ビット演算を許せば、C言語で
f(n) = (n & -n & ~(n / 2)) / (n & -n);
と表せます。BASICなら、 F(N)=(N AND -N AND NOT N\2)\(N AND -N)
で多分いけると思います。
# 「\」演算子がない場合は、 F(N)=((N AND -N)*2 AND NOT N)/(N AND -N)/2
GAI さんからのコメントです。(平成26年10月21日付け)
掲載されていたプログラムを元に、私が理解できる形式にまとめてみました。
(プログラムの動きから人間が<特に私>理解できるように読み直すのに骨が折れる。)
テープの左端から折り目が付いた状態を、a(1),a(2),a(3),・・・ と表しています。なお、「1」は
谷折り状態、「0」は山折り状態を示すことにする。
1回折る ・・・ a(1)=1
2回折る ・・・ a(1)=1,a(2)=1,a(3)=0
3回折る ・・・ a(1)=1,a(2)=1,a(3)=0,a(4)=1,a(5)=1,a(6)=0,a(7)=0
4回折る ・・・ a(1)=1,a(2)=1,a(3)=0,a(4)=1,a(5)=1,a(6)=0,a(7)=0,a(8)=1,a(9)=1,
a(10)=1,a(11)=0,a(12)=0,a(13)=1,a(14)=0,a(15)=0
ここまでは実験できる。さて次からは、5回折る場合には、a(1)〜a(15)までは上記の値は
そのまま使える。(何か不思議だが使える。)
その先からは、n:偶数なら、nを2で割れるだけ割ったものを利用する。
a(16)->a(8)->a(4)->a(2)->a(1)=1
a(18)->a(9)=1
a(20)->a(10)->a(5)=1
a(22)->a(11)=0
・・・・・・・・・・・
次に、n:奇数なら、上記の4回折りまでの様子を観察すると、
a(1)=1,a(3)=0,a(5)=1,a(7)=0,a(9)=1,a(11)=0,a(13)=1,a(15)=0,・・・・・
これはまさに、 n≡1 (mod 4) なら、 a(n)=1
n≡3 (mod
4) なら、 a(n)=0
この2つの法則を使うと、残りのa(16)〜a(31)は、
a(16)=a(1)=1 、a(17)=a(4*4+1)=1 、a(18)=a(9)=1 、a(19)=a(4*4+3)=0 、a(20)=a(5)=1
a(21)=a(4*5+1)=1 、a(22)=a(11)=0 、a(23)=a(4*5+3)=0 、a(24)=a(3)=0 、a(25)=a(4*6+1)=1
a(26)=a(13)=1 、a(27)=a(4*6+3)=0 、a(28)=a(7)=0 、a(29)=a(4*7+1)=1 、a(30)=a(15)=0
a(31)=a(4*7+3)=0
と、割と容易く折り目が見つかる。もちろん6回折りなら、a(1)〜a(31)はそっくり利用して、
a(32)〜a(63)は同様なルールで構成していける。
以下人手では不可能な回数までの紙の折り目が手に入る。(これでいいのかな?)
DD++さんからのコメントです。(平成26年10月21日付け)
2N 番目の折り目は折る回数を 1 回減らせば N 番目の折り目なので、f(2N)
= f(N)
4N+1 番目の折り目は、最後に折る直前 4N 番目の折り目は左端に、4N+2 番目の折り目は
右端にあるので、この区間は元と同じ向きになっているため、f(4N+1) = 1
4N+3 番目の折り目は、最後に折る直前 4N+4 番目の折り目は左端に、4N+2 番目の折り目
は右端にあるのでこの区間は元と裏返っているため、f(4N+3) = 0
つまり、n番目の折り目は「n を奇数になるまで 2 で割り、最後に奇数を 4
で割った余りが 1
なら谷折り、3 なら山折り」。
関数の性質として、x<2N かつ x≠2N-1 のとき、 f(x)+f(2N-x) = 1 が自明に成り立つので、
それと f(2M) = 1 から求めてもいいですね。
例:2014 番目の折り目
2014/2 = 1007 、1007 ≡ 3 (mod4) なので山折り
または、2014 番目の折り目は 2048-2014 = 36 番目の折り目の逆、36 番目の折り目は、
64-36 = 28 番目の折り目の逆、28 番目の折り目は 32-28 = 4 番目の折り目の逆、4
番目
の折り目は谷折りなので、2014 番目は逆の逆の逆で山折り。
また、N 回折った時の数列全体を構成したいのであれば、01 反転して逆順にした数列を
1
を挟んで接続してもいいでしょう。
1 (N=1)
01 反転したら 0、逆順にして 0、これを 1 を挟んでくっつける
1,1,0 (N=2)
01 反転したら 0,0,1、逆順にして 1,0,0、これを 1 を挟んでくっつける
1,1,0,1,1,0,0 (N=3)
以下略
らすかるさんからのコメントです。(平成26年10月22日付け)
ビット演算とか使わずに、数学関数だけで無理やりf(n)を作ると、
f(n)=Σk=1〜[log2 n]+1 {1+2[n/2k+1]-[n/2k]} [sin2(nπ/2k)]
GAI さんからのコメントです。(平成26年10月22日付け)
これは、 f(n)=Σk=1〜[log2 n]+1 [sin2(nπ/2k)] = Σk=1〜[log2 n]+1 sin2(nπ/2k)
f(1)=1、f(2)=1、f(3)=3/2、f(4)=1、f(5)=3/2+Cos[π/8]^2=2.35355・・・
f(6)=3/2、f(7)=3/2+Sin[π/8]^2=1.64645・・・、f(8)=1
f(9)=3/2+Cos[π/16]^2+Sin[π/8]^2=2.60839・・・
f(10)=3/2+Cos[π/8]^2=2.35355
f(11)=3/2+Cos[π/8]^2+Cos[3π/16]^2=3.0449・・・
・・・・・・・・・・・・・・・・・・・・
となりませんか?
分かりました!f(n)の式で、[ ]の部分は床関数(Floor)の意味だったんですね。まさにこの
式一つで好きな番号nでの折り目の状態が瞬時に手に入ります。(らすかるさん凄い!)