前回の[アルゴリズム]素数を求める~エラトステネスの篩~の改良版を作ってみた

前回作ったものは何も考えずにwikipediaさんに言われた通りそのままにやったのでやっぱり効率が悪かった。
しかも、ある数が素数かどうか調べるためにまたリストを走査しなきゃいけなかった。これは明らかに欠陥w

ってことでboolean配列にして添字の数が素数ならtrueとするようにした
こうするのが本当なんですよねきっとw


final int MAX = 1000000 + 1;
boolean[] primes = new boolean[MAX];
primes[2] = true;
for (int i = 3; i < MAX; i += 2) {
    primes[i] = true;
}
for (int i = 3; i * i < MAX; i += 2) {
    if (primes[i]) {
        for (int j = i * 2; j < MAX; j += i) {
            primes[j] = false;
       }
   }
}

やってることは前回と同じ
効率化のために2の倍数は最初から除外するようにした

前回のソースと今回のソースでどれだけ速度が違うかテストしてみました
100万までの素数を求めるまでの時間を計測
前回のと今回のを交互に実行、それぞれ合計11回繰り返し、一番遅かったものを除外
計10回の平均をとりました
これだけ繰り返してるとメモリの確保に時間がかかって大きな誤差が生まれるので
オブジェクト生成の時間は含めないことにしました

Test.java


import java.util.Iterator;
import java.util.LinkedList;
public class Test {
 public static void main(String[] args) {
  final int N = 10;
  long sum = 0, sum2 = 0;
  long time;
  long m = 0, m2 = 0;
  final int MAX = 1000000;
  System.out.println("\t前回\t改良版");
  for (int i = 1; i <= N+1; i++) {
   System.out.print(i + "回目\t");
   System.out.print(time = eratosthenes(MAX));
   m = Math.max(m, time);
   sum += time;
   System.out.print("\t");
   System.out.println(time = eratosthenes2(MAX));
   m2 = Math.max(m2, time);
   sum2 += time;
  }
  System.out.println("-------------------------");
  System.out.println("平均\t" + (sum-m)/N + "\t" + (sum2-m2)/N);
 }
 static long eratosthenes(int max) {
  LinkedList primes = new LinkedList();
  LinkedList numbers = new LinkedList();
  long time = System.currentTimeMillis();
  for (int i = 2; i <= max; i++) {
   numbers.add(i);
  }
  int prime;
  Iterator it;
  do {
   prime = numbers.getFirst();
   primes.add(prime);
   it = numbers.iterator();
   while (it.hasNext()) {
    if (it.next() % prime == 0)
     it.remove();
   }
  } while (numbers.getLast() > prime * prime);
  it = numbers.iterator();
  while (it.hasNext()) {
   primes.add(it.next());
  }
  return System.currentTimeMillis() - time;
 }
 static long eratosthenes2(int max) {
  int _max = max + 1;
  boolean[] primes = new boolean[_max];
  long time = System.currentTimeMillis();
  primes[2] = true;
  for (int i = 3; i < _max; i += 2) {
   primes[i] = true;
  }
  for (int i = 3; i * i < _max; i += 2) {
   if (primes[i]) {
    for (int j = i * 2; j < _max; j += i) {
     primes[j] = false;
    }
   }
  }
  return System.currentTimeMillis() - time;
 }
}

出力結果

前回	改良版
1回目	6309	20
2回目	6169	10
3回目	6209	10
4回目	6329	10
5回目	6349	10
6回目	6299	20
7回目	6339	10
8回目	6279	10
9回目	6299	20
10回目	6360	10
11回目	6449	10
-------------------------
平均	6294	12

違いすぎるw
前回のが効率悪すぎただけですねすいませんw

このエントリーを含むはてなブックマークはてなブックマーク - 素数を求める~エラトステネスの篩 2~ この記事をクリップ!Livedoorクリップ - 素数を求める~エラトステネスの篩 2~ BuzzurlにブックマークBuzzurlにブックマーク FC2ブックマークへ追加 Bookmark this on Delicious Digg This
FLASH OOP for ActionScript 3.0
Posted by ton in on 06 23rd, 2008| icon3No Comments »

もういっちょ紹介

FLASH OOP for ActionScript 3.0 FLASH OOP for ActionScript 3.0
(2008/07/03)
Flash OOP Japan

商品詳細を見る

こっちは7月3日発売
執筆者総勢16名の大作
めっちゃいろんなことが書かれてます
PV3とかFlashDevelopで開発とか・・・
ぜひ欲しいです
予約しとこうかな・・・・

