Project EulerをC++で
前の記事にも書いたけど,C++を研究で使うことにしたので,その勉強,というか慣れるためにProject Eulerを始めてみました.
Project Eulerとは,用意された数百のプログラミング課題を解いていくもので,解いた問題数や,様々な条件をみたすことで,レベルやAwardを得ることができます.なんか,個人的にレベルとかそういうのがあると燃えるもので,これを触媒として頑張ってみようと思います.まぁ,答え合わせは解答の値を送信するだけなので,コードがきれいかどうか,効率がいいかどうかは判定されません.ですので,Project Eulerのレベル=プログラミングスキルとは言えないのですが,まぁゲーム的な感覚で楽しみたい方にはおすすめです^^ また,様々な人が自分のアルゴリズムなどを紹介しているので,それを参考にして自分のスキルを向上させてもいいかもしれませんね.
問題を解く際にはどんな言語でやってもいいのですが,個人的な理由でしばらくはC++縛りでやってみようと思います.でもまぁ「解けない!」とか思ってしまったらPythonさんに登場してもらおうかな...(笑
とりあえず,今日は3問解いてみました.やっとC++に慣れてきたかなぁ...ブログのサイドバーにバナーを貼ってしまったので,サボってるのがバレないように暇を見つけてやってみたいと思います.
gcc4.6.2の手動インストールメモ
普段の研究にはPythonを用いているのですが,どうも大規模データを扱うには不向き(というか遅い)のでC++でコーディングすることにしました.とりあえず研究室の実験サーバの環境を知ろうと思って,gccのバージョンを調べてみたら4.1.2でした.2006年にリリースされているバージョンを使っているのかー,どうしようと思ったのですが,せっかくだし最新版を使いたいということで,gcc4.6.2をインストールすることに.でもsuじゃないから,aptitudeでらくらくインストールはできないので,自分のディスク領域に手動インストールをします,というところで少々困った部分が生じたのでメモ.
GMP,MPFR,MPCのインストール
簡単にいえば,gccをビルドするには,GMPとMPFRとMPCというライブラリが必要なので,gccのビルドに先んじてこの3つをインストールする必要があるんですねー.
インストール先を,自分の書き込み権限がある場所にしたい場合は,以下のようにして
インストールしたい場所を指定してください.
INSTALL_PATHの部分に/usr/localを指定すると,make installした時のインストール先が/usr/local以下になります.
$ ./configure --prefix=INSTALL_PATH $ make -j8 $ make install -j8
-j8は並列化することでmakeを高速化するためのオプションです.
この場合は8並列まで許容しています.
マルチプロセッサの環境では,処理が劇的に早くなることがありますので,是非.
以下,マニュアルより.
-j jobs
同時に実行できるジョブ(コマンド)の数を指定する。-jオプションが複数個指定された場合は、最後の指定が有効になる。引き数無しで -jオプションが与えられた場合、makeは同時に実行できるジョブの数を制限しない。
基本的にここまでは問題有りませんでした.
gccのインストール
次に,本命のgccをインストールします.
このとき,上記で各ライブラリのインストール先を変更している場合は,GMP_PATHなどの部分にインストール先へのパスを指定してください.
./configureののちにmakeします.
$ ./configure --program-suffix=-4.6 --prefix=INSTALL_PATH --with-gmp=GMP_PATH --with-mpfr=MPFR_PATH --with-mpc=MPC_PATH $ make -j8
ここで,問題が発生しました.
makeが以下のようなエラーを吐いて止まってしまいます.
libgmp.so: could not read symbols: File in wrong format
見たことのないエラーだったのでエラーメッセージをコピペして検索.
が...あまり情報がなく2時間ほど様々なサイトをぐるぐる回った末にこのサイトに行きつきました.
どうやら,libjavaというコンポーネントをビルドしようとするときに32bitと64bitのGMPを両方共呼びだそうとするバグが原因のようです.
解決方法も付記されていたので試してみたところこれがビンゴ!
--disable-libjavaというオプションを./configureの段階で指定することで,エラーを回避できるようです.なんとかインストールすることができました.
最後に,エラーを回避する場合のコマンドを書いておきます.
$ ./configure --program-suffix=-4.6 --prefix=INSTALL_PATH --with-gmp=GMP_PATH --with-mpfr=MPFR_PATH --with-mpc=MPC_PATH --disable-libjava $ make -j8 $ make install
あー,すごく時間取られた...
でも,解決できただけマシか.