前幾天看一個故事:
1970年,贊比亞的瑪麗·尤肯達修女給當時NASA太空航行中心的科學副總監恩斯特·史都林格博士寫信問道:“目前地球上還有這么多小孩子吃不上飯,你怎么還能舍得為遠在火星的項目花費數十億美元?”
史都林格很快給瑪麗·尤肯達修女回了信。大意是,很多看起來暫時無用的基礎科學研究,其實才是推動生產力和人類進步的最大力量。他這封真摯的回信隨后由NASA以《為什么要探索宇宙》為題發表。
高中上學的時候,學了很多當時覺得很無聊的東西,比如矩陣。感覺數學家們吃飽了撐得搞這些數字游戲。后來自己接觸了游戲行業,才知道原來這些枯燥無味的數字真的能夠解決很多實際問題。比如計算機圖形學,根本就離不開矩陣運算。
質數,可能很多人只是知道它的一個定義。但是我們為什么要在一堆自然數中尋找質數呢,這其實最早源於古希臘數學家們的直覺。從乘法的角度看,這些質數是最小的單位了,不能再被分解成兩個因數。而這樣特殊的一個數字群體,總有他特殊的意義。
就像我們的宇宙,存在着一些常數,普朗克常數,法拉第常數等等。那么是否有另外一個宇宙,存在着與我們不同各種常數呢?我們找到了這些特殊的數字,對理解我們所生活的世界是有很大幫助的。
那么如何取得質數呢?有很多種方法,最適合計算機的應該是埃拉托色尼篩法:
首先,列出從2開始的數。然后,將2記在素數列表上,再划去所有2的倍數。根據定義,剩下的最小的數——在這里是3——必定是素數。將這個數記在素數列表上,再划去所有它的倍數,這樣又會剩下一些數,取其中最小的,如此反復操作。最后剩下的都是素數。
作為一個碼農,我當然得把算法轉換為代碼:
<!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>
測試地址:
http://sjusttest.sinaapp.com/prime.html
最后順帶為ie9默哀: