除余法素性检测,爱拉托斯散筛法以及通过concurrent.futures.ProcessPoolExecutor并发编程判断大素数

阅读: 评论:0

除余法素性检测,爱拉托斯散筛法以及通过concurrent.futures.ProcessPoolExecutor并发编程判断大素数

除余法素性检测,爱拉托斯散筛法以及通过concurrent.futures.ProcessPoolExecutor并发编程判断大素数

第1关:除余法素性检测

任务描述

本关任务:编写一个能判断一个数是否是素数的程序。

相关知识

为了完成本关任务,你需要掌握:1.素数的定义。2.除余法 3.算法效率

编程要求

根据提示,在右侧编辑器补充代码,计算并输出某个数是否是素数。 评测时长限制为20秒,请注意你算法的时间效率。 要求用python3.6编程实现。

测试说明

平台会对你编写的代码进行测试:

  1. 测试输入:58; 预期输出:No
  2. 测试输入:13; 预期输出:Yes
  3. 测试输入:8000001239; 预期输出:Yes
代码实现
import mathdef is_prime(num):if num > 1:if num == 2:return 'Yes'if num % 2 == 0:return 'No'for x in range(3, int(math.sqrt(num) + 1), 2):if num % x == 0:return 'No'return 'Yes'return 'No'if __name__ == "__main__":number = input()a=is_prime(int(number))print(a)

第2关:爱拉托斯散筛法

任务描述

本关任务:编写一个能使用爱拉托斯散筛法求N以内的素数的程序。

相关知识

为了完成本关任务,你需要掌握:1.爱拉托斯散筛法的原理 爱拉托斯散筛法是典型的以空间换取时间的算法。 算法过程:例如要计算100以内的素数 (1)找出sqrt(100)内是素数[2,3,5,7] (2)去掉2的倍数值 (3)去掉3的倍数值 (4)去掉5的倍数值 (5)去掉7的倍数值 (6)删除1

编程要求

根据提示,在右侧编辑器补充代码,输入数N,输出N以内的素数的列表。 要求采用python3.6编程实现

测试说明

平台会对你编写的代码进行测试:

  1. 测试输入:120; 预期输出: [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, 101, 103, 107, 109, 113]

  2. 测试输入:512; 预期输出: [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, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509]


代码实现
import mathdef is_prime(num):if num > 1:if num == 2:return 'Yes'if num % 2 == 0:return 'No'for x in range(3, int(math.sqrt(num) + 1), 2):if num % x == 0:return 'No'return 'Yes'return 'No'list2=[]def Evidence(num):list1=list(range(2,num))for i in range(2,int(math.sqrt(num))+1):if(is_prime(i)=='Yes'):list2.append(i)for i in list2:t=2while(True):if (i*t)>num:breakelse:if((i*t)in list1):ve(i*t)t=t+1print('[',end='')for i in range(len(list1)):if(i==len(list1)-1):print(list1[i],end=']')else:print(list1[i],end=', ')if __name__ == "__main__":number = input()Evidence(int(number))

第3关:并发编程判断大素数

任务描述

本关任务:编写一个并发程序实现对多个大素数的判断。

相关知识

为了完成本关任务,你需要掌握:1.素数判断,2.多进程并发编程。

多进程并发编程

使用concurrent.futures.ProcessPoolExecutor实现并发编程

编程要求

根据提示,在右侧编辑器补充代码, 判断是否为素数(True/False)。

测试说明

平台会对你编写的代码进行测试:

测试输入:112272535095293,112582705942171,112272535095293,115280095190773,115797848077099,1099726899285419; 预期输出: True True True True True False

代码实现

map 方法会返回一个map(func, *iterables)迭代器,迭代器中的回调执行返回的结果有序的。

from concurrent.futures import ProcessPoolExecutor
import math
#素性判断函数
def is_prime(num):if num > 1:if num == 2:return Trueif num % 2 == 0:return Falsefor x in range(3, int(math.sqrt(num) + 1), 2):if num % x == 0:return Falsereturn Truereturn False#通过调用is_prime,设计并发函数实现对多个大素数的判断
def main():with ProcessPoolExecutor() as executor:for i in executor.map(is_prime, PRIMES):print(i)if __name__ == '__main__':PRIMES=list(map(int,input().split(",")))main()

本文发布于:2024-02-05 03:04:15,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170722503762427.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23