2014年12月30日

知の限界

仕事納めの前日に録画しておいた「NHK オックスフォード白熱教室」を昨日見ていました。

「知の限界」というタイトルで「無理数」「カオス理論」「不完全性定理」の三つをテーマにした講演でした。一般者向けの講演というだけあって、非常に難解なテーマをうまくまとめていました。しかし、理解した気にはさせられるのですが、考えれば考えるほどわけが分からなくなるテーマでもあります。不完全性定理の話では非常に簡潔に説明をしていました。なんとなくボンヤリとわかったような気にはなったので、もう一度定理の理解にチャレンジしたいと思います(実は二回ほど理解しようとチャレンジしてことごとく玉砕しています)。
最後に、人間の頭脳に限界はあるのかという話がありました。個人的には何らかの限界はあると思っています。しかし、まだその限界まで至っているわけでないとも信じています。「数の理論の中では知ることができないものがある」ことが証明できてしまうなんて、「不完全性定理」が発表される前はだれも思いもしなかったことでしょうから、これからも驚異的な発見というのはあると思うし、それを楽しみにしていきたいですね。

ということで、これが本当に今年最後の数学の問題になりそうです。今回は「数論bot ( @N_problem_bot )」からの出題です。

-----

■ n を 2 以上の整数とし、p を素数とする。n | p - 1 かつ p | n3 - 1 ならば 4p - 3 は平方数であることを示せ(出典:mathlinks)

n3 - 1 = ( n - 1 )( n2 + n + 1 ) より p | n3 - 1 ならば p | n - 1 または p | n2 + n + 1 が成り立ちます ( ちなみにこれは p が素数だから成り立ちます )。

p | n - 1 かつ n | p - 1 ならば p ≤ n - 1 かつ n ≤ p - 1 でありこれは成り立たちません。よって、p | n2 + n + 1 かつ n | p - 1 が成り立つことになります。。

n | p - 1 より p - 1 = Kn とすれば、p = Kn + 1 なので、Kn + 1 | n2 + n + 1 が成り立ちます。任意の n に対してこれを満たす K として n + 1 があり、このときは n2 + n + 1 = Kn + 1 なので、K は n + 1 より大きくはなれません。また、K ≤ 0 のとき p は 1 以下の数となるので無視できます。そこで、1 ≤ K ≤ n + 1 に対して、n + 1 以外に Kn + 1 | n2 + n + 1 を満たす K を考えます。
K = n のときは、Kn + 1 = n2 + 1 で、n2 + n + 1 との剰余は n になります。K = n - 1 の場合、Kn + 1 = ( n - 1 )n + 1 = n2 - n + 1 で、剰余は 2n です。このように、剰余は n ずつ大きくなり、やがて Kn + 1 を超えるのでさらに割ることができますが、剰余が n の倍数であるのに対し、Kn + 1 は n の倍数ではなりえないので、割り切ることができません。従って、Kn + 1 | n2 + n + 1 を満たす K は n + 1 以外にはありません。
最後に、K = n + 1 のとき p = n2 + n + 1 なので、4p - 3 = 4( n2 + n + 1 ) - 3 = 4n2 + 4n + 1 = ( 2n + 1 )2 であり、平方数であることが示されました。

K = n - L としたとき、剰余は ( L + 1 )n と表されます。K = L = n / 2 ( n | p - 1 より p が奇素数なら n はかならず偶数です ) のときに剰余が n2 / 2 + n となり、Kn + 1 = n2 / 2 + 1 より剰余は初めてさらに割ることができるようになります。K = 1 のとき Kn + 1 = n なので、剰余は必ず 1 になります。n = 10 を例にすると、n2 + n + 1 = 111 なので、剰余は以下のように変化します。

KKn + 1剰余
111110
1010110
99120
88130
77140
66150
5519
44129
33118
2216
1111


例によって合っている保証はなく、他にもっとエレガントな解法もあると思います。これでも結構悩んだんですけどね。  

Posted by fussy at 15:54Comments(0)TrackBack(0)数学

2014年12月28日

年末の大仕事

大掃除を始めました。結局一日では終わらず、明日も続けてやります。

掃除だけなら一日あれば終わるのですが、欲張って場所の移動までしていたら時間がかかってしまいました。使っていないものも思い切って捨てようと思い、選別作業にも時間を取られました。日頃からするようにしておけばこんなことにはならないですよね。

