考虑一个简单的数论问题,当 x 是正整数,如果可以表示为 x=a^2+b^2,让我们去求出 a 和 b 的值。显然用计算机暴力循环 x 次求解是一种可行的办法,但是当 x 为一个较大的数时,我们要浪费很多时间,因此可以改进一下我们计算方法。

可以分析到,x要是能表示为 x=K*L ,且当 K=m^2+n^2 , L=p^2+q^2。那么

x=(m^2+n^2)*(p^2+q^2)=(mp)^2+(nq)^+(mq)^2+(np)^2

=(mp+nq)^2+(mq-np)^2 【或者(mp-nq)^2+(mq+np)^2】

=      a^2      +      b^2

很自然地看出,我们这么做的目的就是把 x 的分解变成两个较小的因数 K,L 的分解,再组合出 x 的分解。理论上我们可以一直分解下去,直到因素不能再分解为 s^2+t^2 的形式。但是我的代码水平实在是不想再写一个循环(如果你感兴趣的话可以再搞一搞)

话不多说,我写的代码如下(如果你感兴趣可以继续改进):

import numpy as np
import timestart =time.time()def a2b2(x):##定义分解函数,其实已经可以解决较小数值的分解list1 = []for i in range(1,int(np.sqrt(x))+1):if int(np.sqrt(x-i**2))==np.sqrt(x-i**2) and int(np.sqrt(x-i**2))>i:line=i,int(np.sqrt(x-i**2))list1.append(line)a2b2=np.array(list1)return a2b2if __name__=='__main__':x = int(input('x='))print('x=',x)y = int(np.sqrt(x))print('a^2 + b^2 =', x, '找到以下解组:')print()list2 = []size = np.size(list2) / 2for i in range(y, -1, -1):##寻找靠近根号x的因数if i > 2 and x % i == 0:line = i, x / ilist2.append(line)size = int(np.size(list2) / 2)if size > 0:breakab = np.array(list2, dtype=int)##因数的分解list3 = []a = ab[int(size - 1), 0]b = ab[int(size - 1), 1]a1 = a2b2(a)sizea = np.size(a1) / 2b1 = a2b2(b)sizeb = np.size(b1) / 2for j in range(0, int(sizea)): ##把因数的分解组合为x的分解for k in range(0, int(sizeb)):s1 = a1[j, 0] * b1[k, 0] + a1[j, 1] * b1[k, 1]t1 = np.abs(a1[j, 0] * b1[k, 1] - a1[j, 1] * b1[k, 0])if t1>s1:l=s1s1=t1t1=ls2 = np.abs(a1[j, 0] * b1[k, 0] - a1[j, 1] * b1[k, 1])t2 = a1[j, 0] * b1[k, 1] + a1[j, 1] * b1[k, 0]if t2>s2:l=s2s2=t2t2=lline = s2, t2list3.append(line)line=s1, t1list3.append(line)list3.sort(key=lambda x: (x[1]))st = np.array(list3)sizest = np.size(st)num=0k=0for i in range(int(sizest/4)):##表示输出z=st[k, 1] ** 2 + st[k, 0] ** 2print('\033[0;33;32m %s^2 +\033[0m ' % st[k, 1],'\033[0;33;32m %s^2 =\033[0m' % st[k, 0],'\033[0;33;32m %s\033[0m' % z)num+=1if st[k, 0]!=st[k+1, 0] and st[k, 1]!=st[k+1, 1]:print('\033[0;33;32m %s^2 +\033[0m ' % st[k+1, 1],'\033[0;33;32m %s^2 =\033[0m' % st[k+1, 0],'\033[0;33;32m %s\033[0m' % (st[k+1, 1] ** 2 + st[k+1, 0] ** 2))num += 1k+=2if num>0:print('\033[0;33;32m一共有%s组解\033[0m'%num)else:print('\033[0;33;32m没有合适的解组\033[0m')end = time.time()
print()
print()
print('Running time: %s Seconds'%(end-start))

到这里就解决了,赶紧输入一个数找它的分解吧,来试试看!

