首页 > 编程语言 >泛型编程素数

泛型编程素数

时间:2024-11-25 20:05:14浏览次数:13  
标签:斯特尼 False 编程 素数 泛型 埃拉托 True first

古希腊的数论

  • 目标
  • 图形数
  • 埃拉托斯特尼筛法
    • 准备工作
    • 代码
    • 测试
  • 埃拉托斯特尼Python
  • 比较
    • 代码
    • Python改成2N
  • 应用
    • 素数的判断
    • 匹配——散列法
  • 扩展头尾素数
    • 验证

目标

用埃拉托斯特尼筛法找201前的素数。把STL改成Python实现,对比之前的求素数算法。

泛型编程素数运行结果

图形数

毕达哥拉斯学派观察到,有些数字不能表现成矩形形状——两个边都大于一的矩形,这种数叫做素数或质数。这样就好理解了,之前一直想0,1为什么不是素数;是谁想到这样的数的,有来干什么的。其实0出现得很晚。

埃拉托斯特尼筛法

准备工作

古人早知道偶数都不是素数。所以筛前的表是从3开始的奇数。
P = [(True,(i+1)*2+1) for i in range(100)]
如图:

泛型编程素数筛前的表是从3开始的奇数

代码

def mark_sieve(first,last,factor):
    P[first]=False
    while(last-first>factor):
        first += factor
        P[first]=False
#template <RandomAccessIterator I,Integer N>
def sift(first,n):
    i = 0 #N i(0)
    index_square = 3 # N index_square(0)
    while index_square < n:
        # invariant: index_square = 2i^2 + 6i + 3
        if P[first]:
            mark_sieve(first+index_square,
                       first+n,
                       i+i+3)
        i += 1
        index_square = 2*i*(i+3)+3

测试

sift(0,100)
P
[(True, 3), (True, 5), (True, 7), False, (True, 11), (True, 13), False, (True, 17), (True, 19), False, (True, 23), False, False, (True, 29), (True, 31), False, False, (True, 37), False, (True, 41), (True, 43), False, (True, 47), False, False, (True, 53), False, False, (True, 59), (True, 61), False, False, (True, 67), False, (True, 71), (True, 73), False, False, (True, 79), False, (True, 83), False, False, (True, 89), False, False, False, (True, 97), False, (True, 101), (True, 103), False, (True, 107), (True, 109), False, (True, 113), False, False, False, False, False, False, (True, 127), False, (True, 131), False, False, (True, 137), (True, 139), False, False, False, False, (True, 149), (True, 151), False, False, (True, 157), False, False, (True, 163), False, (True, 167), False, False, (True, 173), False, False, (True, 179), (True, 181), False, False, False, False, (True, 191), (True, 193), False, (True, 197), (True, 199), False]

False是划掉的项,比如(True,9)变成了False.

埃拉托斯特尼Python

把素数的倍数全部划掉。

def eratosthene(n):
    '''
    >>> eratosthene(100)
    [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]
    '''
    P=[True]*n
    answ=[2]#The first is 2,skip 0 and 1
    for i in range(3,n,2):#The step is 2,skip all even numbers
        if P[i]:
            answ.append(i)
            for j in range(2*i,n,i):
                P[j]=False
    return answ

比较

比较一亿个数字时,python通用的写法用时更少:
test(100000000)
埃拉托斯特尼 Python 9.892973899841309
埃拉托斯特尼 STL 44.09530520439148

代码

def test(N):
    import time
    s = time.time()
    eratosthene(N)
    print("埃拉托斯特尼 Python",time.time()-s)
    s = time.time()
    P = [(True,(i+1)*2+1) for i in range(N)]
    sift(0,N,P)
    print("埃拉托斯特尼 STL",time.time()-s)   

但给sift和mark_sieve都添加了一个形参P,如sift(0,N,P)。而且准备筛选前的P也不用一亿。STL里面还考虑到了第一个划掉的数是素因子的平方。
都是两层循环,STL还可以应用更多观察到的规律,应该是更快的,至少在C++里是最好的。

Python改成2N

上面STL找的是两亿里的素数,把eratosthene(N)里的N改成2*N,测试结果如下。
test(100000000)
埃拉托斯特尼 Python 21.3486430644989
埃拉托斯特尼 STL 44.855021476745605

应用

素数的判断

陈景润证明文章里使用一个数平方根以下的数,看是不是这个数的因子来判断素数。

匹配——散列法

散列函数中用到了一个十七位的大素数。

扩展头尾素数

    def f(n, s):
        for k in s:
            if k * k > n: break
            if 0 == n % k: return None
        return n    
    s = []
    for n in range(2, 100000):#生成十万以内的素数
        r = f(n, s)#判断素数
        if r : s.append(r)
    for p in permutations([1, 3, 5, 7, 9], 5):
        '''get rid of the head and tail,it also a prime number'''
        if s.count(reduce(lambda x, y: 10 * x + y, p[1:-1])) and s.count(reduce(lambda x, y: 10 * x + y, p)) and 1!=p[2] and 9!=p[2]:
            print(p)
            print(reduce(lambda x, y: 10 * x + y, p[1:-1]))
            print(reduce(lambda x, y: 10 * x + y, p))