さて、あと三日で今年も終わりです。あっという間の一年だったような気がします。ホームページの更新履歴を見ると、新しいテーマは三つだけでした。来年はもう少し更新頻度を上げたいところですが、なかなか厳しいかもしれません。今のところ、確率・統計からは「生存時間解析」、曲線描画で「NURBS」の二つは更新したいと考えていて、他にも面白いネタがないか模索中です。少し前に見つけた「Poisson Image Editing」なんかがいいかなと思っていたりします。まだまだ、気力の続く限りは更新するつもりです。来年もよろしくお願いします。  

Posted by fussy at 23:03Comments(0)TrackBack(0)

2014年12月27日

仕事納め

今日は今年最後の出勤日でした。

最終日は半日のみということで、帰りにメガネを買いに行きました。今使っているメガネはすでに 15 年以上も使っていて、レンズもフレームもかなり傷が付いてもう限界に近い状態です。いろいろな検査をしてレンズとフレームが決まるまで一時間くらい。今年中にできるかどうかはまだわからないということで、来年のお楽しみということになりそうです。ちなみに、結構なお値段になりました。

昼食抜きのまますぐに会社を出たのに、家に着いたのは夕方近く。予定よりかなり遅くなってしまいました。メガネだけではなく他にも寄り道をしていたのがよくなかったんですけどね。明日から年末の大掃除がまだ残っています。  

Posted by fussy at 23:53Comments(0)TrackBack(0)

2014年12月24日

クリスマス・イブ

今日はクリスマス・イブなわけですが。

いつもと変わらず今日も仕事してました。一応、ケーキは昨日食べました。クリスマス・ケーキではなく天皇誕生日のお祝いケーキみたいなものになりました。さらにチキンは先週末に。
そういえば、クリスマスというのをいつ頃から意識しだしたかはっきりと記憶はありません。でも、子供の頃にクリスマス・プレゼントをもらった覚えはあります。今ほどクリスマスにお祝いするような雰囲気はなくて、むしろ一週間後の大晦日から正月にかけての方が盛り上がっていました。大晦日だけ夜更かしできるというのが非常に楽しみだったんですが、たいてい紅白歌合戦の終盤には寝てしまうんですよね。朝、目が覚めて後悔するというのが毎年のパターンだったような気が。

明日で今年も残り一週間です。年末はいつもの大掃除が待っています。来週の今頃は紅白でも見ているんでしょうかね。  

Posted by fussy at 22:59Comments(0)TrackBack(0)

2014年12月21日

今年もあとわずか

今年もあと 10 日ほどとなりました。

年末になると大掃除と同時に不要品の整理なんかをします。いつも思いますが、普段からやっておけば慌てる必要もないんですよね。しかし、なぜかそれができない。そろそろ、なんとかしなければ。PCのバックアップもこの頃に行います。これも普段からしておけばいいんですけど、それをしないのでもしものときに慌てふためく事になるわけです。で、RAID付きの外付けディスクでも買おうかと悩んでいます。結構高いんですよね。

今年最後になるかもしれない数学の問題へのチャレンジです。結構前から悩んでいた問題で、ようやく一つの解き方を見つけたといった感じです。しかし、解き方は完全ではないし、他にもっとエレガントな解き方があるのではないかと思います。出題は「数学問題bot」からです。

-----

■ √2 + √3 + √5 + √7 が無理数であることを証明せよ (近畿大学第12回数学コンテスト)

まず、q を有理数として √2+√3+√5+√7 = q が成り立つとします。この両辺の二乗を計算します。

( √2+√3+√5+√7 )2
= 2 + 3 + 5 + 7 + 2_2:3 + 2_2:5 + 2_2:7 + 2_3:5 + 2_3:7 + 2_5:7
= 17 + 2_2:3 + 2_2:5 + 2_2:7 + 2_3:5 + 2_3:7 + 2_5:7 = q2 より

2:3 + 2:5 + 2:7 + 3:5 + 3:7 + 5:7 = q2 / 2 - 17 / 2

となります。但し、2_2:3 = 2√2√3 を表しています。このとき、右辺はやはり有理数となります。これをもう一度二乗します。

( 2:3 + 2:5 + 2:7 + 3:5 + 3:7 + 5:7 )2
= 6 + 10 + 14 + 15 + 21 + 35 + 24_2:3 + 20_2:5 + 16_2:7 + 18_3:5 + 14_3:7 + 10_5:7 + 6_2:3:5:7
= ( q2 / 2 - 17 / 2 )2 より