用Python解决一个简单的数论问题——x分解为a^2+b^2相关推荐

  1. python输入水果求个数问题_水果爱好者:用Python解决一个简单的分类问题

    作者 | Ocktavia Nurima Putri 来源 | Medium 编辑 | 代码医生团队 在这篇文章中,将使用Scikit-learn在Python中实现几种机器学习算法.将使用一个简单的 ...

  2. python界面设计-手把手教你用Python设计一个简单的命令行界面

    原标题:手把手教你用Python设计一个简单的命令行界面 对 Python 程序来说,完备的命令行界面可以提升团队的工作效率,减少调用时可能碰到的困扰.今天,我们就来教大家如何设计功能完整的 Pyth ...

  3. python推荐系统-利用python构建一个简单的推荐系统

    摘要: 快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫. 本文将利用python构建一个简单的推荐系统,在此之前读者需要对pandas和numpy等数据分析包有所了解. 什 ...

  4. 基于python的系统构建_利用python构建一个简单的推荐系统

    摘要: 快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫. 本文将利用python构建一个简单的推荐系统,在此之前读者需要对pandas和numpy等数据分析包有所了解. 什 ...

  5. python推荐_利用Python构建一个简单的推荐系统

    原标题:利用Python构建一个简单的推荐系统 摘要:快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫.在此之前读者需要对pandas和numpy等数据分析包有所了解. 什么 ...

  6. 基于内容推荐python_用 Python 实现一个简单的基于内容的推荐引擎

    原标题:用 Python 实现一个简单的基于内容的推荐引擎 (点击上方公众号,可快速关注) 英文:Chris Clark 译文:伯乐在线专栏作者 - yaoyujia 链接:http://python ...

  7. python爬虫抢火车票_如何用python写一个简单的12306抢票软件|python 爬火车票 教程...

    python 如果抓取验证码图片 类似12306的登录验证码图片 这个以前做次.最大的麻烦是码的识别算法的识别率太低.12306那种网站登陆错3次就限制你20分钟.所以除非你有33%以上的识别率否则不 ...

  8. python绘制一个简单的函数图像使用到了matplotlib库和numpy库

    文章目录 效果展示: 视频链接 实现的思想 使用到的函数包 图片一对应的代码展示 图片二 对应的代码展示 注意事项 效果展示: 视频链接 python绘制一个简单的函数图像(B站视频) 实现的思想 其 ...

  9. Python编写一个简单的百度搜索应用

    由于天气因素,无法外出,在家闲来无事,使用Python编写一个简单的百度搜索应用. 功能:打开默认浏览器,使用百度进行搜索 Python:2.7.13 第三方库:pyinstaller(打包软件) 工 ...

最新文章

  1. lnmp shell安装脚本
  2. PHP分页类(较完美)
  3. 静态路由中使用一跳和出接口的区别
  4. 果园机器人能干什么_24* 果园机器人优秀教学实录
  5. MyBatis--连接池模块
  6. java applet 文本框_Java Applet 文本框 TextField 小例 | 学步园
  7. Intel 64/x86_64/IA-32/x86处理器 - 锁原子操作(1) - 处理器保证的原子操作
  8. 年度回忆录(2011.07----2011.12)
  9. 使用文本编辑器编写c代码
  10. Java之spring新手教程(包教包会)
  11. BUUCTF misc 解题记录 一(超级详细)
  12. 第八届ACM程序设计大赛总结
  13. 厦门大学电子科学系夏令营
  14. 阿里云云安全中心提供基础版、高级版和企业版有什么区别?
  15. 最新XNA开发游戏“Particle Wars”--粒子之战!
  16. nRF52832 — 串口BLE例程逐行解析【转载】
  17. python高级工程师证书_Amireux
  18. 宜信大数据金融云==宜信==谷文栋==金融科技行业动态系列1
  19. R语言Bonferroni校正的成对t检验进行事后检验(post hoc)实战:单因素方差分析告诉我们并不是所有的群体手段的效果是均等的,确切地找出哪些组彼此不同使用Bonferroni校正检验
  20. 【算法讲11:卡特兰数】默慈金数 | 那罗延数 | 施罗德数

热门文章

  1. 个人博客网站接入来必力评论系统
  2. 微信小程序开发之——个人中心-个人资料修改(7)
  3. java如何获取一月的工作日,Java如何获取工作日名称列表?
  4. 2022年汽车驾驶员(中级)理论题库模拟考试平台操作
  5. 数组首地址arry和arry的区别
  6. Java实现云端存储、短信、邮件、沙盒支付
  7. layui后台管理首页配置
  8. ubuntu安装chrome浏览器64位
  9. 实现响应式布局有几种方法
  10. 【学习笔记】迁移学习分类