最近は院試が終わったのもあって毎日が(コーディングやらアルゴリズムの勉強やら論文読むのやらで)充実している日々を遅れています。
あ、院試は無事合格していました。来年からは東工大の情報理工学院所属です。
実は4月に始めた院試の勉強の最中もずっとやりたいと思っていたことがあります。
数論です。
この分野は本来工学とは全くと言っていいほど関係が無いpure math、つまり純粋な数学の研究分野でした。
現在使っている本も、数論とは芸術としての数学だと言っています。使ってるのはコレhttp://u222u.info/o0pM
しかしこの数論は、実は情報系のとある分野の方々から熱烈に興味を持たれている分野でも在ります。
そう、暗号です。RSA暗号とか、楕円曲線暗号とか。
ざっくばらんに言うと、RSAも楕円曲線も同じ、余りの世界でのある計算の難しさ、を根拠にして暗号を構成しています。
正直な所、エンジニアとしては、数論によって何故その計算が難しいのかを理解しなくても、その操作が難しいとだけ認めればそれを道具として様々な暗号/認証を組み立てることが出来るのですが、どうも知らないままだと無性に気持ち悪くてそれを教授に相談した所、じゃあ本買って勉強会しよう、という話になりました。
そして本日がその一回目で、自分が担当した内容だったのですが、その成果にちょっとプログラマ(もどき)としては悔しいというか、フンヌー!という感情に襲われたので日記に記しておきたいと思います。
本日の内容は、三角数と平方数が等しい場合、それを見つけよ、というものでした。
実はこれ、以前http://dixq.net/forum/viewtopic.php?f=3&t=17029で、みけCATさんに手伝ってもらったコードがあるのですが、それをちょっとだけ改良したものがこれ。
#include
#include
namespace mp=boost::multiprecision;
int bisearch(mp::cpp_int *b,mp::cpp_int tar,unsigned long long int s,unsigned long long int e)
{
unsigned long long int m;
/*
std::cout>n;
mp::cpp_int *b=new mp::cpp_int[n+1];
int temp;
for(i=1;i
#include
namespace mp=boost::multiprecision;
mp::cpp_int bisearch(mp::cpp_int tar,mp::cpp_int s,mp::cpp_int e)
{
mp::cpp_int mid;
mp::cpp_int tempmid;
/*
std::cout>tri;
std::cout>squ;
std::cout((tri+1)*(tri)/2))
{
tri=2*tri;
}
mp::cpp_int temp=1;
for(i=1;i
#include
namespace mp=boost::multiprecision;
int main()
{
int n;
std::cin>>n;
int i=1;
mp::cpp_int x1,y1,xk,yk,xkk,ykk,nk,mk;
x1=xk=3;
y1=yk=2;
nk=(xk-1)/2;
mk=(yk)/2;
std::cout<<mk<<","<<nk<<","<<mk*mk<<std::endl;
while(1)
{
xkk=xk*x1+yk*y1*2;
ykk=xk*y1+x1*yk;
nk=(xkk-1)/2;
mk=(ykk)/2;
std::cout<<mk<<","<<nk<<","<<mk*mk<<std::endl;
xk=xkk;
yk=ykk;
if(i==n)
{
break;
}
i++;
}
}
一見してわかるように、このプログラムは探索を行っているわけではありません。
数学的事実に基づいて、単に数の計算を行っているのです。
必死で考えたプログラムが数学者の発見によってこうも簡単に覆されるのは正直シャクに触りました。
もちろん、両者の出力が同じものとはいえ、内部でやっていることは全く違います。かたや探索でかたや生成だけです。比較するほうが間違っているとも言えます。
皆さんはどう思われるでしょうか?