网站首页 > 基础教程 正文
质因数 (http://en.wikipedia.org/wiki/Prime_factor) 是指正好整除一个整数而不留余数的质数。对于大数来说,寻找质因数几乎是不可能的。
因此,质因数在密码学中得到了应用。然而,使用正确的算法--费马因式分解法(http://en.wikipedia.org/wiki/Fermat%27s_factorization_method)和 NumPy--对于小数来说,因式分解变得相对容易。
其原理是根据下式将一个数 N 分解成两个数 c 和 d:
我们可以递归地应用因式分解,直到得到所需的质因数。
这需要四个步骤,让我们来看看是如何完成的。
算法要求我们对 a 的值进行多次试验。
首先 我们将创建一个包含试验值的数组。创建一个 NumPy 数组可以省去循环。
不过,在创建数组时要注意,不要创建占用内存过大的数组。在我的系统中,一百万个元素的数组大小似乎恰到好处:
a = np.ceil(np.sqrt(n))
lim = min(n, LIM)
a = np.arange(a, a + lim)
b2 = a ** 2 - n
我们使用 ( ceil ) 方法按元素顺序返回输入值的上限。
第二步 获取 b 数组的小数部分。现在我们要检查 ( b ) 是否是正方形。使用名为 ( modf ) 的 NumPy 方法来获取 ( b ) 的小数部分。
数组的小数部分:
fractions = np.modf(np.sqrt(b2))[0]
第三步 查找 0 分数。调用 ( where ) NumPy 方法查找零分数的索引,其中分数部分为 0:
indices = np.where(fractions == 0)
第四步 找出第一个出现的零分数。
首先,使用上一步的索引数组调用 NumPy 方法 ( take ),获取零分率的值。然后使用 NumPy 方法 ( ravel ) 将数组网格化:
a = np.ravel(np.take(a, indices))[0]
这一行有点复杂,但确实展示了两种有用的方法。如果写成
a = a[indices][0]
你现在需要知道发生了什么?
在本节中,我们应用了一组有用且有趣的 NumPy 方法,这些方法的说明如下:
Method Name | Method Description |
ceil() | 计算数组元素的上限(参见 http://docs.scipy.org/doc/numpy/reference/generated/numpy.ceil.html) |
modf() | 返回浮点数的小数部分和积分部分(参见 http://docs.scipy.org/doc/numpy/reference/generated/ numpy.modf.html) |
where() | 根据条件返回数组索引(参见 http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html) |
ravel() | 返回一个扁平化数组(参见 http://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel.html) |
take() | 从数组中提取元素(参见 http://docs.scipy.org/doc/numpy/reference/generated/numpy.take.html) |
猜你喜欢
- 2024-12-13 人教版小学六年级数学下册期末试卷9
- 2024-12-13 Python的for语句与C或Pascal的区别
- 2024-12-13 截尾法判断整除——同余定理的应用
- 2024-12-13 有哪些好玩的 Python 代码?
- 2024-12-13 爆肝整理!大牛总结出的13道经典Python面试题,你都会吗?
- 2024-12-13 记住这份软件测试八股文还怕不能拿offer?你值得拥有
- 2024-12-13 如何在你的项目中混合 Rust 和 Python
- 2024-12-13 过瘾!100道Python入门练习题
- 2024-12-13 2020-09-20:如何判断一个数是质数?
- 2024-12-13 【python】(9)迭代与生成器
- 05-27是时候使用iframe延迟加载来提升LCP!
- 05-27页面卡顿到崩溃?5 个实战技巧让前端性能飙升 80%!
- 05-27前端人必看!10 个实战优化技巧,让项目性能直接起飞!
- 05-27快速了解JavaScript的表单操作
- 05-27来了!JavaScript 最强大的 8 个 DOM API
- 05-27如何使用 ChatGPT 进行抓取
- 05-27Pyppeteer爬虫神器详解
- 05-27《高性能JavaScript》学习笔记——日更中
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)