24_2:3 + 20_2:5 + 16_2:7 + 18_3:5 + 14_3:7 + 10_5:7 + 6_2:3:5:7 = ( q2 / 2 - 17 / 2 )2 - 101

となります。ここでも右辺はやはり有理数です。これを繰り返すと、左辺は常に 2:3, 2:5, 2:7, 3:5, 3:7, 5:7, 2:3:5:7 の線形結合で表され、右辺は常に有理数です。

左辺が ( K1_2:3 + K2_2:5 + K3_2:7 + K4_3:5 + K5_3:7 + K6_5:7 + K7_2:3:5:7 )2 のとき、これを展開すると

( 6K12 + 10K22 + 14K32 + 15K42 + 21K52 + 35K62 + 210K72 ) +
( 10K2K4 + 14K3K5 + 70K6K7 )_2:3 + ( 6K1K4 + 14K3K6 + 42K5K7 )_2:5 +
( 6K1K5 + 10K2K6 + 30K4K7 )_2:7 + ( 4K1K2 + 28K3K7 + 14K5K6 )_3:5 +
( 4K1K3 + 20K2K7 + 10K4K6 )_3:7 + ( 12K1K7 + 4K2K3 + 6K4K5 )_5:7 +
( 2K1K6 + 2K2K5 + 2K3K4 )_2:3:5:7

となるので、( K1, K2, K3, K4, K5, K6, K7 ) = ( 1, 1, 1, 1, 1, 1, 0 ) を初期値として二乗したときの式を無限に作成することができます。その中の 7 つの式を使って連立方程式を計算すれば、2:3 から 2:3:5:7 までの値を求めることができます。ところが、右辺は有理数なので、その解はやはり有理数になります。これは、2:3 から 2:3:5:7 までの値が全て有理数であることを意味します。しかし、これらは無理数であるため、最初の仮定に矛盾します。従って、√2+√3+√5+√7 は無理数です。

次に、この連立方程式が解を持つことを示さなければなりません。が、これは証明することができなかったので、実際に数値計算をしてみることにしました。まず、連立方程式の係数を求めるプログラムを作成します。

template<class T> void calcK( const std::vector<T>& k, std::vector<T>* res )
{
  if ( k.size() != 8 ) return;

  res->resize( k.size() );

  (*res)[0] = 6 * k[1] * k[1] + 10 * k[2] * k[2] + 14 * k[3] * k[3] +
  15 * k[4] * k[4] + 21 * k[5] * k[5] + 35 * k[6] * k[6] +
  210 * k[7] * k[7];
  (*res)[1] = 10 * k[2] * k[4] + 14 * k[3] * k[5] + 70 * k[6] * k[7];
  (*res)[2] = 6 * k[1] * k[4] + 14 * k[3] * k[6] + 42 * k[5] * k[7];
  (*res)[3] = 6 * k[1] * k[5] + 10 * k[2] * k[6] + 30 * k[4] * k[7];
  (*res)[4] = 4 * k[1] * k[2] + 28 * k[3] * k[7] + 14 * k[5] * k[6];
  (*res)[5] = 4 * k[1] * k[3] + 20 * k[2] * k[7] + 10 * k[4] * k[6];
  (*res)[6] = 12 * k[1] * k[7] + 4 * k[2] * k[3] + 6 * k[4] * k[5];
  (*res)[7] = 2 * k[1] * k[6] + 2 * k[2] * k[5] + 2 * k[3] * k[4];
}

int main( int argc, char* argv[] )
{
  std::vector<double> k( 8, 1 );
  k[0] = 8.5;
  k[7] = 0;
  std::vector<double> res;

  for ( unsigned int i = 0 ; i < 7 ; ++i ) {
    for ( std::vector<double>::const_iterator cit = k.begin() ;
          cit != k.end() ; ++cit )
      printf( "%f ", *cit );
    std::cout << std::endl;
    calcK( k, &res );
    k = res;
  }
}

初期値を 定数項 17 / 2、2:3:5:7 の係数をゼロ、その他を全て 1 として、( √2+√3+√5+√7 )2 をスタートとして最初の 7 つの方程式を求めます。すると、定数項を含めた係数行列は次のようになります。

