閒聊質數

前幾天看一個故事html

1970年,贊比亞的瑪麗·尤肯達修女給當時NASA太空航行中心的科學副總監恩斯特·史都林格博士寫信問道:「目前地球上還有這麼多小孩子吃不上飯,你怎麼還能捨得爲遠在火星的項目花費數十億美圓?」算法

史都林格很快給瑪麗·尤肯達修女回了信。大意是,不少看起來暫時無用的基礎科學研究,其實才是推進生產力和人類進步的最大力量。他這封真摯的回信隨後由NASA以《爲何要探索宇宙》爲題發表。數組

高中上學的時候,學了不少當時以爲很無聊的東西,好比矩陣。感受數學家們吃飽了撐得搞這些數字遊戲。後來本身接觸了遊戲行業,才知道原來這些枯燥無味的數字真的可以解決不少實際問題。好比計算機圖形學,根本就離不開矩陣運算。app

質數,可能不少人只是知道它的一個定義。可是咱們爲何要在一堆天然數中尋找質數呢,這其實最先源於古希臘數學家們的直覺。從乘法的角度看,這些質數是最小的單位了,不能再被分解成兩個因數。而這樣特殊的一個數字羣體,總有他特殊的意義。dom

就像咱們的宇宙,存在着一些常數,普朗克常數,法拉第常數等等。那麼是否有另一個宇宙,存在着與咱們不一樣各類常數呢?咱們找到了這些特殊的數字,對理解咱們所生活的世界是有很大幫助的。測試

質數近來被利用在 密碼學上,所謂的 公鑰就是將想要傳遞的信息在編碼時加入質數,編碼以後傳送給收信人,任何人收到此信息後,若沒有此收信人所擁有的 密鑰,則解密的過程當中(實爲尋找素數的過程),將會由於找質數的過程( 分解質因數)太久,使即便取得信息也會無心義。
 
汽車 變速箱 齒輪的設計上,相鄰的兩個大小齒輪齒數最好設計成質數,以增長兩齒輪內兩個相同的齒相遇齧合次數的最小公倍數,可加強耐用度減小故障。
在害蟲的生物生長週期與殺蟲劑使用之間的關係上,殺蟲劑的質數次數的使用也獲得了證實。實驗代表,質數次數地使用殺蟲劑是最合理的:都是使用在害蟲繁殖的高潮期,並且害蟲很難產生抗藥性。
 
以質數形式無規律變化的導彈和魚雷可使敵人不易攔截。

那麼如何取得質數呢?有不少種方法,最適合計算機的應該是埃拉托色尼篩法ui

首先,列出從2開始的數。而後,將2記在素數列表上,再劃去全部2的倍數。根據定義,剩下的最小的數——在這裏是3——一定是素數。將這個數記在素數列表上,再劃去全部它的倍數,這樣又會剩下一些數,取其中最小的,如此反覆操做。最後剩下的都是素數。編碼

 

做爲一個碼農,我固然得把算法轉換爲代碼:spa

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
    <title>prime</title>
    <style>
        #wrap{
            width:320px;
            margin:0 auto;
            text-align: center;
        }
        #output{
            text-align:left;
        }
        var{
            color:red;
        }
    </style>
</head>
<body>

<div id="wrap">
    <h1>算質數</h1>
    <br>
    <div>
        <input id="max" type="text" />之內的質數
        <input type="button" id="button" value="計算" />
    </div>
    <br>
    <div id="output"></div>
</div>

<script>
var button_dom=document.getElementById("button");
var max_dom=document.getElementById("max");
var output_dom=document.getElementById("output");
button_dom.onclick=function(){
    var value=max_dom.value;
    output_dom.innerHTML="<var>計算中...</var>";
    if(value){
        //獲取質數數組
        var startTime=(new Date()).getTime();
        var arr=getPrime(parseInt(value));
        var nowTime=(new Date()).getTime();
        var time=(nowTime-startTime)/1000;
        //
        var str=arrToString(arr);
        str="<strong>"+value+"</strong> 之內的質數有<strong> "+arr.length+" </strong>個:<var>(計算耗時"+time+"秒)</var><br>"+str;
        //
        output_dom.innerHTML=str;
    
    }else{
        output_dom.innerHTML="<var>請輸入素數的範圍</var>";
    }
}
function arrToString(arr){//數組轉化爲字符串
    return arr.join(" ");
}
function getPrime(max){//獲取max之內的質數
    var num=[];
    var prime=[];
    for(var i=2;i<=max;i++){
        num[i-2]=i;
    }
    for(var i=0;i<num.length;i++){
        if(num[i]===0){continue;}
        var key=num[i];
        prime.push(key);
        deleByKey(num,key);    
    }
    return prime;
}
function deleByKey(arr,key){//刪除數組內可以被key整除的數
    var len=arr.length;
    for(var i=len-1;i>=0;i--){
        if(arr[i]%key===0){
            arr[i]=0;
        }
    }
}
</script>
</body>
</html>

測試地址:scala

http://sjusttest.sinaapp.com/prime.html

最後順帶爲ie9默哀:

相關文章
相關標籤/搜索