1. 程式人生 > >Numpy攻略:尋找質因

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