( 定数項, K1, K2, K3, K4, K5, K6, K7 ) =
( 8.50000E+00, 1.00000E+00, 1.00000E+00, 1.00000E+00, 1.00000E+00, 1.00000E+00, 1.00000E+00, 0.00000E+00 )
( 1.01000E+02, 2.40000E+01, 2.00000E+01, 1.60000E+01, 1.80000E+01, 1.40000E+01, 1.00000E+01, 6.00000E+00 )
( 3.10760E+04, 1.09360E+04, 8.36000E+03, 7.25600E+03, 6.56800E+03, 5.73600E+03, 4.52000E+03, 1.61600E+03 )
( 4.75505E+09, 1.64307E+09, 1.27944E+09, 1.07266E+09, 1.05699E+09, 8.84475E+08, 6.80756E+08, 2.90082E+08 )
( 1.15754E+20, 4.06293E+19, 3.14194E+19, 2.66279E+19, 2.55509E+19, 2.16682E+19, 1.68184E+19, 6.76792E+18 )
( 6.88744E+40, 2.40734E+40, 1.86577E+40, 1.57542E+40, 1.52542E+40, 1.28776E+40, 9.96809E+39, 4.08898E+39 )
( 2.43947E+82, 8.53950E+81, 6.61344E+81, 5.59108E+81, 5.39745E+81, 4.56340E+81, 3.53560E+81, 1.44110E+81 )

定数項は右辺に移行すると、係数行列は 7 行 7 列の正方行列になります。Excel 等でこの行列式を計算すると、-7.97570E+135 という値になります。つまり、係数行列は非特異なので、この連立方程式は解くことができることになります。ちなみに、√2+√3+√5+√7 = 8.02808 を使って右辺の値を求めると

( 2.37251E+01, 4.61879E+02, 1.82256E+05, 2.84622E+10, 6.94340E+20, 4.13234E+41, 1.46368E+83 )

となり、係数行列の逆行列は

( -3.46178E-01, 8.39753E+00, -4.03202E+00, -6.10160E-04, 2.46200E-13, 1.08539E-33, -4.10863E-75 )
( -1.03701E+00, -3.55841E+01, 1.34416E+01, 2.11717E-03, -8.41981E-13, -3.72926E-33, 1.40945E-74 )
( 1.27076E-03, 1.74473E+01, -2.33385E+00, -5.04553E-04, 1.80766E-13, 8.28950E-34, -3.09690E-75 )
( -1.00712E-01, 1.20718E+01, 4.56727E-01, -5.46006E-05, 1.35736E-15, 3.40899E-35, -9.26729E-77 )
( 1.91843E+00, 4.77461E-01, -1.50246E+01, -1.83415E-03, 8.06807E-13, 3.46302E-33, -1.32290E-74 )
( 5.64193E-01, -2.80997E+00, 7.49210E+00, 8.86292E-04, -3.93149E-13, -1.68219E-33, 6.43262E-75 )
( -2.76518E-01, 6.01798E+00, -1.25341E+00, -3.04790E-04, 1.08388E-13, 4.99769E-34, -1.86434E-75 )

なので、逆行列と右辺の積から √6, √10, √14, √15, √21, √35, √210 の値が計算できます。

最後に、二つの ( 一つだけ 4 つのものもありますが ) 異なる素数の積の平方根が無理数になることの証明ですが、これは √2 が無理数であることの証明法を応用すれば簡単に求められます。

二つの異なる素数の積の平方根 √pq が有理数 m / n ( 但し m, n は互いに素 ) と等しいとします。両辺を二乗すると

pq = m2 / n2 より

n2pq = m2

なので、m は p, q の両方を素因数に持ちます。m = m'pq とすると、

n2pq = m'2p2q2 より

n2 = m'2pq

となります。ところが、これが成り立つためには n が p, q の両方を素因数に持たなければなりません。これは最初の仮定 ( m, n が互いに素である ) に反します。従って、 √pq は無理数であることになります。4 つの異なる素数の積の平方根が無理数であることも同様に証明できますし、任意の数の異なる素数の積の平方根について成り立つことも理解できると思います。

-----

例によって、合っているという保証は全くありません。気になるのが、素数の平方根を任意の数だけ加算したとき、それは必ず無理数になるのかどうかというところです。これが証明できれば上の問題も自明になるのですけどね。  

Posted by fussy at 21:05Comments(0)TrackBack(0)数学

2014年12月17日

寒い夜です

寒波の影響で寒いだけでなく風の強い一日でした。

