循環する数列の一般項

 20100213の再掲。循環する数列の話。数式部分はMathJaxで書き直した。
・0, 1, 0, 1, 0, 1・・・・・
・0, 1, 2, 0, 1, 2, 0, 1, 2・・・・・
・0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3・・・・・
・0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4・・・・・
 こういう数列を作りたかった時の話。
 数が多くなるほど複雑になるのは目に見えてるので、どこか限界があるんだろうなというのは何となく分かる。
 このときは2個と3個の数の循環しか書いてないけど、4個の場合は(0, 0) (0, 1) (-2, 0) (0, -3)を通る楕円の方程式から作ることができる。同様に5つの場合は5点を通る傾いた楕円の方程式から作ることができる。
 傾いた楕円はウニタリー変換が出てくるのでめんどいけど、気が向いたら作りたい。


Samstag 13. Februar 2010.
 久しぶりに数学ネタ。
 数学ネタは実はいろいろと溜め込んでるんだけど、パソコン上で数式とかグラフとかを書くのが大変だからなかなか書く気にならない。
 今回は循環する数列の一般項を求める。
k1 = 0
k2 = 1
k3 = 0
k4 = 1
k5 = 0
k6 = 1
 取り敢えず、簡単なところから2つの数を循環する数列を考える。これはもう特に考えることなく解へのロードマップが思い付く。(-1)nの振幅が1になるように弄って足し算引き算とかでこねくり回して010101となるようにすればよい。
 従って、
 { \displaystyle k_n = \frac{(-1)^n}{2} + 0.5 }
 多分コレでいい。一応検算しておく。
n=1のとき  { k_1 = \frac{(-1)^1}{2} + 0.5 = \frac{-1}{2} +0.5 = 0 }
n=2のとき  { k_2 = \frac{(-1)^2}{2} + 0.5 = \frac{1}{2} +0.5 = 1 }
 うん、あってる。

 次は3つ。
k1 = 0
k2 = 1
k3 = 2
k4 = 0
k5 = 1
k6 = 2
k7 = 0
 となる。別に1,2,3,1,2,3でもいいんだけど。そこら辺は後からどうにでも弄れるから何でもいい。重要なのは3つの数が同じ幅を持つこと。ちょっと曖昧な表現を使っているからよくないんだけど、例えば1,3,7,1,3,7はダメだし、0,1/3,π,0,1/3,πも当然ダメ。2,8,14ならOKということ。ここでは0,1,2,0,1,2でいく。
 { \left( \frac{-1}{2} + \sqrt{ \frac{3}{4} } \right) ^n } でいけるかな、と思っていろいろ試してみたけど、どうしても虚数項が残ってしまってどうにもならなかった。結構悩んだ結果、結局三角関数を使うことにした。ここから先は頭の中に単位円を描いて考えてください。
 { \displaystyle k_n = \cos \left( \left( \frac{1}{6} + \frac{2}{3} n \right) \pi \right) }
 とすると、
 { \displaystyle k_1 = \sqrt{ \frac{3}{4} } \\ k_2 = - \sqrt{ \frac{3}{4} } \\ k_3 = 0 \\ k_4 = \sqrt{ \frac{3}{4} } \\ k_5 = - \sqrt{ \frac{3}{4} } \\ k_6 = 0 }
となる。絶好調だ。30°150°270°の余弦を取る。それぞれの角度は120°ずつ離れている。270°の次は390°、30°を390°と言い換えることができるのでこれでよい。あとは振幅を2にして、端を0にして、スタートを0にすると完成する。
 まずは振幅から。各項を { \sqrt{\frac{3}{4}}} で割ってやると1,-1, 0,1,-1,0という数列になる。ここに1を足すと2,0,1,2,0,1となる。これだと第2項が0となっているのでここをスタート地点にしよう。一般項のnの所にn+1を入れてもいいんだけど、これはエレガントではない。スタートを30°にしているところを150°にしよう。これで、第2項からスタートするのと同じことになる。
 纏めると、
 { \displaystyle k_n = 2 \frac{ \sqrt{3} \cos \left( \left( \frac{5}{6} + \frac{2}{3} n \right) \pi \right) }{3} + 1 }

 次に4つ、と行きたいところだけど、4つのパターンはまだ思い付いていないので書けない。
 modとか床関数とか使えば簡単にできそうな気もするけど、連続じゃない関数は使いたくないのでそういうのはなしで行く。