先生成十万以内的素数,前五个奇数组成的数在十万以内。这里是用一个数是不是素数的倍数来判断它是不是素数,跟陈景润证明里用的不一样。
1和9不能做中间的数。程序求奇数[1, 3, 5, 7, 9]组成的去掉头尾还是素数的素数。输出结果如下:
(1, 3, 5, 9, 7)
359
13597
(5, 3, 7, 9, 1)
379
53791
(7, 9, 5, 3, 1)
953
79531
(9, 1, 5, 7, 3)
157
91573
(9, 5, 7, 1, 3)
571
95713

验证

陈景润证明文章里的isp判断。
isp(359)
True
isp(13597)
True
isp(379)
True
isp(53791)
True
isp(953)
True
isp(79531)
True
isp(571)
True
isp(95713)
True
isp(9)
False

标签:斯特尼,False,编程,素数,泛型,埃拉托,True,first
From: https://blog.csdn.net/denghai_csdn/article/details/143854364

相关文章

  • MybatisPlus入门(九)MybatisPlus-DML编程控制
    增删改InsertDeleteUpdate操作中的一些问题。一、主键生成策略增加的时候主键生成的问题,不同的环境、不同的场景对应的主键生成策略可能是不一样的,比如日志表、购物订单表、外卖单。  主键生成策略设置方法:  示例代码:packagecom.it.domain;importco......
  • 从0开始打造一款APP,无需编程经验
    用通义灵码,从0开始打造一个完整APP,无需编程经验就可以完成通义灵码携手科技博主@玺哥超carry打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。本教程完全免费,而且为大家准备了100个......
  • go编程中yaml的inline应用
    下列代码,设计Config和MyConfig是为可扩展Config,同时Config作为公共部分可保持变化。采用了匿名的内嵌结构体,但又不希望yaml结果多出一层。如果MyConfig中的Config没有使用“yaml:",inline"”修饰,则读取不到配置,Config中的Db将为nil。packagemainimport(......
  • Java NIO(io模型,三大组件,网络编程)
    一、NIOJavaNIO(NewI/O,新的输入输出)是Java1.4引入的一套I/O库,相比传统的IO(字节流和字符流),它主要用于处理高效的、非阻塞的I/O操作,特别是在需要处理大规模数据或高并发的场景中表现突出。JavaNIO提供了非阻塞模式、内存映射文件、缓冲区等一系列增强功能,适用于现代的高......
  • 一文搞懂 volatile:多线程编程的关键基础
    1.引言1.1什么是volatile?volatile是一个常用于多线程编程的关键字,其主要作用是确保线程对共享变量的访问保持最新状态。在现代计算机中,由于CPU缓存和编译器优化的存在,线程可能会读取到共享变量的旧值,导致逻辑错误。通过声明变量为volatile,我们可以告诉编译器和运行......
  • Java NIO(io模型,三大组件,网络编程)
    一、NIOJavaNIO(NewI/O,新的输入输出)是Java1.4引入的一套I/O库,相比传统的IO(字节流和字符流),它主要用于处理高效的、非阻塞的I/O操作,特别是在需要处理大规模数据或高并发的场景中表现突出。JavaNIO提供了非阻塞模式、内存映射文件、缓冲区等一系列增强功能,适用于现......
  • 代码随想录之滑动窗口、螺旋矩阵、区间和、开发商土地;Java之数据结构、集合源码、File
    代码随想录滑动窗口1、如果给两个字符串s和t,判断t是否为s的子串或是否s包含t的排列,用t的长度固定滑动窗口的大小,初始化将s的前t.length()个长度的字符情况存储在int数组中,int数组的大小由字符串中字符的类型决定,最大为ascii表的长度,为128。  每次循环滑动窗口向前移一位,即lef......
  • Python编程技巧:多变量赋值的优雅艺术
    在Python编程的世界里,有许多令人惊叹的语法特性,而多变量赋值就像是一颗闪耀的明珠,它不仅让代码更优雅,还能提升程序的执行效率。今天我们就深入探讨这个看似简单却蕴含深意的编程技巧。基础认识传统的变量赋值方式,我们都很熟悉:x=1y=2z=3但Python提供了一种更简洁......
  • B4X编程语言笔记:B4X程序流
            学习编程必须要了解您所使用的编程工具的代码结构和运行机制。您所编写的程序编译后从哪个例程启动,启动后各例程运行的先后顺序是怎样的,这就是我们需要了解的程序流程,简称程序流。        我们新建B4X项目时,IDE会为我们提供一个项目模板,模板包含必需......
  • 简单易用开源的跨平台编程工具--B4X
            最近发现一个简单易学易用且开源的跨平台编程工具--B4X,它体积小,语言简练,类似于BASIC语言,易上手,功能强大,是个不错的可视化编程工具,非常适合新手或热衷于VB的开发者使用。        B4X有如下特点:        1、体积小,易于安装部署开发环境。  ......