`
luotuoass
  • 浏览: 639236 次
文章分类
社区版块
存档分类
最新评论

实用算法实现-第 28 篇 素数判别

 
阅读更多

28.1 朴素的素数判别


28.2 素数筛选


28.3 Miller-Rabin随机性素数测试方法

28.3.1实例

PKU JudgeOnline, 1811, Prime Test.

28.3.2问题描述

判断一个数N (2 < N < 254)是不是素数,是素数就输出 “Prim”,否则输出其最小的因子。

28.3.3分析

这个题目考察的问题相当多,可以分为大素数的判别法、大数的分解两个问题。其中又牵涉到最大公约数的辗转相除求法(欧几里德算法)、模运算的性质(方幂模、模乘的实现)等。

这里N选取的范围恰到好处。输入的数不是很大,故此可以用__int64类型进行加、减、除、模运算。但是又要注意不能进行乘法运算,否则会溢出。

使用朴素的素数判别显然是不行的。这里需要使用概率算法:Miller-Rabin算法。其中Miller-Rabin需要求积的模和求乘方的模,这些都可以根据模的性质分解,使得计算不会溢出。

在完成素数判别之后,需要采用Pollard的rho启发式随机算法进行素数分解。该算法可能造成死循环。虽然死循环的可能性并不大,不幸碰到了就多提交几次。

最后完成的程序并不很优化,在JudgeOnline上提交只能用G++语言选项提交才能通过,耗时4000+ms。

28.3.4程序


28.4 实例

PKU JudgeOnline, 3126, Prime Path.

PKU JudgeOnline, 3006, Dirichlet's Theoremon Arithmetic Progressions.

PKU JudgeOnline, 2739, Sum of ConsecutivePrime Numbers.

本文章欢迎转载,请保留原始博客链接http://blog.csdn.net/fsdev/article

分享到:
评论

相关推荐

    【推荐】Matlab精选学习资料+练习源码大全+算法课件大合集.zip

    第28章 灰色系统理论及其应用 第29章 多元分析 第30章 偏最小二乘回归 附录二 Matlab在线性代数中的应用 附录四 判别分析 附录一 Matlab入门 蒙特卡罗算法案例 算法数论 图论算法及其MATLAB实现++完成 先进算法讲义 ...

    Python素数检测的方法

    本文实例讲述了Python素数检测的方法。分享给大家供大家参考。具体如下: 因子检测: 检测因子,时间复杂度O(n^(1/2)) def is_prime(n): if n &lt; 2: return False for i in xrange(2, int(n**0.5+1)): if n%i...

    [算法数论].裴定一.清晰版.pdf

    本书论述了算法数论的基本内容,其中包括:连分数、代数数域、椭圆曲线、素性检验、大整数因子分解算法、椭圆曲线上的离散对数、超椭圆曲线。本书的特点是内容涉及面广,在有限的篇幅内,包含了必要的预备知识和数学...

    对一个大于或等于3的正整数,判断它是不是一个素数

    C语言程序 对一个大于或等于3的正整数,判断它是不是一个素数

    输出100到200之间的全部素数

    通过vc++6.0,采用如下算法:让m被2到根号m除,如果m能被2到根号m之中任何一个整数整除,...然后才终止循环,在循环之后判别i的值是否大于或等于k+1,若是,则表明未曾被2到k之间任一整数整除过,因此输出“是素数”。

    《算法数论》作者: 裴定一 / 祝跃飞 出版年: 2002年

    本书论述了算法数论的基本内容,其中包括:连分数、代数数域、椭圆曲线、素性检验、大整数因子分解算法、椭圆曲线上的离散对数、超椭圆曲线。本书的特点是内容涉及面广,在有限的篇幅内,包含了必要的预备知识和数学...

    MATLAB语言常用算法程序集

    MATLAB语言常用算法程序集 书中4-17章代码,都是一些常用的程序 第4章: 插值 函数名 功能 Language 求已知数据点的拉格朗日插值多项式 Atken 求已知数据点的艾特肯插值多项式 Newton 求已知数据点的均差形式的牛顿...

    判断一个数 m 是否素数的方法

    算法解析:让m被2到根号m除,如果m能被2~根号m中任何一个整数整除,则提前结束循环,此时i必然小于或等于k...在循环之后判别i的值是否大于或等于k+1,若是,则表明未曾被2~k之间任一整数整除过,因此输出“是素数”。

    MATLAB常用算法

    各种数学算法的MATLAB实现 第4章: 插值 函数名 功能 Language 求已知数据点的拉格朗日插值多项式 Atken 求已知数据点的艾特肯插值多项式 Newton 求已知数据点的均差形式的牛顿插值多项式 Newtonforward 求已知数据...

    tictactoeleetcode-JavaPlayground:Java注解、线程使用、设计模式、算法训练等

    质数列表 更改为字符串 转换为二进制 斐波那契数列 问 GCF(最大公因数) 剪刀石头布 搜索算法(线性) 冒泡排序 模组计算器 重复删除器 转换为英里 找斜边 通过判别式求根 求几何平均值 检查号码原语 向后打印数字 ...

    c语言编写单片机技巧

    答:对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但不同的MCU厂家其...

    数据结构题

    1. 对一个算法的评价,不包括如下( )方面的内容。 A.健壮性和可读性 B.并行性 C.正确性 D.时空复杂度 2. 在带有头结点的单链表HL中,要向表头插入一个由指针p指向的结点,则执行( )。 A. p-&gt;next=HL-&gt;next; ...

    ACM巨全模板 .pdf

    1.数论 素数检验:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验 2.拉格朗日乘子法(求有等式约束条件的极值) 3.裂项(多项式分子分母拆分) 4.扩展欧几里得 (ax+by=c) 5.勾股数 (直角三角形三边长) 6....

    论文研究 - p级塔组的深层转移

    令p为质数。 对于任何有限的p组G,引入了从G中的索引(G:H)= p的最大子组H到派生子组G'的深度转移TH,G':H / H'→G'/ G“作为一种创新的工具,可以通过核族ùd(G)=(ker(TH,G'))(G:H)= p唯一地标识G。...

    python练习题20道实例.pdf

    Python兔子生兔子算法 Python水仙花数for循环应用 Python素数计算输出 Python计算皮球下落速度 Python简单数学计算 Python列表数据复制 Python日期格式应用 Python日期计算 Python时间格式化 Python数学计算 Python...

    ecfactory:SageMath库用于构建椭圆曲线

    该库执行算法以构造具有某些所需属性的椭圆曲线; 具体来说,它提供以下功能。 (通过Cocks-Pinch方法) (通过MNT曲线) 上面的每一项都作为Python模块打包在夹下的相应子。 在整个过程中,曲线E被指定为元组...

Global site tag (gtag.js) - Google Analytics