流れる空の中で数学を。

とある数学好きの「手作りすうがく」と「気ままな雑記」。

【RSA暗号】試しに作ってみた【Python】

Amazon.co.jp: Yoshiki Ueoka:作品一覧、著者略歴

数学関連の絶版本・品切れ本をコチラから購入できます!

RSA暗号

自然数aを大きな素数の積N=pqと公開鍵と秘密鍵と呼ばれる自然数b,dを使う。b,Nのみを使って、aを暗号と呼ばれる別の数cにしたり、元に戻したりすること。

アルゴリズム

まず、素数b,p,qを決める。N=pqを計算する。ここで、素数p,qはヒミツにしておくのがポイント。ある自然数kを用いて、

bd=k(p-1)(q-1)+1

つまり、

bd\equiv \mod (p-1)(q-1)

を満たす。dを見つける。このd秘密鍵という。

自然数aを暗号化するには、

a^b\equiv c \mod N

を計算する。

元に戻すには、オイラーの定理 (数論) - Wikipediaより、

c^d \equiv a^{bd} \equiv a^{k(p-1)(q-1)+1}\equiv a \mod N

とすれば、元の数字に戻せる。

 

プログラム

以下のサイトを参考にプログラムを作成した。

tex2e.github.io

github.com

gist3fba0be9c42e5b712b6d72a4b25c71d0

 

 

【人工知能】考えるとは何かを考えてみた【知能と世界の関係概論】

Amazon.co.jp: Yoshiki Ueoka:作品一覧、著者略歴

数学関連の絶版本・品切れ本をコチラから購入できます!

考えるということ

考えるとはなんだろうか?

 

「我を思うゆえに我あり」とどこかの誰かがいったのを覚えている。つまり、考えるという行為Tは確かに存在する。

 

考えるという行為が存在する以上、考える対象と考えた結果が存在する。

考える対象を問題世界P、考えた結果を解答世界Sと呼ぶことにしよう。

 

すると、

P\rightarrow T\rightarrow S

という対応関係が考えるということの全容であるとまとめられる。

 

考えるは関数だろうか?

問題世界は、それが実在するかは別として、我々の五感を通して、存在している。ところが、赤いリンゴがひとつあるといっても、人によって、見え方は異なるし、リンゴは1つずつ違う。そこで、問題世界では「要素を考えられない」ということがわかる。つまり、問題世界は集合ではない。同様にして、解答世界も集合ではない。

これは、問題世界や解答世界に曖昧さが残っていることを意味している。

しかし、我々は日常生活を送ることができているのは、ある種の解釈を行っているからだと考えられる。そして、問題世界から解釈された世界への対応関係が存在するわけだ。解釈Iされた世界をモデルと呼ぶことにして、M,M'などと書こう。このモデルは集合だと直感的に考えられる。ここまでをまとめると、考えるということは対応

P\rightarrow I\rightarrow M\rightarrow T\rightarrow M'\rightarrow S

を考えることになる。

こうなってくると、話は違ってくる。つまり、考えるTとはモデルMからモデルM'への関数だと言えるのだ。

T\colon M\rightarrow M'

 

モデルの階層構造

さて、モデルは人によって、状況によって、考えようとしていることによって、臨機応変に変わってくる。つまり、ある種の階層構造を持つと考えられる。そこで、解釈もモデルの数だけ存在することになる。つまり、解釈の列I_1,I_2,\cdots,I_{N-1},J_1,\cdots,J_{L-1}とモデルの列M_1=I,\cdots,M_N,M'_1,\cdots,M'_{L}が存在して、

I_j \colon M_j \rightarrow M_{j+1}

J_j \colon M'_j \rightarrow M'_{j+1}

 となると考えられる。

よって、ここまでの対応関係をまとめると、解答世界が問題世界に影響を及ぼすことまで考慮すると、考えることと世界の関係は、

P\rightarrow M_1\rightarrow \cdots M_N \rightarrow T\rightarrow M'_1\rightarrow \cdots M'_L \rightarrow S \rightarrow P

