Numpy攻略:尋找質因
阿新 • • 發佈:2018-12-05
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