Numpy攻略:寻找质因

Fermat因式分解法
基本思路:用如下公式把N分成c和d两个整数:
在这里插入图片描述
递归地应用这个因式分解法,直到得到需要的质因数。
具体步骤:
1.创建尝试值数组:
用ceil函数对其输入的参数的数组元素向上取整(选择大于等于x的最小整数)。
2.得到数组b的小数部分:
检查数组b2中的元素是否为某个数的平方
modf函数:可以获得数组的小数部分
3.查找小数部分为0的数组元素
使用where函数,获取数组fractions中取值为0的元素的索引值
4.找到第一个小数部分为0的数组
首先调用Numpy的take函数,把上一步骤得到的数组indices作为参数,获得数组a中小部分为0的数组元素。
完整的代码如下图所示:

import numpy
#13195的质因数是5,7,13,29
#数字600851475143的质因数是多少
N=600851475143
LIM=10**6
def factor(n):
    #1.创建尝试值数组,ceil函数:对数组元素向上取整
    a=numpy.ceil(numpy.sqrt(n))
    lim=min(n,LIM)
    a=numpy.arange(a,a+lim)
    b2=a**2-n
    #2.检查数组b2中的元素是否是某个整数的平方,modf:返回函数的小数部分和整数部分
    fractions=numpy.modf(numpy.sqrt(b2))[0]
    #3.查找小数部分为0的数组元素,where:返回取值符合条件的数组元素的索引值
    indices=numpy.where(fractions==0)
    #4.找到第一个小数部分为0的数组ravel:返回一个展开的一维数组,take:从数组中选择指定的元素
    a=numpy.ravel(numpy.take(a,indices))[0]
    a=int(a)
    b=numpy.sqrt(a**2-n)
    b=int(b)
    c=a+b
    d=a-b
    if c==1 or d==1:
        return
    print(c,d)
    factor(c)
    factor(d)
factor(N)

运行结果:
1234169 486847
1471 839
6857 71

猜你喜欢

转载自blog.csdn.net/JiangCaifu/article/details/83624972