というループ構造をなすことがわかる。

 

ディープラーニングとは何か素人なりに考えてみた

ディープラーニング人工知能と呼ばれているが、ここで述べたどこの部分に対応するか考えてみよう。画像認識や将棋などでは、考える関数Tの定義域は1つに定められている。つまり、M_Nから始めている。このとき、

 M_N \rightarrow T\rightarrow M'_1\rightarrow \cdots M'_L

の部分がディープラーニングのやっていることにあたると考えられる。ここで、M_N,M'_1,\cdots,M'_{L}は相当に単純化された数学的構造物になっている。特に、最終出力M'_{L}は、単純な数値の集合である場合がほとんどである。

 

何が一番難しいか?

人間が考えるということに限定して、考えるということを考えてみる。すると、最初の問題世界からモデルへの対応は五感ということになる。これは数学的に作ることができるだろう。つまり、問題世界Pから最初のモデルM_1への対応は作れなくない。

しかし、ディープラーニングの例でみたように、難しいのは考える直前に至るモデル化の列の構成方法

P\rightarrow M_1\rightarrow \cdots M_N

である。

 

結局、人間が人工知能として作り得ることとは?

まず、問題世界Pから最初のモデルM_1への対応を疑似的な五感によって、数学的に作れたとする。後は、モデルの解釈の列をいかにして作るかが問題となる。

今一度かんがえるということと世界の対応関係を書いておこう。

P\rightarrow M_1\rightarrow \cdots M_N \rightarrow T\rightarrow M'_1\rightarrow \cdots M'_L \rightarrow S \rightarrow P

モデルは考えることの目的によって、適切に変える必要がある。これが俗に言う臨機応変というやつであって、人間にできて現時点で機械にできないことである。

このことを数学的に表すと、次のセルフコンシステントな関数列をうまく構成することが人工知能を作ることに当たると言える。

 

 

