小谈素数

素数,又称质数、Prime Number,就是只能被1和它自己整除的正整数。
素数本身的特殊性质决定了其应用的广泛性,比如作为哈希函数的基数或是加密函数共钥的参数。因此,素数的问题也是平时讨论中比较多的。

一个比较常见的问题就是,如何判断一个数(假设为N)是否为素数?本文对常用的几种进行比较:
[quote]第一种比较朴素的方法是采用0到N-1的所有整数去尝试整除N,如果其间有任意的数能被N整除,说明N是合数,否则输出素数。[/quote]
事实上,并不需要遍历小于N的所有整数,其实只要遍历小于sqrt(N)的所有整数即可。为什么这样说呢?这里我们可以用反证法加以证明,假设我们采用前述方法进行遍历,直到遇到某个k>sqrt(N),才能被N整除,这样,必然存在一个整数l=N/k,l<sqrt(N),l同时也能被N整除,而在这种情况下,l肯定在k之前就被测试过了,这样就与前面的假设相矛盾了;因此就诞生了第二种优化的方法,如下:
[quote]第二种方法,遍历2以上到N的平方根以下的每一个整数,是不是能被N整除[/quote]
与欧几里得同时代的数学家埃拉托色尼首先给出了求素数的方法,现在人们称之为“埃拉托尼筛子”。他求素数的方法如下。首先从2开始,写出自然数:2,3,4,5,6,7,8,9 … 100,然后,把其中的一切合数划去,划掉合数的原则是,在这一列数中,第一个数2满足素数的定义,把它保留下来。随后把能被2的倍数都划去,因为它们都是合数。接着在数2后的没有被划去的第一个数是3,因为它只被1和它本身整除,所以它是一个合数,把它也划去。剩下没有被划去的第一个有选举权是5,它只能被这和它本身整除,所以它也是一个素数。如此连续不断地划下去,最后剩下的数都是素数。为什么把这种方法叫做“厄拉多塞筛子”呢?因为厄拉多塞在求素数时,把自然数写在一块白蜡的木板上,并逐个在写着合数的位置上刺一个孔,这样白蜡板上被刺了很多的小孔,好像一个筛子。把所有的合数“筛掉”剩下的就都是素数。用“埃拉托尼筛子”可得到100以内的25个素数:2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97。这里得到的启示是,我们不需要像前面那样,“遍历2以上到N的平方根以下的每一个整数,是不是能被N整除”,从而引出了方法三
[quote]第三种方法,遍历2以上到N的平方根以下的每一个整数,是不是能被N整除;如果不能被N整除,同时也就排除了该整数的倍数,将其从待除数队列中删除;如此可将耗费性能的除法运算消耗进一步压缩[/quote]
使用“埃拉托尼筛子”方法在黑板上筛选数字的时候,我们发现,方法三中去除的都是合数,留下的都是素数;如果我们事先知道某段区间的素数(事实上,<2000将会使个不错的范围),则可以将方法三进一步优化:
[quote]第四种方法,遍历2以上N的平方根以下的每一个素数,是不是能整除N;(这个方法是上面方法的改进,但要求N平方根以下的素数已全部知道)[/quote]
上述方法虽然实现巧妙,但对于实际中的大素数判断还是无能为力,例如:N=2^127-1是一个38位数,要验证它是否为素数,用上面几个不同的方法,假设计算机能每秒钟计算1亿次除法,那么方法三要用4136年,方法四要用93年……接下来将会介绍一种只需要1秒钟的方法——Rabin-Miller算法。首先来看一下费马小定理:
[quote]假如a是一个整数,p是一个素数,那么a^p与a相对于p同余;如果a不是p的倍数(互质),可以得到a^(p-1)除以p的余数恒为1[/quote]
我们可以来验证一下费马小定理,已知67是一个素数,而2^66mod 67=1。上述定理的逆命题又被称为中国猜测(中国数学家早于费马2000年提出),其描述为:2^(p-1)除以p的余数为1,可得出p是素数。很遗憾,该论断是错误的,比如p=341符合上述条件,却不是一个素数。因此我们修改中国猜测为如下推论:
[quote]对于给定的整数n,可以设计一个素数判定算法。通过计算d=2^(n-1)mod n来判定整数n的素性。当d不等于1时,n肯定不是素数;当d等于1时, n则很可能是素数,但也存在合数n使得2^(n-1)≡1(mod n)。[/quote]
可见,中国猜测只是素数判定的一个必要条件。有些合数也满
足费马小定理的条件。这些和数被称做卡米切尔数数,除341外,其余的卡米切尔数是561,1105,1729。Carmichael数是非常少的。在1~100000000范围内的整数中,大约只有255个卡米切尔数。

至于如何从费马小定理推导出Rabin-Miller算法,wiki上有很好的证明过程:
http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test

该算法的过程如下:
[list]
[*]首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
[*]选择一个小于p的随机数a。
[*]设j=0且z=a^m mod p
[*]如果z=1或z=p-1,那麽p通过测试,可能使素数
[*]如果j>0且z=1, 那麽p不是素数
[*]设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
[*]如果j=b 且z<>p-1,不是素数
[/list]
这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。

我们举一个例子来说明:

假设我们想知道n = 221是否为一个素数,首先我们将n − 1 = 220写成2^2*55,即s = 2以及 d = 55。我们随机选择一个a < n,比如说a = 174。接着进行如下计算:
a^2^0*d mod n = 174^55 mod 221 = 47 ≠ 1, n − 1
a^2^1*d mod n = 174^110 mod 221 = 220 = n − 1

由于此时220 ≡ −1 mod n,所以我们说221很有可能是一个素数,或者它(174)是一个很强的“伪素数”。我们打算再试一次,这一次取a = 137:
a^2^0·d mod n = 137^55 mod 221 = 188 ≠ 1, n − 1
a^2^1·d mod n = 137^110 mod 221 = 205 ≠ n − 1

这次137成了证明221是合数的见证人,尽管看起来很像一个素数,221其实是一个合数,因此为221 = 13 * 17:)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值