好了, 我们继续挑战下Python入门编程, 如何判断一个数是素数?以及如何分解一个合数?

首先回忆下:素数就是大于1且除了1和它本身之外没有其他素因子。大于1的非素数称为合数。形如F_n=2^2^n+1的数称为Fermat数。本节将判断Fermat数是否是素数。

isprime函数

# -*- coding: utf-8 -*-

def isprime(num: int) -> bool:

if not isinstance(num, int):

raise TypeError

if num < 0:

num = -num

if num == 1:

return False

if num == 2:

return True

if not num % 2:

return False

p = 3

while p * p <= num:

if not num % p:

return False

else:

p += 2

return True

这里用到了定义函数时, 进行输入参数的类型判断。 想一想, 如何添加输出参数的类型判断。

接下来, 我么将负数转化为正数, 而对1,2这两个特例进行简单处理。最后用一个while循环来从p=3开始判断p是不是其素因子, 如果是则返回非素数, 否则对p+2再次循环判断, 直到p*p超过要判断的数为止。

对Fermat数是否为素数可以测试如下。

# test with Fermat numbers

for i in range(7):

print(2**2**i + 1, isprime(2**2**i + 1))

素因子分解

从上面可以看到, 对Fermat数F_n=2^2^n+1, F_5, F_6都不是素数。那么我们如何分解它们呢?

def factor(num: int) -> list:

if not isinstance(num, int):

raise TypeError

fl = []

p = 2

pl = []

while p * p <= num:

# check p is prime or not

if p in pl or isprime(p):

if not p in pl:

pl.append(p)

if not num % p:

fl.append(p)

num = num // p

# print(p,num)

factor(num)

else:

if p == 2:

p += 1

else:

p += 2

else:

if p == 2:

p += 1

else:

p += 2

fl.append(num)

#print( pl )

return fl

