2019年11月8日 星期五

夠Python,一行指令找質數

Python Taiwan是一個很棒的社群,大家透過相互討論,交換彼此在程式設計上的心得。前幾天敏哥發表"夠Python,九九乘法表",勾起大家兒時學數學記憶,於是有人提議,用Python List Comprehension 找質數,其程式以及執行結果如下:


於是有人提出可以再改進效能,質數檢查只需要檢查2以及奇數,只需要檢查到平方根,一行指令找質數程式碼如下:

print([n for n in range(3,3000,2) if not any(n%i==0 for i in range(3,int(n**0.5)+1,2))])

執行結果:

輸人不輸陣,就有人會說"想比短嗎?"

print([n for n in range(2, 30) if all (n % i for i in range(2, n))])

執行結果:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

此時有人提到"能用一行寫出來的都是有限範圍的質數,真正業界用到質數的地方是加密技術,百萬位數的質數就不知道怎麼找了"

此時有人說道:"真是炫炫的, 不像我都用 SymPy 找 XDD"

SymPy是什麼呢?

SymPy is a Python library for symbolic mathematics.

網址:https://www.sympy.org/en/index.html

SymPy是一個數學函式庫,以Python為基礎的免費輕量級的函式庫。

prime(n): 第 n 個質數
isprime(k): k 是不是質數

以上兩個是我最常用的, 但還有很多, 像是:

nextprime(k): k 之後下一個質數
primerange(a,b): [a, b) 中的質數
randprime(a,b): [a, b) 中的質數隨機抽一個出來

看起來果然好用,使用前不要忘了要用pip安裝。

pip install SymPy

範例:取得第10個質數
from sympy import *
print(prime(10))

執行結果:
29

SymPy有許多數學函式,大家不坊試試。

大家討論到求質數的情形,請參閱下列連結。

沒有留言:

張貼留言