今朝、家で飼っていた犬の「ココ」が息を引き取りました。腫瘍を患い、いろいろと治療をしてもらいましたが、最後には体中に転移してしまい、手の施しようがなかったようです。
元々は妹夫婦で飼っていた犬で、旦那さんの異動で近所に引っ越してきたのですがそこではペットを飼うことができず、家に引き取ってそこで妹が世話をしていました。真っ黒な犬で、小さい頃は後ろ足が不自由だったので最初はビッコをひいていました。元々活発な方で、手術して普通に歩けるようになってからは輪をかけてヤンチャになったような気がします。すごく元気だったのに、病気になってからは本当にあっという間でした。まだ年も若く、すごく残念です。しかし、一番ショックだったのは妹のほうでしょう。

ココの写真

7 年前ほど前に撮影した、まだ小さい頃の写真です。できればいっしょに年を越したかったですね。  

Posted by fussy at 23:07Comments(0)TrackBack(0)

2014年12月14日

今日は衆院選投票日

衆院選の速報を見ながら書いています。今回も自民党の圧勝になりそうな雰囲気です。

今まで「アルゴリズムのコーナー」で紹介してきたサンプル・プログラムの一部をライブラリとしてまとめて公開しました。ソースコードのみですが、将来的にはテスト用の簡単な実行ファイルなども用意しようと考えています。Windows 上でも動作するようにできればベストですね。
初期の頃はサンプル・ソースとしてダウンロードできるようにしていたのですが、ドキュメントにもソースの中身を掲載しているので管理が結構大変になって途中でやめていました。しかし、再利用するためにある程度コメントを付けて管理していたので、そのままにしておくのももったいないと思い再度公開することに。公開すると決めるとドキュメントも必要で、それを用意しているうちに細かい見直しなどもしたくなって、というように予定よりもかなり遅れてしまいましたが、一応今年じゅうにはまとめることができました。いや、まだ未完成もいいところなんですけどね。

今年はあと一回更新ができればいいなと思っていますが。少々厳しくなってきたように思います。最後まであきらめずに進めようとは思っています。

... 現在、与党が 248 議席。あと一つで安定多数です。  

Posted by fussy at 21:17Comments(0)TrackBack(0)

2014年12月07日

スタイルはいいに越したことは ...

寒い日が続きます。エアコンなしでは過ごせないくらいになってきました。

プログラムを作成するときの書き方は、そのコードを読みやすくする上で重要です。その規定は「スタイル」と呼ばれます。名前空間の使い方で悩んでいるところがあって検索してみたら、Google の「C++ スタイルガイド」というのを見つけました。「Google C++ Style Guide」日本語訳で、他のいくつかの部分でも非常に参考となるところがありました。もちろん、全てに無条件で賛成できるわけでもないので、7 割から 8 割程度くらいを取り入れてみました。
特に重要だと強調しているのが「読みやすさ」と「一貫性」で、これはその通りだと思います。日曜プログラミングのような場合はあまり意識せずに作り始めて後で後悔するというのが非常に多くて、まさに今の状況がそんな感じです。今日もいろいろと手直しをしていました。いつになったら終わるんでしょうか。  

2014年12月06日

素数定理とリーマン予想

今夜は猛烈に寒いですね。

今日から「NHK 白熱教室」で「オックスフォード白熱教室」が始まりました。最初のテーマは「素数」。ガウスの時代に予想された素数定理が、リーマンによって精度の高い式になる様子が音楽を使って説明されていました。非常にわかりやすい講義で、数学嫌いの方にもお勧めできる内容です。次回もぜひ見たいですね。

リーマン予想をテーマとした本に「素数に憑かれた人たち」というものがあります。これもなかなか面白い本でした。専門書の類ではないので内容もそれほど難しいことはなく、素数定理とゼータ関数の関係についてもわかりやすく説明してあります。もし興味のある方はぜひ読んでみてください。  

Posted by fussy at 01:09Comments(0)TrackBack(0)数学

2014年12月01日

仁義なき戦い

俳優の菅原文太さんが亡くなったというニュースを見た時は結構驚きました。昭和を代表する俳優がまたひとりいなくなってしまいました。合掌。

菅原文太といえば「仁義なき戦い」や「トラック野郎」が有名だと思います。しかし、どちらもまともに見たことがないです。印象に残っているのが「朝日ソーラー」のCM。「あさひそーらーじゃけん」というセリフが今も耳に残っています。最近では俳優業はほとんどしておらず、農業に力を入れていたそうですね。  

Posted by fussy at 23:35Comments(0)TrackBack(0)