Posted by: thitipat | มีนาคม 2, 2008

หาจำนวนเฉพาะใน 2 บรรทัด ด้วย Python

ปล่อยให้บล็อกเงียบซะนาน เนื่องจากความกลัวว่าจะไม่มีคนเข้ามาอ่าน(ฮา) เลยเอาโจทย์ยอดนิยมมาเผยแพร่ซะหน่อย

โจทย์ที่ว่าก็คือการหาจำนวนเฉพาะ (จำนวนที่มีแค่ 1 กับตัวมันเองหารลงตัว) โดยจะหาจำนวนเฉพาะจนถึงจำนวนที่กำหนด (หาจำนวนเฉพาะถึง 100 แล้วกัน)

not_prime = [j for i in range(2,10) for j in range(i*2,100,i)]

prime = [x for x in range(2,100) if x not in not_prime]

print prime

จบแล้วครับ เทคนิคที่ผมใช้นี้ก็มีชื่อเรียกเท่ๆ ว่า List Comprehension ซึ่งเป็นความสามารถที่มีประโยชน์มากใน python ทำให้โค้ดของเราสั้นขึ้นเยอะเลย

ส่วนวิธีการของอัลกอริทึ่มนี้ก็ง่ายๆ ครับ คือเราจะทำการสร้างลิสต์ของเลขที่ไม่เป็นจำนวนเฉพาะก่อนโดยการจับสมาชิกที่ 2 , 3 , 4 , … ,10 หารลงตัวมาเก็บไว้ในลิสต์

จากนั้นเราก็สามารถหาจำนวนเฉพาะได้จากการไล่เช็คเลขไปเรื่อยๆ จาก 2 ถึง 100 ว่าถ้ามีเลขที่ไม่อยู่ในลิสต์ของจำนวนที่ไม่เป็นจำนวนเฉพาะ ก็จะเก็บเลขนั้นลงในลิสต์

Tip: จำนวนมากสุดที่สามารถนำมาหารเพื่อหาเลขที่หารลงตัวนั้นจะมีค่าไม่เกินรากที่สองของจำนวนที่กำหนดไว้ อย่างเช่น

ถ้าผมต้องการหาจำนวนเฉพาะตั้งแต่ 2 ถึง 30 เลขที่จะนำมาหารก็จะมีตั้งแต่ 2 ไปจนถึง 6 เพราะ 6^2 ก็เกินค่า 30 แล้ว ซึ่งก็หมายความว่าจะนำค่าที่มากกว่า 6 มาหารก็ไม่มีประโยชน์ (7 ก็เป็นจำนวนเฉพาะ ส่วน 8 ก็มี 4 หารลงตัวอยู่แล้ว หรือจะเป็น 9 ซึ่ง 3 ก็หารลงตัวอยู่แล้ว)

จากข้อสังเกตุนี้ทำให้รอบการทำงานของเราลดไปเยอะกว่าวิธีตรงๆ มาก เลยเป็นที่มาของการตั้ง for อันแรกของโปรแกรมนี้ที่วนลูปตั้งแต่ค่า 2 จนถึง 10

Responses

อันนี้ List comprehensive ของ haskell ครับ

let not_prime = [i*l| i<-[2..9],l<-[2..100],(i*l)<100]
let prime = [x|x<-[2..99], (notElem x not_prime) == True]
prime

สามบรรทัดนี้เอาไปใส่ในโปรแกรม ghci หรือ hug
แล้วได้ผลลัพธ์ดังนี้
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]

อ่ะแฮ่มๆๆๆๆๆๆ แหมไม่ค่อยนะเมิง

Leave a response

Your response:

หมวดหมู่