判断素数

判断素数

说明:本文记录作者在使用多种方式判断素数时所产生的疑问

1、实验目的
以多种方式判断某个正整数n是否为素数,通过对比这些方式在同一种环境下运行后的绝对时间,深入地体会算法的时间复杂度。

2、实验背景
我们知道判断一个正整数n是否为素数的方法是通过计算该正整数是否只能被1和其本身整除。当设计如何判断正整数n是否为素数的算法时,有以下几种方法:
1. 将n对正整数2, 3, …, n-1逐个进行取模,若结果均不为0,则n为素数;
2. 将n对正整数2, 3, …,n/2逐个进行取模,若结果均不为0,则n为素数;
3. 将n对正整数2, 3, …, 逐个进行取模,若结果均不为0,则n 为素数。
这3种方法对素数的判断进行了逐步改进,需重复取模,比较的次数也变得越来越少。

3、实验内容
(1)编写通过将正整数n 对2, 3, …, n-1 逐个取模,判断其是否为素数的方法。
(2)编写通过将正整数n 对2, 3, …, n/2 逐个取模,判断其是否为素数的方法。
(3)编写通过将正整数n 对2, 3, …, 根号n 逐个取模,判断其是否为素数的方法。TODO?不理解这种方法
(4)输入待判断的正整数n。
(5)分别执行上述实现的3个方法,并获取各自的运行时间。
(6)改变n的规模(n=100、10000 和1000000),并重复执行上述3个方法,分析每次的运行时间,计算算法的时间复杂度。

问题描述:如果一个正整数n对一系列数逐个取模后,没有一个为0,则此数为素数
求解描述:确定判断的数,将这个数依次对一系列数取模,如果结果全不为0,则为素数


方法一:设置一个标志变量 isPrime

import time
def tow(num):
    isPrime = True
    for i in range(2, num):
        if num % i == 0:
            isPrime = False
    if isPrime == True:
        print("是素数")
    else:
        print("不是素数")
        
        
t3 = time.perf_counter()
tow(10000)
t4 = time.perf_counter()
print(t4 - t3)

方法二:

import time
def one(num):
    for i in range(2, num):
        if num % i == 0:
            return "不是素数"
    return "是素数"

t1 = time.perf_counter()
print(one(10000))
t2 = time.perf_counter()
print(t2 - t1)


具体代码实现

import time
def tow(num):
    for i in range(2, round(num / 2)):
        if num % i == 0:
            return str(num)+"不是素数"
    return str(num)+"是素数"

t1 = time.perf_counter()
print(tow(100))
t2 = time.perf_counter()
print(t2 - t1)

t3 = time.perf_counter()
print(tow(10000))
t4 = time.perf_counter()
print(t4 - t3)
        
t5 = time.perf_counter()
print(tow(1000000))
t6 = time.perf_counter()
print(t6 - t5)    
                
print("=============================")
        
        
        
import time
import math
def three(num):
    for i in range(2, round(math.sqrt(num))):
        if num % i == 0:
            return str(num)+"不是素数"
    return str(num)+"是素数"

t1 = time.perf_counter()
print(three(100))
t2 = time.perf_counter()
print(t2 - t1)

t3 = time.perf_counter()
print(three(10000))
t4 = time.perf_counter()
print(t4 - t3)
        
t5 = time.perf_counter()
print(three(1000000))
t6 = time.perf_counter()
print(t6 - t5)    

输出结果

# 2, 3, …, n/2 逐个取模
100不是素数
1.5300000029583316e-05
10000不是素数
8.100000002286833e-06
1000000不是素数
7.199999970453064e-06
=============================
# 2, 3, …, 根号n 逐个取模
100不是素数
1.1999999969702912e-05
10000不是素数
9.499999976014806e-06
1000000不是素数
8.79999998915082e-06

使用方法二的结构判断是否为素数,得到数据显示:让10000、1000000对2, 3, …, n/2 逐个取模花费时间比2, 3, …, 根号n 逐个取模时间更少。但从计算次数来考虑,采用根号的方式花费时间应该更少,疑惑??

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值