魔法の数くるくる



ご意見、ご質問などは こちらのメール へ
「ホームページ」  へ戻る。        .

 この話は長崎総合科学大学の藤原豪先生から教わったものです。

藤原先生の「カフェ・プロトマヤ」[ http://www.bas.nias.ac.jp/~cafe/ ]
のお品書きから「魔法数ぐるぐる」もご覧下さい。

n = 142857 という数があります。これを2倍、3倍、・・・、6倍としていくと
     n  =  142857 
    2n  =  285714 
    3n  =  428571 
    4n  =  571428 
    5n  =  714285 
    6n  =  857142
 不思議なことにすべての巡回置換を尽くします。
 これらは単なる偶然でしょうか。
 さらにもう一つ先をみると
    7n = 999999
 ここで 「ああ、そうか」 ということになります。 どこかで見た数字だと思ったら

     1 / 7 = 0.142857142857142857.......

の循環節でした。すると

    kuru01.gif

つまり  kuru02.gif  ということになります。

 ここでフェルマーの定理

   素数 p と、 p の倍数でない整数 k について kuru03.gif は p で割り切れる。

を思い出しましょう。これを kuru04.gif について適用して見ます。いろいろな p について kuru05.gif を調べてみれば、同様に巡回する数が他にも見つかるかも知れません。

 次の表は素数 p = 2, 3, 5, 7, 11, 13, 17 について、 kuru05.gif を j 倍 ( 1 < j < p ) したものを表したものです。
見やすいように、例えば 142857 は 1 4 2 8 5 7 と、隙間を空けて表示しました。 また、うまく循環したところは、青い色にしました。
  k  p  j     jn

 10  2         4.5 

 10  3  1      3  3 
 10  3  2      6  6 
 10  3  3      9  9 

 10  5         1999.8 

 10  7  1      1  4  2  8  5  7 
 10  7  2      2  8  5  7  1  4 
 10  7  3      4  2  8  5  7  1 
 10  7  4      5  7  1  4  2  8 
 10  7  5      7  1  4  2  8  5 
 10  7  6      8  5  7  1  4  2 
 10  7  7      9  9  9  9  9  9 

 10  11  1     0  9  0  9  0  9  0  9  0  9 
 10  11  2     1  8  1  8  1  8  1  8  1  8 
 10  11  3     2  7  2  7  2  7  2  7  2  7 
 10  11  4     3  6  3  6  3  6  3  6  3  6 
 10  11  5     4  5  4  5  4  5  4  5  4  5 
 10  11  6     5  4  5  4  5  4  5  4  5  4 
 10  11  7     6  3  6  3  6  3  6  3  6  3 
 10  11  8     7  2  7  2  7  2  7  2  7  2 
 10  11  9     8  1  8  1  8  1  8  1  8  1 
 10  11  10    9  0  9  0  9  0  9  0  9  0 
 10  11  11    9  9  9  9  9  9  9  9  9  9 

 10  13  1     0  7  6  9  2  3  0  7  6  9  2  3 
 10  13  2     1  5  3  8  4  6  1  5  3  8  4  6 
 10  13  3     2  3  0  7  6  9  2  3  0  7  6  9 
 10  13  4     3  0  7  6  9  2  3  0  7  6  9  2 
 10  13  5     3  8  4  6  1  5  3  8  4  6  1  5 
 10  13  6     4  6  1  5  3  8  4  6  1  5  3  8 
 10  13  7     5  3  8  4  6  1  5  3  8  4  6  1 
 10  13  8     6  1  5  3  8  4  6  1  5  3  8  4 
 10  13  9     6  9  2  3  0  7  6  9  2  3  0  7 
 10  13  10    7  6  9  2  3  0  7  6  9  2  3  0 
 10  13  11    8  4  6  1  5  3  8  4  6  1  5  3 
 10  13  12    9  2  3  0  7  6  9  2  3  0  7  6 
 10  13  13    9  9  9  9  9  9  9  9  9  9  9  9 

 10  17  1     0  5  8  8  2  3  5  2  9  4  1  1  7  6  4  7 
 10  17  2     1  1  7  6  4  7  0  5  8  8  2  3  5  2  9  4 
 10  17  3     1  7  6  4  7  0  5  8  8  2  3  5  2  9  4  1 
 10  17  4     2  3  5  2  9  4  1  1  7  6  4  7  0  5  8  8 
 10  17  5     2  9  4  1  1  7  6  4  7  0  5  8  8  2  3  5 
 10  17  6     3  5  2  9  4  1  1  7  6  4  7  0  5  8  8  2 
 10  17  7     4  1  1  7  6  4  7  0  5  8  8  2  3  5  2  9 
 10  17  8     4  7  0  5  8  8  2  3  5  2  9  4  1  1  7  6 
 10  17  9     5  2  9  4  1  1  7  6  4  7  0  5  8  8  2  3 
 10  17  10    5  8  8  2  3  5  2  9  4  1  1  7  6  4  7  0 
 10  17  11    6  4  7  0  5  8  8  2  3  5  2  9  4  1  1  7 
 10  17  12    7  0  5  8  8  2  3  5  2  9  4  1  1  7  6  4 
 10  17  13    7  6  4  7  0  5  8  8  2  3  5  2  9  4  1  1 
 10  17  14    8  2  3  5  2  9  4  1  1  7  6  4  7  0  5  8 
 10  17  15    8  8  2  3  5  2  9  4  1  1  7  6  4  7  0  5 
 10  17  16    9  4  1  1  7  6  4  7  0  5  8  8  2  3  5  2 
 10  17  17    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 

                                    表1
 もう一度表1を眺めてみましょう。
  p = 2, 5 では p が 10 の約数だから、考察の対象にならなりません。
  p = 11, 13 では短い循環節があって、それが幾つか繰り返されているので、 求めている例ではありませんが、そうかといって「巡回」という性質がまったく 失われてしまったわけでもありません。
 循環節の長さを t 、繰り返しの数を s とすると p-1 = st が成り立ち、
     p   s   t
     3   2   1 
     7   1   6 
    11   5   2 
    13   2   6 
    17   1  16
                   表2
となっています。巡回数であることは s = 1 と同値です。

  p = 17 で待望の次の例が見つかりました。なお j = 17 で 9 が並ばず、 0 が並ん でしまったのは、Visual Basic の限界で、15 桁を超えてオーバーフローしたためです。


 さて、これらは 10 進法に依存した結果ですが、フェルマーの定理を思い出すと 他の k 進法でも同様の問題を考えることができます。

 長崎総合科学大学の藤原豪先生のホームページでは、10 進法の場合しか触れられて いません(2003 年 9 月現在)ので、k 進法の場合もここで考察したいと思います。

  まず k 進法について簡単に「おさらい」をしておきます。
 例えば 5 進法とは、 0, 1, 2, 3, 4 の 5 つの文字だけを使って 数を表す方法です。
1, 2, 3, 4 までは 10 進法と同じですが、次の 5 は 10、 6 は 11 と表されます。 ややこしいので kuru06.gif kuru07.gif などと表すこともあります。

    kuru08.gif

ということですから、これは 5 進数を 10 進数に戻す方法を示しています。

kuru21.gif

 逆に 10 進数を 5 進数にするには、5 で割っては余りを拾い、また 5 で 割っては余りを拾い、と繰り返していってそれを逆順に並べればよいのです。  左側に例を示しました。

kuru22.gif

 右をみると、その説明がよくわかります。
 以上で 「おさらい」 は終わり。

 さて、 k=5 進数の場合で、各素数 p 毎に、 kuru09.gif の jn ( 1 < j < p ) を調べてみました。
 これを出力したプログラム1を最後のページに掲げておきます。
 k  p  j       jn

 5  2  1       2 
 5  2  2       4 

 5  3  1       1  3 
 5  3  2       3  1 
 5  3  3       4  4 

 5  5          124.8 

 5  7  1       0  3  2  4  1  2 
 5  7  2       1  2  0  3  2  4 
 5  7  3       2  0  3  2  4  1 
 5  7  4       2  4  1  2  0  3 
 5  7  5       3  2  4  1  2  0 
 5  7  6       4  1  2  0  3  2 
 5  7  7       4  4  4  4  4  4 

 5  11  1      0  2  1  1  4  0  2  1  1  4 
 5  11  2      0  4  2  3  3  0  4  2  3  3 
 5  11  3      1  1  4  0  2  1  1  4  0  2 
 5  11  4      1  4  0  2  1  1  4  0  2  1 
 5  11  5      2  1  1  4  0  2  1  1  4  0 
 5  11  6      2  3  3  0  4  2  3  3  0  4 
 5  11  7      3  0  4  2  3  3  0  4  2  3 
 5  11  8      3  3  0  4  2  3  3  0  4  2 
 5  11  9      4  0  2  1  1  4  0  2  1  1 
 5  11  10     4  2  3  3  0  4  2  3  3  0 
 5  11  11     4  4  4  4  4  4  4  4  4  4 

 5  13  1      0  1  4  3  0  1  4  3  0  1  4  3 
 5  13  2      0  3  4  1  0  3  4  1  0  3  4  1 
 5  13  3      1  0  3  4  1  0  3  4  1  0  3  4 
 5  13  4      1  2  3  2  1  2  3  2  1  2  3  2 
 5  13  5      1  4  3  0  1  4  3  0  1  4  3  0 
 5  13  6      2  1  2  3  2  1  2  3  2  1  2  3 
 5  13  7      2  3  2  1  2  3  2  1  2  3  2  1 
 5  13  8      3  0  1  4  3  0  1  4  3  0  1  4 
 5  13  9      3  2  1  2  3  2  1  2  3  2  1  2 
 5  13  10     3  4  1  0  3  4  1  0  3  4  1  0 
 5  13  11     4  1  0  3  4  1  0  3  4  1  0  3 
 5  13  12     4  3  0  1  4  3  0  1  4  3  0  1 
 5  13  13     4  4  4  4  4  4  4  4  4  4  4  4 

 5  17  1      0  1  2  1  3  4  0  2  4  3  2  3  1  0  4  2 
 5  17  2      0  2  4  3  2  3  1  0  4  2  0  1  2  1  3  4 
 5  17  3      0  4  2  0  1  2  1  3  4  0  2  4  3  2  3  1 
 5  17  4      1  0  4  2  0  1  2  1  3  4  0  2  4  3  2  3 
 5  17  5      1  2  1  3  4  0  2  4  3  2  3  1  0  4  2  0 
 5  17  6      1  3  4  0  2  4  3  2  3  1  0  4  2  0  1  2 
 5  17  7      2  0  1  2  1  3  4  0  2  4  3  2  3  1  0  4 
 5  17  8      2  1  3  4  0  2  4  3  2  3  1  0  4  2  0  1 
 5  17  9      2  3  1  0  4  2  0  1  2  1  3  4  0  2  4  3 
 5  17  10     2  4  3  2  3  1  0  4  2  0  1  2  1  3  4  0 
 5  17  11     3  1  0  4  2  0  1  2  1  3  4  0  2  4  3  2 
 5  17  12     3  2  3  1  0  4  2  0  1  2  1  3  4  0  2  4 
 5  17  13     3  4  0  2  4  3  2  3  1  0  4  2  0  1  2  1 
 5  17  14     4  0  2  4  3  2  3  1  0  4  2  0  1  2  1  3 
 5  17  15     4  2  0  1  2  1  3  4  0  2  4  3  2  3  1  0 
 5  17  16     4  3  2  3  1  0  4  2  0  1  2  1  3  4  0  2 
 5  17  17     4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4 

 5  19  1      0  1  1  2  4  2  1  4  1  0  1  1  2  4  2  1  4  1 
 5  19  2      0  2  3  0  3  4  3  3  2  0  2  3  0  3  4  3  3  2 
 5  19  3      0  3  4  3  3  2  0  2  3  0  3  4  3  3  2  0  2  3 
 5  19  4      1  0  1  1  2  4  2  1  4  1  0  1  1  2  4  2  1  4 
 5  19  5      1  1  2  4  2  1  4  1  0  1  1  2  4  2  1  4  1  0 
 5  19  6      1  2  4  2  1  4  1  0  1  1  2  4  2  1  4  1  0  1 
 5  19  7      1  4  1  0  1  1  2  4  2  1  4  1  0  1  1  2  4  2 
 5  19  8      2  0  2  3  0  3  4  3  3  2  0  2  3  0  3  4  3  3 
 5  19  9      2  1  4  1  0  1  1  2  4  2  1  4  1  0  1  1  2  4 
 5  19  10     2  3  0  3  4  3  3  2  0  2  3  0  3  4  3  3  2  0 
 5  19  11     2  4  2  1  4  1  0  1  1  2  4  2  1  4  1  0  1  1 
 5  19  12     3  0  3  4  3  3  2  0  2  3  0  3  4  3  3  2  0  2 
 5  19  13     3  2  0  2  3  0  3  4  3  3  2  0  2  3  0  3  4  3 
 5  19  14     3  3  2  0  2  3  0  3  4  3  3  2  0  2  3  0  3  4 
 5  19  15     3  4  3  3  2  0  2  3  0  3  4  3  3  2  0  2  3  0 
 5  19  16     4  1  0  1  1  2  4  2  1  4  1  0  1  1  2  4  2  1 
 5  19  17     4  2  1  4  1  0  1  1  2  4  2  1  4  1  0  1  1  2 
 5  19  18     4  3  3  2  0  2  3  0  3  4  3  3  2  0  2  3  0  3 
 5  19  19     4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4 

                  表3
  p = 5 の st 表は次の通り。
     p   s   t 
     2   1   1 
     3   1   2 
     7   1   6 
    11   2   5 
    13   3   4 
    17   1  16 
    19   2   9
                   表4
  p = 2, 3, 7, 17 で巡回数となったことが観察できます。
p = 2 は自明的です。

 後は前進あるのみ。ひたすら計算機のキーボードをたたきます。やがて次の表ができます。 たてが p 、横が k 、巡回数となったところに o 印をつけました。
  p = 17 では右の方のデータはオーバーフローになって得られていません。
     p\k  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17   
       2     o     $     o     o       o       o       o       o 
       3  o        $        o          o           o           o
       5  o  o           o  o              o   o               o 
       7     o     $               $       o                   o
      11  o           o  o  o                  o               o
      13  o           o  o             o               o        
      17     o     $  o  o         $      
                   表5
 k = 10 の二つの $ が表1で得られた結果、 k = 5 の4つの $ が表3で得られた 結果です。
 たてに作った表ですが、横によくよく眺めて見ると、 p 毎に周期 p で繰り返しが あることに気がつきます。もしそうなら、左の p 個ずつについての必要十分条件さえ 見つければ良いということになります。

 ここでもう一つ 「おさらい」 をしましょう。
 二つの整数 m, n について、 m を p で割った余りと n を p で割った余りが 等しいとき、すなわち m - n が p の倍数のとき、 m と n は p を法として合同 であるといい、 m ≡ n ( mod p ) と表します。

 例として、 p = 7 の場合を考えてみましょう。
 すべての整数 n は
     n = 7s + r ; ( s は整数、0 < r < 6 )
と表すことができますから、 0, 1, 2, 3, 4, 5, 6 のどれかと 7 を法として 合同になります。
        .  .  .  .  -21  -14  -7  0   7  14  21  .  .  .  .
        .  .  .  .  -20  -13  -6  1   8  15  22  .  .  .  .
        .  .  .  .  -19  -12  -5  2   9  16  23  .  .  .  .
        .  .  .  .  -18  -11  -4  3  10  17  24  .  .  .  .  
        .  .  .  .  -17  -10  -3  4  11  18  25  .  .  .  .
        .  .  .  .  -16   -9  -2  5  12  19  26  .  .  .  .
        .  .  .  .  -15   -8  -1  6  13  20  27  .  .  .  .
  n と合同になる数の全体を kuru10.gif と表すことにします。すると kuru11.gif とか、 kuru12.gif などと、加法と乗法が定義されて分配法則を満たすので、集合
    kuru14.gif
は可換環をなします。7は素数ですから、 kuru15.gif を除いた残りの集合
    kuru16.gif
は乗法を演算として群になります。これを素数 p の単数群といいます。

 単数群は有限群だから、どの元も何乗かすればいつかは単位元に戻ります。元 kuru10.gif について kuru17.gif となる正で最小の t を元 kuru10.gif の 位数  といいます。位数は p - 1 に等しいか またはその約数であることが分っています。
そこで各元の「べき」を求めてみました。数字の上の横棒は省略しました。
 p  n

 3  2          2  1 

 5  2          2  4  3  1 
 5  3          3  4  2  1 
 5  4          4  1 

 7  2          2  4  1 
 7  3          3  2  6  4  5  1 
 7  4          4  2  1 
 7  5          5  4  6  2  3  1 
 7  6          6  1 

 11  2         2  4  8  5  10  9  7  3  6  1 
 11  3         3  9  5  4  1 
 11  4         4  5  9  3  1 
 11  5         5  3  4  9  1 
 11  6         6  3  7  9  10  5  8  4  2  1 
 11  7         7  5  2  3  10  4  6  9  8  1 
 11  8         8  9  6  4  10  3  2  5  7  1 
 11  9         9  4  3  5  1 
 11  10        10  1 

 13  2         2  4  8  3  6  12  11  9  5  10  7  1 
 13  3         3  9  1 
 13  4         4  3  12  9  10  1 
 13  5         5  12  8  1 
 13  6         6  10  8  9  2  12  7  3  5  4  11  1 
 13  7         7  10  5  9  11  12  6  3  8  4  2  1 
 13  8         8  12  5  1 
 13  9         9  3  1 
 13  10        10  9  12  3  4  1 
 13  11        11  4  5  3  7  12  2  9  8  10  6  1 
 13  12        12  1 

 17  2         2  4  8  16  15  13  9  1 
 17  3         3  9  10  13  5  15  11  16  14  8  7  4  12  2  6  1 
 17  4         4  16  13  1 
 17  5         5  8  6  13  14  2  10  16  12  9  11  4  3  15  7  1 
 17  6         6  2  12  4  7  8  14  16  11  15  5  13  10  9  3  1 
 17  7         7  15  3  4  11  9  12  16  10  2  14  13  6  8  5  1 
 17  8         8  13  2  16  9  4  15  1 
 17  9         9  13  15  16  8  4  2  1 
 17  10        10  15  14  4  6  9  5  16  7  2  3  13  11  8  12  1 
 17  11        11  2  5  4  10  8  3  16  6  15  12  13  7  9  14  1 
 17  12        12  8  11  13  3  2  7  16  5  9  6  4  14  15  10  1 
 17  13        13  16  4  1 
 17  14        14  9  7  13  12  15  6  16  3  8  10  4  5  2  11  1 
 17  15        15  4  9  16  2  13  8  1 
 17  16        16  1 

                   表6
  たての各 p について、 横の k の位数が t のとき、 ts = p-1 となる s を 書きこんだのが次の表です。 出力データの表1や表3等から求めた s の値とも完全に一致しています。 したがって、 s = 1 であるところが巡回数です。
        2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18
   2       1     1     1     1       1       1       1       1  
   3    1     2  1     2  1      2   1       2   1       2   1 
   5    1  1  2     4  1  1  2       4   1   1   2       4   1   1
   7    2  1  2  1  3     6  2   1   2   1   3       6   2   1   2
  11    1  2  2  2  1  1  1  2   5      10   1   2   2   2   1   1 
  13    1  4  2  3  1  1  3  4   2   1   6      12   1   4   2   3 
  17    2  1  4  1  1  1  2  2   1   1   1  4   1    2   8      16 
  19    1  1  2  2  2  6  3  2   1   6   3  1   1    1   2   2   9 
  23    2  2  2  1  2  1  2  2   1   1   2  2   1    1   2   1   2  

                    表7
 残るは 1/p の k 進小数への展開の循環節の長さと、 p を法とした単数群の元 kuru23.gif の位数が何故一致するかという説明です。
kuru19.gif
0 3 2 4 1 2 0 3 をそれぞれ kuru18.gif とすれば、次の式が得られます。始めの3つだけを書き、後は略しましたす。
   kuru20.gif
 これを眺めていると、両者が本質的に同じ作業をしていることがわかります。

 以上で「巡回」という現象が起こるメカニズムの解明が完了しました。

 表1と表3を作った プログラム1と、表6を作ったプログラム2を掲げておきます。

「ホームページ」  へ戻る。


 Dim pr(10), c(30) As Integer

 Private Sub Command1_Click()
    pr(1) = 2: pr(2) = 3: pr(3) = 5: pr(4) = 7: pr(5) = 11
    pr(6) = 13: pr(7) = 17: pr(8) = 19: pr(9) = 23
    Open "c:\My Documents\guruguru.txt" For Output As #1

    k = 10
    For n1 = 1 To 7
    p = pr(n1)
        n = (k ^ (p - 1) - 1) / p
        If n - Int(n) Then
            Print #1, k; p, n
            Print k; p, n: GoTo 100
        End If
        
        For k2 = 1 To p
            p3 = n * k2
            For k1 = 1 To p - 1
                p4 = Int(p3 / k)
                c(k1) = p3 - p4 * k
                p3 = p4
            Next k1
            Print k; p; k2,
            Print #1, k; p; k2,
            For k1 = p - 1 To 1 Step -1
                Print c(k1);
                Print #1, c(k1);
            Next k1
            Print
            Print #1,
        Next k2
100
        Print
        Print #1,
    Next n1
    Close #1
End Sub
                 プログラム1


Dim pr(10) As Integer

 Private Sub Command1_Click()
    pr(1) = 2: pr(2) = 3: pr(3) = 5: pr(4) = 7: pr(5) = 11
    pr(6) = 13: pr(7) = 17: pr(8) = 19: pr(9) = 23
    Open "c:\My Documents\gennoisuu.txt" For Output As #1
    
    For k = 1 To 7
        p = pr(k)
        For n = 2 To p - 1
            Print p; n,
            Print #1, p; n,
            m = 1
            For n1 = 1 To p - 1
                m = m * n
                m = m - Int(m / p) * p
                Print m;
                Print #1, m;
                If m = 1 Then Exit For
            Next n1
            Print
            Print #1,
        Next n
        Print
        Print #1,
    Next k
    Close #1
End Sub
                 プログラム2

「ホームページ」  へ戻る。