2012年12月18日火曜日

素数考察

俺には数学者が素数にハマる理由が良くわからない。



これを見ると、原子核のエネルギー分布とゼータ関数のゼロ点の間隔が
似た数式で表示されるらしい。

一応ゼータ関数がどんなものかくらいはぐぐったら分かった。
ゼロ点というのも分かった。
複素平面にゼータ関数の値を加えた3次元空間でゼータ関数の値が0になっている点を
つなぐと直線上に並んでいるということだろう。

でもね、素数ってもともと自然数という一直線上にあるじゃないですか。
色々変形して別の直線上に出てきたからって何が嬉しいんですか?
って思う。

原子核の方は良く分からんが、自然数が等間隔の要素の集合であるから、
物理にも”これ以上分割できないという単位”があれば
そのような単位をぎゅうぎゅうに押し詰めてやれば
自然数のように等間隔になる。
そのようなものが作る現象を数式で書いて変形とかしたら素数が出てくるのは当たり前ではなかろうか。
まあ物理だと3次元空間だからその変形はややこしいものになるだろうけど。

数学者によっては”素数を解けば人類は飛躍する”みたいな事を言ってる人が結構居るみたい。
なんじゃらほい。

素数生成アルゴリズムは多々あるけど、数学者が求めているのは
100番目の素数でも1000番目の素数でも一定時間で求める方法なのだろう。

それってさ
「今のところ逐次的処理を経なければ求められないとされる答えが逐次的処理を経ずに一発で出せたらすごい」
って一般的にいうんならすごいよ。
そんなことが出来たらすごいのは当たり前じゃん。
「何で素数なの?」ってところ。
世の中逐次的処理を経なければ求められない答え、そのような計算問題は多々あるよ。
その中で素数の何が特別なの?

1, 3, 5, 7, 9, 11
この数列だったら1000番目でも一発で分かるね。
ところが素数だと一発では分からない。なぜか?

まあそれは分からない。置いとく。

素数が自然界で現れやすいものである事を示す概念的なプログラムを書いてみた。

public class PrimeMaton extends TestCase {
private interface Calculation {
public void calculate(List<Integer> represented, List<Integer> base, Integer current);
}

private class Multiple implements Calculation {
@Override
public void calculate(List<Integer> represented, List<Integer> base, Integer current) {
for (Integer i : base) {
represented.add(i * current);
}
}
}

private class Addition implements Calculation {
@Override
public void calculate(List<Integer> represented, List<Integer> base, Integer current) {
for (Integer i : base) {
represented.add(i + current);
}
}
}

public List<Integer> multiple(int m) {
return calc(new Multiple(), m, 1);
}

public List<Integer> addition(int m) {
return calc(new Addition(), m, 1);
}

private List<Integer> calc(Calculation c, int m, int s) {
List<Integer> base = new ArrayList<Integer>();
List<Integer> represented = new ArrayList<Integer>();

for (int i = s; i < m; i++) {
if (!represented.contains(i)) {
base.add(i);
c.calculate(represented, base, i);
}
}

return base;
}
}

2つの記憶領域AとBがあり、自然数を次々と流し込まれながら
Bに含まれていなかったらAに入れる、
Aに新しい要素が入ってきたらAの要素と
網羅的に足しあわせて(あるいは掛けて)Bに入れる、
ということをやっていくだけでAに素数が溜まるのである。
(素数以外の要素も入ってくるがそれは規則的に消せる)

このプログラムは素数を完全に含む(Additionの方は2だけ含まない)数列を出力する。
素数じゃない数も含むが、まあ概念的なものなので良しとする。
こういう単純機械による逐次的処理で素数を求めれそうである。
このことは素数が自然界で出てきやすい数列であることを示している。

MultipleもAdditionもbaseの要素に網羅的にアクセスしている。
これが原因で素数は一発で求める方法が存在しないのである。
このcalculate()でのbaseへのアクセスを減らすほど高速な方法が存在する。

素数を一発で求める方法はあるのだろうか?
何にでもそんな方法があればあらゆる計算は時間0で完了しちゃう。
全てじゃなくても素数では一発で求めれる?

俺は出来ないと思うね。

時間の不可逆性という話がある。
3次元空間は上下左右に動けるのに時間は未来にしか行けないという問題。
これは未来にしか行けないだけではなく、加えて基本的に一定速度でしか行けないのである。

たぶん時間とは3次元空間と並べれるものではないのだ。
軸じゃないのだ。

でも、時間が遅くなるという話がある。
じゃあ光速で移動するコンピュータで計算をしたら遅くなったり速くなったりするのかな?
まあ、宇宙が閉多様体でない限り片方だけが光速になったら
吹っ飛んでいって二度と触れないけど。
時間が遅くなるなんていうくらいだからもしかしたら実質的に時間0で問題を解いちゃうような方法が存在するんだろうか?

素数を研究してわかりそうなのは、高速に解ける問題と解けない問題の判定方法、
要するに計算可能性理論じゃないの?って思う。

あと非可換幾何学って結局有向グラフなんじゃないの?って思った。
違うのかな?(笑)全然知らないで言ってるけど。

リーマン予想は結局は完全な素数定理が欲しいとか
素数の本質的意味は何かというような事だと思う。
まあ数学者が求めてるレベルがどんなものなのか良くわからない。
俺に分かる用語で言えば、n番目の素数を定数時間で求めるとか、
ある巨大な数nが素数かどうかを定数時間で判定するとかは無理な気がする。
自然数という集合上にそういう定数時間で予測できない数列が存在している理由は、
自然数とそれらの数列の関係が、
閉じていない平面と直線の関係みたいなものだからだ。
自然数の等間隔っぷりが閉じていない平面を現している。
閉じてない平面上の直線はループしない。
自然数の等間隔っぷりが何かを傾けないからだ。
その何かを幾何的に表現できたら面白いのだろうか。

少なくとも、素数は自然界で出てきやすい数列であるとは思う。
これは結構重要な事な気がする。
最も単純な機械による逐次的処理で算出する方法を考える事で
本質的な事が分かってくる、とか。

しかし、別の記事で書いた素数判定アルゴリズムを見ると、
もうこれ以上素数について何を知りたいんだって感じがする。
だって奇数の一部が素数で、素数じゃない奇数には周期性がある。
それだけじゃダメなんですかねぇ。
まあ周期が大量に出てくるからね。
でも周期が発生する周期も分かってるんだけどね。
まあどうなんでしょ。

また今度考えよう。

0 件のコメント:

コメントを投稿