flash on 2014-11-22

by tepe
素数カウント
♥0 | Line 167 | Modified 2014-11-22 18:09:56 | MIT License
play

ActionScript3 source code

/**
 * Copyright tepe ( http://wonderfl.net/user/tepe )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/wjYv
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.events.Event;
    import flash.utils.*;
    public class FlashTest extends Sprite {
        
        private var tf:TextField = new TextField();
        private var tf2:TextField = new TextField();
        private var s1:Sprite = new Sprite();
        
        private var p1:primeList1 = new primeList1();
        private var p2:primeList2 = new primeList2();
        private var p3:primeList3 = new primeList3();
        private var p4:primeList4 = new primeList4();
        
        public function FlashTest() {
            
            
            addChild(s1);
            s1.y = 450;
            s1.graphics.lineStyle(0,0x0000ff,0.9);

            

            addChild(tf);
            tf.height = 465;
            tf.width = 465;
            tf.multiline=true;        
                      
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private var str2:String = new String();

        private var cnt:int=0;
        private var size:int = 1000;//1回で探索する数 
        private var time:int//時間計測
        private function onEnterFrame(e:Event=null):void{
            
            cnt++;
            //if(cnt%30 != 0)return;//処理速度調整
            
            var st:int = getTimer();//処理時間計測
            for(var i:int=0;i<size;i++){
                while(!p4.func()){}
                
                
            }
            
            var end:int = getTimer(); 
            time = end - st;
            s1.graphics.lineTo(cnt,-(time));
            
            var val:Number = (time/size)*100;
            if(peek<val)peek=val;
            

            draw();
            
        }
        
        
        
        private var scale:int=400;
        private var peek:uint=400;
        private function draw():void{
            

            s1.scaleX = 465/(cnt);
 

            if(scale<peek){
                scale++;
                s1.scaleY = 400/scale;
            }

            
            var str:String = ""; 
            var len:int = 30;
            if(p4.length<30)len = p4.length;
            for(var i:int=p4.length-len; i<p4.length; i++){                
                str += "prime["+i.toString()+"] = "+p4.prime(i).toString()+"\n";
            }

            tf.text = str;
        }

        


    }
}

import flash.display.*;
import flash.utils.*;

    class primeList1 {
        
        private var list:Vector.<uint> = new Vector.<uint>();//素数リスト
        private var n:int=0;//判定する整数
        
        public function primeList1(){
            init();
        }
        public function get length():uint{
            return list.length;
        }

        //素数取得
        public function prime(n:uint):uint{
            if(list.length<=n)return 0;
            return list[n];
        }

        
        //2の倍数での処理を省略
        private function init():void{
            //list.push(2);
            n = 1;
        }
        //素数探索1
        public function func():Boolean{
            n++;
            
            //リスト内の素数に引っかからなければ追加
            for(var i:uint=0;i<list.length;i++){              
                if(0 == n % list[i] )return false;//index  素数の倍数なら終了
            }
            list.push(n);
            return true;
        
        }
        
        
        
    }

///--------------------------------

    class primeList2 {
        
        private var list:Vector.<uint> = new Vector.<uint>();//素数リスト
        private var n:int=0;//判定する整数
        
        public function primeList2(){
            init();
        }
        public function get length():uint{
            return list.length;
        }

        public function prime(n:uint):uint{
            if(list.length<=n)return 0;
            return list[n];
        }
        
        //2の倍数での処理を省略
        private function init():void{
            //list.push(2);
            n = 1;
        }
        
        //素数探索2
        public function func():Boolean{
            n++;
            
            //リスト内の素数に引っかからなければ追加
            //リストの素数すべてを試す必要はない
            for(var i:uint=0;i<list.length;i++){               
                if(0 == n % list[i] )return false;//index  素数の倍数なら終了
                else if(n/list[i]<list[i])break;//これより大きい倍数の可能性はないので省略
            }
            list.push(n);
            return true;
        
        }    
    }
    
///--------------------------------    

    class primeList3 {
        
        private var list:Vector.<uint> = new Vector.<uint>();//素数リスト
        private var n:int=0;//判定する整数
        private var limit:uint = 0;
        
        public function primeList3(){
            init();
        }
        public function get length():uint{
            return list.length;
        }

        public function prime(n:uint):uint{
            if(list.length<=n)return 0;
            return list[n];
        }
        
        //2の倍数での処理を省略
        private function init():void{
            list.push(2);
            n = 1;
        }
        
        //素数探索3
        public function func():Boolean{
            n++;

            //リスト内の素数に引っかからなければ追加
            for(var i:uint=0;i<=limit;i++){
                if(0 == n % list[i] )return false;//index  素数の倍数なら終了
            }
            list.push(n);
            if( list[limit]*list[limit] < n ) limit++;
            return true;
        }
    }
    
///--------------------------------   

    class primeList4 {
        
        private var list:Vector.<uint> = new Vector.<uint>();//素数リスト
        private var n:int=0;//判定する整数
        private var limit:uint = 0;
        
        public function primeList4(){
            init();
        }
        public function get length():uint{
            return list.length;
        }

        public function prime(n:uint):uint{
            if(list.length<=n)return 0;
            return list[n];
        }

        
        //2の倍数での処理を省略
        private function init():void{
            list.push(2);
            n = 1;
        }
        public function func():Boolean{
            n+=2;

            //リスト内の素数に引っかからなければ追加
            for(var i:uint=1;i<=limit;i++){
                if(0 == n % list[i] )return false;//index  素数の倍数なら終了
            }
            list.push(n);
            if( list[limit]*list[limit] < n ) limit++;
            return true;
        }
        
        
        
    }