久々の更新です。
http://dev.team-lab.com/?itemid=207
こんな記事を見つけたので、挑戦してみました。
1000万番目の素数を出来るだけ早く出力する課題です。
素数を求める方法として有名なのが、エラトステネスの篩です。
ある範囲の自然数の数列を用意して、2の倍数のものを取り除く、次は3の倍数を、次は5、というようにして、合成数(約数が1と自身の値以外に存在する数)を取り除いていく方法です。
Wikipediaに分かりやすいgifアニメがあったので、イメージがつかみにくい人は、そちらを見ると良いかと思います。
エラトステネスの篩は、求めたい範囲が広くなれば広くなるほど、計算量がどんどん増えていきます。
今回は 10^7番目の素数を求めたいので、結構な範囲になります。(1.8*10^8ぐらい)
とりあえずC++で実装してみました。
char配列を2億個ぐらい用意して、要素の添字を、その要素の値としました。
あとは単純にforループを回して、2の倍数、3の倍数の要素にフラグを立てていくだけのプログラムでテスト。
そこそこ動くけど、何十秒もかかってる。
さっきの記事をもう一回見たところ、1位の人は1.4秒で出力してる!!!
改良の余地はたくさんあるらしいので、いろいろ試してみました。
最終的なコードがこれ。
https://gist.github.com/nekosan/a956c2794796750280ec
何を改良したかはコードから察して欲しい。(気力がないし、ぐぐると結構いろいろ出てきました)
配列からあらかじめ2の倍数のものを抜いたり、ループの回し方を変えたりしました。
最終的には、出力時間を0.9秒まで縮めることができました。(CPUはIntel Core i7 2.2GHz)
もうちょっと改良すれば縮められそうですが、疲れたので一区切りつけました。
単純に興味があってコードを書き始めましたが、結構勉強になりました。
演算子の処理時間とかを考えないといけないコードを最近書いてなかったので、いい復習になった気がします。
次もプログラミング関連の投稿になると思います。
そろそろ自分のHPぐらい持ってみたいものです。VPSとか借りようかな。
2015/05/14
登録:
投稿 (Atom)
人気の投稿
-
【2014/10/12 記事更新】 前回の記事( http://nekolab.blogspot.jp/2013/05/arduino.html )で、加速度センサ(ADXL345)を動かしてみました。 今回は、センサから得た値の計算をして、センサの傾きを検出してみよ...
-
秋月に売ってるIR2302ゲートドライバを使ったNchFETフルブリッジモータドライバです。 FETは、IR社の IRFB4410PBF (100V 96A 250W)を使っています。 IR2302 は、ハーフブリッジ用のゲートドライバです。 Nchの...
-
エアシリンダーなどを駆動するとき、欠かせないのが電磁弁。 ロボコンでも使っているのをよく見かけます。 僕もロボコンでエアシリンダを使うことになったので回路を設計したのですが、それについて書きます。自分用メモの意味合いが強いので、あしからず。 電磁弁は ...
-
どうも、Nekosanです。 モタドラ回路製作記事2回目です。 前記事ではドライバ回路の概要を記載したので、回路設計に入っていきます。 たくさんの数式が出てくるので、注意です。 言っても、四則演算ですが。 ドライバ回路の、ハーフブリッジを抜...
-
忘れそうなので自分用メモ。 ラジコン飛行機などに使われる小型のブラシレスモータを動かす、ESC(アンプ)をマイコンで制御したかったので、やってみました。 用意したもの ・ブラシレスモータ A2208-KV1400 ブラシレスモーター http://www.rc-e...
-
部の顧問の先生から、こんなモジュールを頂きました。 加速度センサ(ADXL345)と方位センサ( HMC5883L )とジャイロセンサ( ITG-3200 )が一つの基板にまとめられたモジュールです。 ストロベリーリナックスで売られてました。 一個で一万円ぐらいし...
-
どーも、Nekosanです。 今年の高専ロボコンのルール発表されましたね。結構前ですが。 今年はなかなか難しい課題な気がします、例年に比べて、ですが。 まあそれはいいのです。あんまりそのことをブログに書いちゃうとメンバーに怒られそうなのでこれぐらいで。 ロボ...
-
どうも、Nekosanです。 今まで何回かモータドライバについての記事を書いてましたが、回路設計メモを兼ねて、ブログ記事にしながら、設計をしようかと思います。 という訳で、第一号記事です。 まずは作ろうとしているモタドラの概要から。 概要 ブートスト...
-
Raspberry PiでI2Cを使って9軸センサー(MPU9150)を動かしてみました。 今後も使う可能性あるので自分メモです。 RasPiでI2Cを使うのに参考にした (丸パクリしたともいう) サイトは次のサイトです。 http://www.instructables...
-
どーも、Nekosanです。 またもや学校が忙しかったり、部活が忙しかったり、資格の勉強が忙しかったり、眠かったり、鬱になってたりで間が空いてました。 まあ今後もこんな感じが続くかもです。 できるだけ続けて書くようにがんばります。 ここ最近、ロボコンで使うドライ...