为了加快程序运行, 我设置了一个pl数组, 记录已经判断过的素数。fl数组用来记录num的素因子。程序用一个while循环来寻找素因子, 首先记录素因子到pl中;而后判断该素因子是不是能够整除num, 如果是整除的, 则将其记录到fl中, 并将num变为商num/p(//返回的是整数), 并递归调用素因子分解函数。

后面两个else有点意思, 其实就是从p=2开始产生新的素数的方法。 如果p=2, 则产生3, 否则产生+2后的素数。

作为测试, 你可以看看20以内的分解。

# simple test of factorization

for i in range(20):

print(factor(i))

格式化输出

上面的代码, 返回的是形如[2,2,2,3,3,5]素因子数组, 如何将其转换为标准的2^3*3^2*5的形式呢?

def format_factor(lst: list) -> str:

if not isinstance(lst, list):

raise TypeError

dic = {n: lst.count(n) for n in lst}

formated = ''

for ek, ev in dic.items():

if ev == 1:

formated += str(ek) + '*'

else:

formated += str(ek) + '^' + str(ev) + '*'

# remove last *

return print(formated[:-1])

其实, 上面的代码可以这样理解。 我们首先将素因子数组lst转化为字典dic, 字典的索引是n, 而对应的值是lst.count(n), 即lst中n的重数。后面的格式化是显然的。只是需要注意这里for循环遍历字典的方法。

作为测试, 你可以试试分解F_5:

format_factor(factor(2**2**5+1))

输出为

641*6700417

最后的思考

上面的素因子分解对F_6感到有点困难了, 你可以试试如何优化代码, 缩短运行时间。

python求素数因子_Python入门教程: 素数判断与素因子分解相关推荐

  1. python字符串函数运算_Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】 原创...

    前面简单介绍了python基本运算,这里再来简单讲述一下Python字符串相关操作 1. 字符串表示方法 >>> "www.jb51.net" #字符串使用单引号 ...

  2. python乘法表运算_Python入门教程(三):史上最全的Numpy计算函数总结,建议收藏!...

    点击上方 蓝字 关注我们 Numpy提供了灵活的.静态类型的.可编译的程序接口口来优化数组的计算,也被称作向量操作,因此在Python数据科学界Numpy显得尤为重要.Numpy的向量操作是通过通用函 ...

  3. python中文编程教学_Python入门教程完整版400集(懂中文就能学会)快来带走

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  4. python猜年龄代码_python入门教程NO.7用python来写一个猜数字游戏

    python入门教程 本文涉及的python基础语法为while循环 #python#3中while语句常常被用于循环执行某个程序,任何非0和非空null的值,都会被条件判断为True while 条 ...

  5. python文件目录管理 项目_Python入门教程完整版(懂中文就能学会)

    今天给大家带来了干货,Python入门教程完整版,完整版啊!完整版! 言归正传,小编该给大家介绍一下这套教程了,希望每个小伙伴都沉迷学习,无法自拔 本套教程学习时间15天 1-3天内容:为Linux基 ...

  6. python学生名片系统_Python入门教程完整版400集(懂中文就能学会)快来带走

    如何入门Python?权威Python大型400集视频,学了Python可以做什么? 小编今天给大家分享一套高老师的python400集视频教程,里面包含入门进阶,源码,实战项目等等,,不管你是正在学 ...

  7. python 600集下载_Python入门教程完整版(懂中文就能学会)(600集)-站长资讯中心...

    目录大纲: 本套教程15天 学前环境搭建 1-3   天内容为Linux基础命令 4-13  天内容为Python基础教程 14-15 天内容为 飞机大战项目演练 视频概括: 第一阶段(1-3天): ...

  8. 用python做自我介绍_python入门教程NO.2 用python做个自我介绍

    本文涉及的python基础语法为:数据类型等 数据类型 1. 字符串的拼接 我们在上一章中已经简单介绍了一下字符串的创建方式,这里我们简单学习一下字符串的运算和拼接. 字符串的运算 `字符串的加法` ...

  9. python计算存款本金和利息_python入门教程NO.8 用python写个存款利息计算器

    本文涉及的python基础语法为def函数,return,函数的各参数示例,匿名函数等 函数初识 函数是一段组织好的 可重复使用的 用来实现特定功能的代码块. 函数能提高代码的模块性,和代码的重复利用 ...

最新文章

  1. shiro配置参考(一)
  2. 常考数据结构和算法:合并有序链表
  3. Impress.js上手 - 抛开PPT、制作Web 3D幻灯片放映
  4. kendo Grid json解析的问题
  5. 数据库中的范式 Normal Form(用最简单的语言描述!)
  6. java 字符串 数字个数_JAVA 统计字符串中中文,英文,数字,空格的个数
  7. 【Flutter从入门到实战】⑰Flutter的主题风格、Theme、DarkTheme暗黑模式、单独给单个页面设置Theme、屏幕适配、屏幕适配工具类封装、Flutter调试使用
  8. 备考2个月如何一次性通过信息系统项目管理师
  9. SQL Server行列转换
  10. 【定时自动清理磁盘空间】
  11. ATmega16 单片机 AVR单片机 自动计价电子秤
  12. LDAP批量添加php页面,包含邮件发送
  13. 闪存存储特性以及文件系统应用
  14. 金蝶云苍穹查找目标单
  15. 三维重建 阈值分割 3D可视化 医学图像分割 CT图像分割及重建系统 可视化编程技术及应用
  16. CANoe-CAN通信
  17. 学习总结-《父与子的编程之旅》chapter 6
  18. 小米红米1S 电信/联通版 专用TWRP2.8.1.1中文版 (全屏触摸/支持MTP挂载内外置存储)...
  19. 《大教堂和集市》笔记
  20. Android第一行代码——第八章多媒体

热门文章

  1. matlab极性电容叫什么,什么是无极性电容
  2. Advanced Archive Password Recovery
  3. 数量技术宅·安徽财经大学 线上策略分享会
  4. Java实现短信验证码(阿里云短信服务)
  5. Pinia基本使用与源码分析-手动实现部分主要功能
  6. python抓取数据库数据_Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储...
  7. 成就感和尊严,给你快乐
  8. Rocket的启动流程
  9. Android-vold源码分析之连接电脑OTG(11)
  10. php下拉框css样式,纯CSS实现的下拉菜单