闲聊质数

前几天看一个故事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默哀:

相关文章
相关标签/搜索