素数判断算法(python实现)

素数是只能被1与自身整除的数,根据定义,我们可以实现第一种算法。

算法一:

def isprime(n):
    if n < 2: return False
    for i in range(2,int(math.sqrt(n))+1):
        if n % i == 0:
            return False
    return True

任意一个合数都可分解为素数因子的乘积,观察素数的分布可以发现:除 2,3 以外的素数必定分布在 6k (k为大于1的整数) 的两侧。6k % 6 == 0, (6k+2) % 2== 0,(6k+3) %3==0,(6k+4)%2==0,

所以2,3外的素数形式只能写成  6k+1 或 6k-1的形式。据此,我们可以缩小因子范围。

算法二:

def isprime(n):
	if n == 2 or n == 3:
		return True
	if n % 2 == 0 or n % 3 == 0:
		return False

	for k in range(6,int(math.sqrt(n)) + 2, 6):
		if n % (k-1) == 0 or n % (k+1) == 0:
			return False
	return True

  

建立一个大小为n的数组,初始值置为真。从2开始设置步长(length)直至n的平方根,将length*i (i > 1) 的值置为False。这就是埃拉托斯特尼筛法的基本思想。适用于筛选小于n的所有素数,算法如下:

算法三:

def isprime(n):
    r = [[i,True] for i in range(1,n+1)]
    r[0] = [1,False]
    for i in range(1,int(math.sqrt(n))):
        j = i * 2 + 1
        while j < len(r):
            r[j] = [j+1,False]
            j += i + 1
    return r

费马小定理: ap-1 = 1 (mod p) ,其中gcd(p,a) = 1 且 p 为素数

p为素数时等式一定成立,但使等式成立的p不一定都是素数,但非素数p数量极少,称之为伪素数。

任意大素数n可写成 n = u * 2t  + 1, 其中 t 为 大于1 的整数,u为奇数。a n - 1 = (au)2^t, 求出au 后,连续t次平方即可求得。

算法四:

def isprime_fourth(n):
    if n == 2: return True
    if n % 2 == 0: return False
    # 若n为大于2的素数,形式可写成 n=u*(2^t) + 1, t >= 1 and u % 2 == 1
    t = 0
    u = n - 1
    while u % 2 == 0:
        t += 1
        u //= 2

    # 随机选择底数,若n为素数,gcd(a,n)==1
    a = random.randint(2,n-1)
    # 若n为素数,则a^(n-1) % n == 1;先计算 a^u % n,再连续t次平方可得
    r = pow(a,u,n)
    if r != 1:
        while t > 1 and r != n-1:
            r = (r*r) % n
            t -= 1
        if r != n - 1:
            return False
    return True

原文地址:https://www.cnblogs.com/glad007/p/10808409.html

时间: 2024-10-16 05:01:34

素数判断算法(python实现)的相关文章

素数判断算法(基于python实现)

素数是只能被1与自身整除的数,根据定义,我们可以实现第一种算法. 算法一: def isprime(n): if n < 2: return False for i in range(2,int(math.sqrt(n))+1): if n % i == 0: return False return True 任意一个合数都可分解为素数因子的乘积,观察素数的分布可以发现:除 2,3 以外的素数必定分布在 6k (k为大于1的整数) 的两侧.6k % 6 == 0, (6k+2) % 2== 0,

判断一个数是否为质数/素数——从普通判断算法到高效判断算法思路

定义:约数只有1和本身的整数称为质数,或称素数. 计算机或者相关专业,基本上大一新生开始学编程都会接触的一个问题就是判断质数,下面分享几个判断方法,从普通到高效. 1)直观判断法 最直观的方法,根据定义,因为质数除了1和本身之外没有其他约数,所以判断n是否为质数,根据定义直接判断从2到n-1是否存在n的约数即可.C++代码如下: bool isPrime_1( int num ) { int tmp =num- 1; for(int i= 2;i <=tmp; i++) if(num %i==

有关素数判断的一些算法(总结&amp;&amp;对比)

素性测试是数论题中比较常用的一个技巧.它可以很基础,也可以很高级(哲学).这次主要要介绍一下有关素数判断的奇技淫巧 素数的判断主要分为两种:范围筛选型&&单个判断型 我们先从范围筛选型这种常用的开始讲起,这里采用模板题Luogu P3383 [模板]线性筛素数来进行测试 1.埃氏筛 这是最常用的筛法了,思路也很简单:任何一个素数的倍数都是合数 然后我们O(n)扫一遍,同时筛去素数的倍数 但是有一些数如6,会被2和3都筛去一次,就造成了效率上的浪费,所以复杂度经证明为**O(n log lo

模板C++ 02数论算法 1最大公约数 AND 2素数判断

2.1最大公约数Greatest Common Divisor 补充知识:x*y=最小公倍数*最大公约数 int Euclid(int a,int b) { if(b==0) return a; return Euclid(b,a%b); } 2.2素数判断Prime #include<cmath> bool Prime(int n) { int t=sqrt(n); for(int i=2;i<=t;i++) if(n%i==0) return false; return true;

POJ 1811 大素数判断

数据范围很大,用米勒罗宾测试和Pollard_Rho法可以分解大数. 模板在代码中 O.O #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> using namespace std; __int64 pri[]= {2,3,5,7,11,13,17,19,23,29,31};//用小素数表做随机种子避免第一类卡米

Miller-Rabin素数测试算法

由费马小定理可以知道,若p是素数且a是整数,则满足a^p==a(mod p).若存在正整数a不满足a^p==a(mod p),那么n是合数. 定义:令a是一个正整数,若p是合数且满足a^p==a(mod p),则p称为以a为基的伪素数. Miller-Rabin素数测试算法原理: 假如p是素数,且(a,p)==1,(a为任意小于p的正整数),那么a^p-1==1(mod p).如果a^p-1==1(mod p), 则可认为n是素数,取多个底进行试验,次数越多,n为素数概率越大.(我的个人理解多次

实现100以内的素数输出(Python与C++对比)

今天从链接http://www.2cto.com/kf/201302/187699.html中看到了Python实现100以内的素数输出的算法,颇受感触.尤其是被其中的Python的列表生成器的使用方式帅到了! 看完Python的算法实现之后,先是回到老本行用C++实现了一遍,通过对比,你就可以发现Python真的是太简洁了!!! 1 /* 2 题目:100以内的素数输出算法验证 3 时间:2015年9月11日 4 作者:LeonWen 5 */ 6 7 #include "stdafx.h&q

FP-Growth算法python实现之频繁项集的挖掘

本文主要介绍从FP-tree中提取频繁项集的算法. 更多请见:FP-Growth算法的介绍.FP_Growth算法python实现.FP-Growth算法python实现之 FP-tree的构造. tree_miner.py代码: #coding=utf-8 import tree_builder import copy class Tree_miner(object): """tree_miner类. 作用:对Tree进行频繁项集的挖掘"""

DFA最小化 -- Hopcroft算法 Python实现

问了 30 个技术群,也问了无数的前辈,真是各种不礼貌,吃了无数闭门羹,还是自己看着有点眉目了 还有 wiki 的伪代码看了总觉得奇怪,于是看了同一页面其他语言翻译过来的伪代码, 发现葡萄牙语和俄罗斯语那里的 if 判断都还缺少一个条件 国内的资料比较少,这几份学习资料不错,比我稀里糊涂的思路要好,分享下: http://www.liafa.univ-paris-diderot.fr/~carton/Enseignement/Complexite/ ENS/Redaction/2008-2009