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

2 03 2008

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

โจทย์ที่ว่าก็คือการหาจำนวนเฉพาะ (จำนวนที่มีแค่ 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





Zen of Python

23 11 2007

อาจจะงงนะครับว่าทำไมจู่ๆ ก็มาเขียนเกี่ยวกับ python ที่จริงก็เขียน python มาได้ซักพักแล้ว ไปอ่านเจอลิ้ง tutorial สำหรับผู้เริ่มต้นที่เว็บ pygame.org (Introduction to Python Game Programming) แล้วก็มีเรื่อง Zen of Python อยู่ มีที่ขำและก็มีที่ชอบอยู่เลยเอามาลงให้อ่านกัน

Read the rest of this entry »