このエントリーを含むはてなブックマークはてなブックマーク - FLASH OOP for ActionScript 3.0 この記事をクリップ!Livedoorクリップ - FLASH OOP for ActionScript 3.0 BuzzurlにブックマークBuzzurlにブックマーク FC2ブックマークへ追加 Bookmark this on Delicious Digg This
Adobe AIRプロフェッショナルガイド Windows & Macintosh対応 Adobe AIRプロフェッショナルガイド Windows & Macintosh対応
(2008/06/25)
クジラ飛行机

商品詳細を見る

6月25日発売
そろそろちゃんとAIRやらないとなーと思ってたのでちょっとほしい
著者はなでしこ開発者

本屋さんにあったら買おうw

このエントリーを含むはてなブックマークはてなブックマーク - Adobe AIRプロフェッショナルガイド Windows &#038; Macintosh対応 この記事をクリップ!Livedoorクリップ - Adobe AIRプロフェッショナルガイド Windows &#038; Macintosh対応 BuzzurlにブックマークBuzzurlにブックマーク FC2ブックマークへ追加 Bookmark this on Delicious Digg This

樹木曲線はフラクタルで木を再現したもので、コンピュータアートの分野では有名です
ある程度ランダムな要素を入れるとかなり現実の木に近くなります

※クリックでstart

Flash Player 10 にしてください

Line.as


package {
	import flash.display.Sprite;
	import flash.geom.Point;
	public class Line extends Sprite {
		public var startP:Point;
		public var endP:Point;
		public var distance:Number;
		public var angle:Number;
		function Line(startP:Point, endP:Point) {
			this.startP = startP;
			this.endP = endP;
			angle = Math.atan2(endP.y-startP.y, endP.x-startP.x);
			distance = Point.distance(startP, endP);
			graphics.lineStyle(0,0x000000);
			graphics.moveTo(startP.x, startP.y);
			graphics.lineTo(endP.x, endP.y);
			graphics.endFill();
		}
	}
}

TreeCurve.as


package {
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.events.Event;
	import flash.geom.Point;
	public class TreeCurve extends Sprite {
		private var list:Array = [];
		private const W:int = 300;
		private const H:int = 300;
		private const RAD:Number = Math.PI/8;
		private const a:Number = 0.75;
		function TreeCurve() {
			var line:Line=new Line(new Point(W/2, H), new Point(W/2, H*4/5));
			list.push(line);
			stage.addChild(line);
			stage.addEventListener(MouseEvent.CLICK,onClick);
			function onClick(event:MouseEvent):void {
				stage.addEventListener(Event.ENTER_FRAME,onEnterFrameHandler);
				stage.removeEventListener(MouseEvent.CLICK,onClick);
			}
		}
		private function onEnterFrameHandler(event:Event):void {
			var line:Line=list[0];
			list.splice(0, 1);
			if (line.distance <= 8) {
				stage.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
				return;
			}
			var p:Point = new Point(line.endP.x + line.distance * a * Math.cos(line.angle + RAD), line.endP.y + line.distance * a * Math.sin(line.angle+RAD));
			var newLine:Line = new Line(line.endP, p);
			list.push(newLine);
			stage.addChild(newLine);
			p = new Point(line.endP.x + line.distance * a * Math.cos(line.angle - RAD), line.endP.y + line.distance * a * Math.sin(line.angle - RAD));
			newLine = new Line(line.endP, p);
			list.push(newLine);
			stage.addChild(newLine);
		}
	}
}
このエントリーを含むはてなブックマークはてなブックマーク - フラクタル~樹木曲線~ この記事をクリップ!Livedoorクリップ - フラクタル~樹木曲線~ BuzzurlにブックマークBuzzurlにブックマーク FC2ブックマークへ追加 Bookmark this on Delicious Digg This
AIR1.1公開!その3
Posted by ton in AIR, ニュース on 06 18th, 2008| icon3No Comments »

AdobeAIR1.1についての記事です

CNET Japan 「Adobe AIR 1.1」公開、日本語に正式対応
@IT 日本語環境に対応した「Adobe AIR 1.1」登場
ITmedia 日本語に正式対応した「AIR 1.1」リリース
ITpro アドビシステムズが日本語環境に対応したAIR新版をリリース
IT-PLUS アドビ、日本語環境対応のAIRランタイム「Adobe AIR 1.1」を提供開始
マイコミジャーナル 日本語環境に正式対応した「Adobe AIR 1.1」がリリース

このエントリーを含むはてなブックマークはてなブックマーク - AIR1.1公開!その3 この記事をクリップ!Livedoorクリップ - AIR1.1公開!その3 BuzzurlにブックマークBuzzurlにブックマーク FC2ブックマークへ追加 Bookmark this on Delicious Digg This

« Previous Entries