I_j(M,M') \colon M_j \rightarrow M_{j+1}

J_j(M,M') \colon M'_j \rightarrow M'_{j+1}

M=\{ M_1,\cdots,M_N\}

M'=\{ M'_1,\cdots,M'_L\} 

 

この関数とモデルをセルフコンシステントに決定するということが今後の人工知能の課題であると言えると思う。

そして、各モデルの集合としては、できるだけ広く大きなものを取る必要があるということだ。

ディープラーニングでは、この点がどこまで意識されているかはわからないが、多層のネットワークを作ることでモデルと関数をセルフコンシステントに構成しようとしていることだとわかる。しかし、どこまでこのセルフコンシステント性が意識されているかは謎である。

 

これ以上踏み込むと、本格的に研究することになるので、「知能と世界の関係概論」としてはここまでで十分だろう。

具体的に、解釈関数とモデルの列をうまく構成する方法があれば教えていただきたい。

【Unity】離散的な移動の向きに合わせてキャラが向きを変えるスクリプト(コード)【C#】

向きの反転ではまったのでうまく書けたのを残しておきます。

やりたかったことは、左キーを入力すると左に移動しつつ左を向き、右キーを入力すると右に移動しつつ右を向くということです。これが案外調べてもなかなかわからず、結局、本の情報をもとに自力で書いたので、情報共有しておきます。

 

gist9a6b60bb65845f73810a95a016c39b0c

github.com

【高速化希望】1~6枚の擬ポリオミノの探索【Python】

ポリオミノ

1~6枚の正方形からなる擬ポリオミノの種類数を計算しました。

1枚⇒1種類

2枚⇒2種類

3枚⇒6種類

4枚⇒34種類

5枚⇒166種類

6枚⇒991種類

1枚増えるごとに、およそ5倍から6倍増えていることが分かる。

プログラム

gist60f2d692cf798e0828e5085fa4a06678

 

参考予定文献

 

 

【完成!】擬ポリオミノ探索プログラム【やったぜ!】

追記:2021/08/15/20:36完成しました!

ポリオミノ探索プログラムを作成しました

4つの正方形の場合までしか、計算してませんが、実装してある関数を使えばより多くの場合もそのまま計算できます。一応、グラフで図示してます。 

プログラム

追記:反転したものを同一視する場合にも対応しました。(2021/08/15/18:58)

追記:軽微なバグを修正しました。(2021/08/15/19:44)

github.com

 

gist74c261334120e20a9d911e41e7381acb

 

 

参考予定文献

 

 

【協力求む】擬テトリミノの探索プログラム【未完成】

擬テトリミノ

四つの平行移動で移りあう正方形を考える。この4つの正方形の内どの1つをとってきても、必ずほかの正方形と頂点または辺で接している。このような図形を擬テトリミノというらしい。特に、平行移動と回転で移りあう図形は同一視するものとする。これは噂によると34種類あるらしい。

 この擬テトリミノを全て探索するプログラムを作成しようとした。

ところが回転のプログラムがうまくかけていないのがおそらく原因で、177通りまでしか絞り込めなかった。

このプログラム完成させてくれる親切な人が現れないかと期待して、公開リポジトリに置いておきます。

 

未完成のプログラムその1

github.com

gistf1213cd2ad614103ed3ce24415978d3b

 

未完成のプログラムその2

 

github.com

 手動で解を列挙したtwitterの人

貝殻を食べるさんが列挙してくれたので、載せさせていただきます。

mobile.twitter.com

おそらく解が載ってあるだろう本

twitterでこの擬テトリミノに詳しい本があると聞いたので、リンクを貼っておく。

 

 

【ファルティングスの定理】なぜ楕円曲線は3次なのか?【フェルマーの最終定理】

楕円曲線

BSD予想で、問題になっているのは、2変数有理数係数方程式

y^2=x^3+ax+b

が「どれだけたくさんの有理数解を持つか?」ということである。

さて、ここで自然に生じる疑問がなぜ、yについて2次でxについて3次の方程式だけにそんなに注目しているかということだ。

この疑問に答えてくれるにはまず、代数曲線の種数という概念を抑える必要がある。なお、今回は話の流れだけを抑えることにしょう。

 

種数

簡単のため考えている代数曲線が「特異性」を持たないと仮定する。

このとき、代数曲線の種数gは代数曲線を表す多項式の最高次数の項の次数をdとするとき、

g=\frac{1}{2}(d-1)(d-2)

と表せる(代数曲線 - Wikipedia)。

 

楕円曲線の場合、d=3なので、「特異性」を持たない楕円曲線の種数gは、

g=\frac{1}{2}(3-1)(2-1)=1

となる。

フェルマーの最終定理の場合は、特にd\ge 4の場合、

x^d+y^d=1

有理数解と問題を置き換えられるので、種数は、

g=\frac{1}{2}(d-1)(d-2)\ge 2

となる。

 

ファルティングスの定理

1922年、Mordellは代数曲線の種数がその有理数解の個数に関連しているという予想した。この予想は1983年Gerd Faltingsにより、証明されたので、現在ファルティングスの定理と呼ばれている。

ja.wikipedia.org

まず、種数gが0の場合、(特異性を持たない)代数曲線の有理数解は全く存在しないか無限個である。

次に、種数gが1より大きい場合、(特異性を持たない)代数曲線の有理数解は有限個である。

このことの応用として、フェルマーの最終定理d\ge 4のとき、たかだか有限個の解しか持たないことがすぐに従う。d=3の場合は種数1になるので、このようなことはすぐには言えない。

 

最後に、種数gが1の場合は、楕円曲線に相当し、この場合どれだけ多くの有理数解を持つかは明らかではない。

 

このような種数が1であるという理由から、楕円曲線だけが特別に重要な対象として研究されている。そして、有理数解の個数について、解析学代数学2つの世界からの見方ができるという予想がミレニアム問題の1つであるBSD予想なのだが、話し出すと長くなるので(今は勉強不足なので)、この記事は一旦ここでお開きにします。