โปรแกรมแยกตัวประกอบและตรวจสอบจำนวนเฉพาะ | เว็บบอร์ด วิชาการ.คอม

โปรแกรมแยกตัวประกอบและตรวจสอบจำนวนเฉพาะ

โพสต์เมื่อ: 12:58 วันที่ 29 มี.ค. 2549         ชมแล้ว: 45,065 ตอบแล้ว: 58
วิชาการ >> กระทู้ >> ทั่วไป
แจกโปรแกรมสำหรับใช้ แยกตัวประกอบและตรวจสอบจำนวนเฉพาะ

ลองเอาไปใช้ดูนะครับ น่าจะเป็นประโยชน์สำหรับครูสอนคณิตฯและท่านที่มีใจรักในวิชานี้

-.โปรแกรมตัวแรกเป็นโปรแกรมที่ใช้สำหรับแยกตัวประกอบ ของจำนวนนับใดๆ
และนอกจากนี้ยังสามารถใช้ตรวจสอบจำนวนเฉพาะได้ด้วย
วิธีการใช้ก็แสนงายแค่เปิดโปรแกรมขึ้นมาแล้วใส่ตัวเลขที่ต้องการแยกตัวประกอบ แล้วกด Enter

http://members.thai.net/pslaw/download/FACTOR.zip

-.ตัวที่สองนี้เป็นโปรแกรมที่ใช้คำนวณหาจำนวนเฉพาะระหว่างค่าต่าง ๆ เช่น จำนวนเฉพาะระหว่าง 1 - 100

http://members.thai.net/pslaw/download/PRIME.zip

เมื่อใช้เสร็จแล้วต้องการออกจากโปรแกรมให้ใส่เลข 0 แล้วกด Enter

มีปัญหาในการใช้โปรแกรมติดต่อผมได้ที่

prasitcu@hotmail.com

ปล.โปรแกรมทั้งสองตัว ฟรี ครับ ไม่ต้องเสียงเงิน ผมเขียนเเอง
แงซาย [IP: 58.11.68.75,192.168.3.201,] วันที่ 27 มี.ค. 2549 - 12:27:38
(คุณ แงซาย ช่วยร่วมแบ่งปันความรู้และประสบการณ์ ผ่านวิชาการ.คอมแล้ว รวมทั้งสิ้น 1 ครั้ง)
..................................................................................................................
มีสมาชิกท่านหนึ่ง โพสต์ผิดห้อง กระทู้ที่ตั้งก็ถูกลบไปโดยปริยาย
แต่ เนื้อหาในกระทู้น่าสนใจมาก จึงนำมาฝากไว้ที่ห้องครูอาจารย์
ท่านใดสนใจ ก็ติดต่อตามที่อยู่ข้างบนครับ


pratheep15866@yahoo.co.th(210.86.142.82,,)





จำนวน 53 ความเห็น, หน้าที่ | -1-
ความเห็นเพิ่มเติมที่ 1 29 มี.ค. 2549 (18:15)
โปรแกรมทั้งสองดังกล่าว ใช้แนวคิด หรือขั้นตอนวิธี

(algorithm) ทางคณิตศาสตร์ อย่างไรครับ



ไม่แน่ใจว่า มีข้อจำกัดในการใช้ หรือรับรองความถูกต้องหรือไม่
วริน (IP:202.12.97.118,10.177.64.81,)

ความเห็นเพิ่มเติมที่ 2 30 มี.ค. 2549 (14:36)
หลักการเขียน ผมใช้หลักที่ว่า จำนวนเฉพาะคือจำนวนที่มีตัวประกอบเพียง 2 ตัว คือ 1 กับตัว มันเอง



จากหลักการนี้ หากมีจำนวนใดๆ ต้องการแยกตัวประกอบ เราก็เอาจำนวนนั้นมาตั้งแล้วหารดัวย 2 หากหารลงตัว ก็นำมาหารต่อไปอีกเลื่อยๆ เลื่อยๆ จนกระทั้งผลหารเป็น 1 คือหารด้วยตัวมันเองแล้วหยุดทำงาน จากนั้นก็เปลี่ยนค่าเป็น 3,4,5 ไปเลื่อยๆ จนถึงตัวมันเอง แสดงว่าการทำงานเสร็จสิ้น





พอได้ผลหารในแต่ละครั้ง เราก็สร้างตัวนับ หากตัวนับพบว่า จำนวนครั้งที่หารลงตัว มีเพียงหนึ่งครั้งก็ให้คอมมันพิมพ์จำนวนนั้นออกมา

(ที่มีหนึ่งครั้งแสดงว่ามีแค่ตัวมันเองเท่านั้นที่หารลงตัว ไม่นับ "1" เพราะเราเริ่มหารที่ 2)



สั่งคอมพิมพ์ออกมาให้ถูกในการหารแต่ละครั้งเราก็จะได้ตัวประกอบที่เป็นจำนวนเฉพาะออกมา
แงซาย
ร่วมแบ่งปัน139 ครั้ง - ดาว 155 ดวง

ความเห็นเพิ่มเติมที่ 3 30 มี.ค. 2549 (14:39)
ตอบอีกข้อ



โปรแกรมนี้ผมเขียนด้วย โปรแกรมภาษา C ข้อจำกัดผมไม่แน่ใจว่ามันจะหาค่าได้กี่ร้อยล้าน ลองทดสอบด้วยตัวคุณเองดีที่สุด





ความถูกต้อง ล้าน % ครับ เพราะคอมพิวเตอร์มันไม่โกหกคนอย่างแน่นอน
แงซาย
ร่วมแบ่งปัน139 ครั้ง - ดาว 155 ดวง

ความเห็นเพิ่มเติมที่ 4 30 มี.ค. 2549 (15:39)
ถ้าผมต้องการทดสอบว่า 1000001 เป็นจำนวนเฉพาะหรือไม่



ตามวิธีการที่คุณแงซาย อธิบาย ก็ต้องลองหารด้วย



2,3,4,5,6,7,...,1000001 จำนวนล้านครั้ง





เราทดสอบเพียง การหารด้วย



2,3,4,..., 1000 ก็น่าจะเพียงพอ
วริน (IP:202.12.97.118,10.177.64.81,)

ความเห็นเพิ่มเติมที่ 5 30 มี.ค. 2549 (16:01)
ถ้าใช้ตัวแปร แบบ unsigned long ก็น่าจะหาได้ประมาณ 10 หลัก
I'm boring (IP:133.48.179.12,,)

ความเห็นเพิ่มเติมที่ 6 30 มี.ค. 2549 (16:02)
หาร 4 ก็ซ้ำกับหาร 2
i'm boring (IP:133.48.179.12,,)

ความเห็นเพิ่มเติมที่ 7 30 มี.ค. 2549 (21:26)
ตอบคุณ " วริน"



ไม่พอหรอกครับ ผมจะยกตัวอย่างง่ายๆ เช่น



ผมต้องการแยกตัวประกอบหรือต้องการตรวจสอบว่า



909091 เป็นจำนวนเฉพาะหรือไม่



คุณจะไม่มีวันรู้เลยว่ามันเป็นจำนวนเฉพราะจนกว่าคุณจะหารไปถึง 909091 ครั้ง คือหารตัวมันเอง



จำนวน 909091 ผมตอบได้เลยว่ามันเป็นจำนวนเฉพาะ
แงซาย
ร่วมแบ่งปัน139 ครั้ง - ดาว 155 ดวง

ความเห็นเพิ่มเติมที่ 8 30 มี.ค. 2549 (21:48)
ตอบอีกข้อ / และอีกคนในกรณีเดียวกัน



เราไม่ไม่จำเป็นต้องหารขนาดนั้นหรอกครับ



ผมจะยกตัวอย่างง่ายๆ จากจำนวนที่คุณยกมา 1000001



N เริ่มต้นของผมคือ 1000001



ผมเริ่มหารไปเรื่อยๆ จนถึง 101 ถึงพบว่ามันหารลงตัว และได้ผลลัพธ์เป็น 9901 พอถึงตรงนี้เราสามารถเซ็ท ค่า N เป็น N ตัวใหม่ได้ทันที่ คือให้ N เป็น 9901 จากนั้นนำมาหารต่อเรื่อยๆ เหมือนตอนแรกจนพบจำนวนแรกที่หาร 9901 ลงตัว เมื่อพบจำนวนที่หารมันลงตัวก็กับไปทำซ้ำเหมือนเดิมครับ





จากจำนวนที่ยกตัวอย่างมาคือ 1,000,001 เราจะแยกตัวประกอบได้ดังนี้



1000001 = 101 x 9901 x 1 จะเห็นว่าขั้นตอนการทำงาน ในการหารเราไม่ได้หารถึง 1,000,001 ครั้ง แต่เราทำการหารเพียง



101 + 9901 = 10,002 ครั้ง ลบออกอีก 1+1 เพราะเราเริ่มหารที่ 2 ไม่ใช่เริ่มที่ 1



จะได้จำนวนครั้งในการหารคือ 10,000 ครั้ง ไม่ใช่ 1000001 ครั้ง



ไม่อะไรสงสัยถามมาอีกได้นะครับ
แงซาย
ร่วมแบ่งปัน139 ครั้ง - ดาว 155 ดวง

ความเห็นเพิ่มเติมที่ 9 31 มี.ค. 2549 (07:20)
งงดี ไม่ค่อยเข้าใจ

ตัวอย่างเช่นเลข 48

จะหาแค่ว่าเลข 48 มีตัวประกอบเป็นจำนวนเฉพาะ คือ 2,3

48 = 2*2*2*2*3 คุณจะหาแค่นี้

หรือว่า คุณจะหาว่า 48 มี 1,2,3,4,6,8,12,16,24 เป็นตัวประกอบ

สำหรับส่วนความเห็น 4 เค้าหมายถึงว่าคุณหารแค่ 6 ก็พอ

เพราะ 6*8 = 48 คุณก็ได้ 8 มาอยู่แล้ว ตามหลัก หารถึงแค่ สแควร์รูทของมันก็พอ เพราะส่วนที่เกินคือ คู่ของตัวประกอบ

2*24 = 3*16 = 4*12 = 6*8
i'm boring (IP:133.48.179.12,,)

ความเห็นเพิ่มเติมที่ 10 31 มี.ค. 2549 (10:25)
ผมว่าผมอธิบายละเอียดแล้วนะ



ผมไม่ทราบว่าคุณเข้าในหลักการเขียนโปรแกรมหรือเปล่า





คอมพิวเตอร์มันไม่รู้หรอกครับว่าตัวไหนเป็นตัวประกอบ และ มันก็ไม่รู้ด้วยว่าจะเอาตัวไหนไปหาร



ให้คุณมองกว้างกว่านี้ เพราะที่คุณยกตัวอย่างมามันเป็นจำนวนที่คุณรู้อยู่แล้วแต่คอมพิวเตอร์มันไม่รู้หรอกครับ



ผมยกตัวอย่างง่ายๆ คุณลองหาตัวประกอบของ 9901 หรือเป็นจำนวนอื่นก็ได้ที่คุณยังไม่รู้ตัวประกอบ คุณจะทำอย่างไร
แงซาย (IP:58.11.68.154,192.168.1.162,)

ความเห็นเพิ่มเติมที่ 11 31 มี.ค. 2549 (12:07)
หารถึงแค่รากที่สองของมันก็พอครับ แงซาย อันนี้เป็นหลักการคณิตศาสตร์ที่รู้กันทั่วไป

หากไม่เชื่อลองจับเอาเลขแต่ละตัวหารไปเรื่อยๆ แล้วเอาเฉพาะที่มันหารได้ลงตัวกับผลหาร เอามาเขียนเรียงกันดู จะพบความสมมาตรที่ตรงตำแหน่งรากที่สองของมัน
555 (IP:203.148.252.235,210.203.182.26,)

ความเห็นเพิ่มเติมที่ 12 31 มี.ค. 2549 (14:23)
ก็แล้วแต่ความเข้าใจและวิธีการของแต่ละคนแล้วกันครับ



หลักการเขียนโปรแกรมของผมฟังดูอาจจะเข้าใจยาก ลองดูตัวอย่างง่ายๆ สักอันก็แล้วกันครับ



เอาตัวแรกที่ใช้แยกตัวประกอบหรือตรวจสอบจำนวนเฉพาะ



สมมุติตัวเลขที่ผมต้องการตรวจสอบคือ N=455 พอรับข้อมูลเข้ามา คอมมันก็จะเริ่มทำงานโดยเขียนเป็นขั้นต้อนได้ดังนี้



1.

455/2 ซึ่งหารไม่ลงตัว

455/3 หารไม่ลงตัวอีก

455/4 หารไม่ลงตัวอีก

455/5 หารลงตัวได้ผลหารเป็น 91 พอถึงตรงนี้เรา set N เป็น ตัวใหม่คือ N=91 และสั่งให้คอมเก็บค่า 5 ไว้เพราะ 5 เป็นตัวประกอบตัวหนึ่งของ 455



จากนั้นคอมมันก็จะเริ่มขบวนการใหม่คือเริ่มทำซ้ำกระบวนการในข้อ 1

91/2 ซึ่งหารไม่ลงตัว

91/3 ซึ่งหารไม่ลงตัว

.

.

.

91/7 หารได้ลงตัวและได้ผลหารเป็น 13 เก็บค่า 7 ไว้และ set N เป็น N ตัวใหม่ คือ 13



ทำซ้ำกระบวนการในข้อ 1 เช่นเดิม ซึ่งคอมมันจะตรวจพบว่า 13/13 ลงตัวเท่านั้น และได้ผมลหารเป็น 1 มันก็จะหยุดกระบวนการทำงาน



ได้ผลลัพธ์แล้วเราก็ส่งให้มันพิมค่าที่เก็บไว้ออกมา ซึ่งจะได้เป็น



455 = 5 x 7 x 13



ส่วนโปรแกรมตัวที่สองเราก็ใช้หลักการเดียวกันนี้ เพียงแต่เพิ่มการวน loop เข้ามาอีกตัว



ส่วนการหาร 2 แล้วเราไม่ต้องสั่งให้หารด้วย 4 ,8,10...ก็ได้โดยสั่งให้โปรแกรมตรวจสอบก่อนว่าจำนวนนั้นเป็นเลขคู่หรือเลขคี่



และนอกจากนี้กรณีของเลขคี่ เราก็ไม่จำเป็นต้องสั่งให้คอมมันหารด้วย 2,4,6,8........ก็ได้(เพราะอย่างไรก็หารไม่ลงตัวอยู่แล้ว)เราอาจสั่งให้เริ่มหารที่ 3,5,7...เลยก็ได้ โดยใช้หลักการตรวจสอบก่อนว่าจำนวนที่นำมาหารเป็นเลขคู่หรือเลขคี่เช่นเดียวกันกับที่ได้กล่าวไปแล้ว
แงซาย (IP:58.11.68.154,192.168.3.10,)

ความเห็นเพิ่มเติมที่ 13 31 มี.ค. 2549 (15:05)
เพิ่งเข้าใจว่าทำสองโปรแกรม

แต่อย่างไรก็ตามในการทดสอบจำนวนเฉพาะ คุณทดสอบการหารถึงแค่สแควร์รูทของมันก็พอ เพราะที่เหลือไม่จำเป็น จะหารต่อไปจนถึงตัวมันเองก็ได้ไม่ผิดอะไร เช่น เลข 41 คุณทดสอบการหาร จาก 2 ถึง 6 ก็พอ คุณก็จะสรุปได้แล้วว่าเป็นจำนวนเฉพาะ จะหารจนถึง 40 ก็คงไม่ผิดอะไร
i'm boring (IP:133.48.179.12,,)

ความเห็นเพิ่มเติมที่ 14 31 มี.ค. 2549 (17:06)
ขอเปลี่ยนเป็นถามกรณีอื่นบ้าง



ถ้าผมต้องการหา จำนวนเฉพาะ 10000 ตัวแรก



ผมจะทำอย่างไรดี (ให้ประหยัดเวลา และได้โปรแกรมที่มีประสิทธิภาพ )
วริน (IP:202.12.97.118,10.177.64.81,)

ความเห็นเพิ่มเติมที่ 15 31 มี.ค. 2549 (19:27)
เอาอย่างนี้นะคุณแงซาย



หากเลขที่ทดสอบ n โดยเราคาดหวังว่าอาจจะไม่เป็นจำนวนเฉพาะ



และมีค่า n = i x j โดย i และ j เป็น factor ของ n



ถ้า i มีค่ามาก j ก็ต้องยิ่งมีค่าน้อย



ถ้าเราทดสอบจนถึงค่า i เกิน sqr(n) แล้วยังไม่มีตัวไหนหาร n ได้ลงตัว



เราจะทดสอบ i ตัวต่อไปทำไม?



เพราะถ้า n ไม่ได้เป็นจำนวนเฉพาะแล้ว j ก็ต้องมีค่าน้อยกว่า i ซึ่งเป็นไปไม่ได้ เพราะเราได้ทดสอบเลขที่น้อยกว่านี้มาหมดแล้วไม่มีตัวไหนหาร n ได้ลงตัวเลย



ดังนี้จึงทดสอบหาร n ด้วยจำนวนเต็ม 2 ถึงแค่ sqr(n) ก็พอ อย่าได้ตะลุยจนถึง n-1 ให้เหนื่อยเลย



ผมเคยทำ assignment นี้ตอนเรียนปีหนึ่งเมื่อเกือบ 20 ปีที่แล้ว บอกได้เลยว่า หากทดสอบโปรแกรมด้วยตัวเลขจำนวนเฉพาะ "2147483647" เครื่อง mainframe รุ่นโบราณที่ใช้เรียนสมัยนั้นจะตัดการทำงานกลางคันเพราะเข้าใจว่าติดลูปไปแล้ว



ผมนั่งบ้าแข่งอยู่กับเพื่อนอีกคนทำ assignment นี้อยู่เดือนกว่า ได้ algoritm สุดพิศดารพันลึกที่เร็วที่สุดเท่าที่เราจะคิดได้แล้ว(แต่ยังอ่อนด้อยเหลือเกินในโลกของความเป็นจริง) ผลาญ cpu time ของ mainframe ไปมากมายกว่าคนอื่นๆเกือบร้อยเท่า สนุกประเทืองปัญญา ถึงจะไม่เท่ แล้วก็ยังกินไม่ได้อีกตะหาก



มาสมัยนี้อิจฉาเด็กรุ่นใหม่ๆจัง



ถ้ารู้จักใช้ google ซะบ้าง solution เด็ดๆที่คนเก่งๆทำกันไว้เพียบจะเปิดโลกของเราให้กว้างออกมาเอง



ลอง search หา "primailty test" ดูสักหน่อยดีไหม?



หรือลองแค่ wiki http://en.wikipedia.org/wiki/Prime_number#Primality_tests ดูก็เหลือแหล่แล้ว



ส่วนเรื่องการแยก factor ของให้ลองค้นดูเอง



นะ นะ นะ สนุกนะ
CrazyHOrse
ร่วมแบ่งปัน567 ครั้ง - ดาว 109 ดวง

ความเห็นเพิ่มเติมที่ 16 31 มี.ค. 2549 (19:29)
เอิ๊ก พิมพ์ผิดเพียบ ช่วยแก้ให้หน่อยก็แล้วกันนะท่าน
CrazyHOrse
ร่วมแบ่งปัน567 ครั้ง - ดาว 109 ดวง

ความเห็นเพิ่มเติมที่ 18 1 เม.ย. 2549 (09:44)
โปรแกรมที่คำนวณ ไม่มาก อาจไม่เห็นความแตกต่าง จะคำนวณเกินความจำเป็นก็ไม่มีปัญหาอะไร แต่ถ้าคุณทำโปรแกรมที่ต้องคำนวณสลับซับซ้อนจำนวนมาก ถ้าใช้วิธีไม่เหมาสมอาจจะทำให้สิ้นเปลืองเวลามาก

การคำนวณควายๆ เช่น โครงสร้างต่างๆของพวกโมเลกุล พวกโปรตีน หรือ การจำลองกาแลคซี บางทีก็รันกันหลายวันเลย ถ้าใช้อัลกอริทึมไม่ดีพอ ก็อาจทำให้ยิ่งนาน แทนที่จะใช้แค่วันสองวันอาจใช้เวลาเพิ่มขึ้นอีกหลายวัน
I'm boring (IP:133.48.179.12,,)

ความเห็นเพิ่มเติมที่ 19 4 เม.ย. 2549 (15:06)
+++++++++++++++++++++++++++++++++++++++

ย้ำอีกครั้งนะโปรแกรมตัวที่สองซื่งเป็นโปรแกรมหาจำนวนเฉพาะ มันเป็นผลพลอยได้จากโปรแกรมแยกตัวประกอบ



การเขียนโปรแกรมนี้ก็ตามขั้นตอนที่อธิบายไป เช่น



รับข้อมูลมา คือ 70 ขั้นตอนการทำงานมันก็จะเป็นดังนี้



N=70

i ผมคือตัวหาร 70/i จะได้ดังนี้ (i=2,3,4...)



70/2 = 35 หารลงตัวจะเปลี่ยน N เป็นตัวไหม่

คือ N ตัวไหม่เท่ากับ 35(N=35)เก็บค่า i ไว้ (i คือ 2)

35/2 ไม่ลงตัว

35/3 ไม่ลงตัว

35/4 ไม่ลงตัว

35/5 ไม่ลงตัว

35/6 ไม่ลงตัว

35/7 = 5 หารลงตัวจะเปลี่ยน N เป็นตัวไหม่

คือ N ตัวไหม่เท่ากับ 5(N=5) เก็บค่า i ไว้ (i คือ 5)

5/2 ไม่ลงตัว

5/3 ไม่ลงตัว

5/4 ไม่ลงตัว

5/5 = 1 หารลง เก็บค่า i ไว้ (i คือ 5) และการวนรูปสินสุดเพราะผลหารเป็น 1



สั่งพิมพ์ค่าที่เก็บไว้ (ค่า i) ก็จะได้เป็น



70 = 2 x 5 x 7 x 1



นอกจากนี้ในการหารลงตัวแต่ละครั้งผมยังสร้างตัวนับไว้ด้วยจากตัวอย่าง จะตัวนับจะนับได้ 3 ครั้ง (ไม่ต้องนับ 1)



หากตัวนับนับได้ 1 ครั้ง แสดงว่าจำนวนนั้นเป็นจำนวนเฉพาะ (เพราะมีแค่ตัวมันเองเท่านั้นที่หารลงตัว) ผมก็จะสั่งให้คอมมันบอกว่าเป็นจำนวนเฉพาะ (Pime Number)



++++++++++++++++++++++++++++++++++++++++

พอมาโปรแกรมหารจำนวนเฉพาะผมก็เอาโปรแกรมแยกตัวประกอบนี่แหละครับ มาวนลูปอีก รอบแค่นั้นเองง่ายไหมครับ



เช่นจะหาจำนวนเฉพาะจาก 1-100

N ผมก็จะเปลี่ยนเป็น 1,2,3.........100

ตัวหาร i ก็เหมือนขั้นตอนที่แสดงตัวอย่างให้ดูแหละครับ

++++++++++++++++++++++++++++++++++++++++



ส่วนคุณที่มีวิธีการหาจำนวนเฉพาะด้วยวิธีอื่น ที่คุณสามารถอธิบายให้เด็กมัธยมฟังเขาใจได้ คุณก็ลองเขียนดูสิครับ



ผมว่าคุณไปนั่งเขียนดูน่าจะดีนะครับ ดีกว่ามาวิพากวิจารย์ผมนะผมว่า..



เพราะอย่างน้อยคุณก็ได้ฝึกปรือฝีมือเอง มันไม่ดีกว่าหรือครับ
แงซาย (IP:58.11.68.118,192.168.3.101,)

ความเห็นเพิ่มเติมที่ 20 4 เม.ย. 2549 (15:12)
แก้ไขบรรทัดนี้นะครับ



35/7 = 5 หารลงตัวจะเปลี่ยน N เป็นตัวไหม่

คือ N ตัวไหม่เท่ากับ 5(N=5) เก็บค่า i ไว้ (i คือ 7)
แงซาย (IP:58.11.68.118,192.168.3.101,)

ความเห็นเพิ่มเติมที่ 21 4 เม.ย. 2549 (16:08)
คุณลองทำแบบที่คุณทำกับเลข 13 ให้ดูหน่อยได้ไหม แล้วกรุณาสละเวลาอ่านคคห.15 ช่วงต้นหน่อยดีไหม เพราะผมอุตส่าห์เขียนให้คุณอ่านด้วยความหวังดีทั้งต่อคุณและลูกศิษย์ของคุณ



ไม่ยากหรอกนะ



เด็กม.ต้นก็เข้าใจได้ ผมเคยอธิบายให้หลานม.1 ฟังยังเข้าใจได้ไม่ยากเลย (แล้วอย่าให้ผมบอกเลยว่าหลานผมเขาว่ายังไงกับคนที่ใช้วิธีทำแบบคุณ)



เป็นครูอาจารย์อย่าทำตัวเป็นน้ำเต็มแก้ว สงสารอนาคตของประเทศชาติบ้าง
CrazyHOrse
ร่วมแบ่งปัน567 ครั้ง - ดาว 109 ดวง

ความเห็นเพิ่มเติมที่ 22 4 เม.ย. 2549 (16:13)
สำหรับการแก้ปัญหาต่างๆ บางปัญหามีวิธีแก้ได้หลากหลายวิธี สิ่งที่สำคัญที่สุดก็คือการแก้ปัญหาไห้ได้ถูกต้อง เพราะถ้าเขียนโปรแกรมที่คำนวณเร็วแต่คำนวณผิดก็ไม่มีประโยชน์อะไร

ขั้นต่อไปก็หาวิธีการหรือพัฒนาวิธีที่จะทำให้คำนวณได้มีประสิทธิภาพเพิ่มขึ้น เร็วขึ้น หรือได้ค่าแม่นยำขึ้น

หลายท่านเพียงแต่เสนอแนะเพิ่มเติมเท่านั้นเอง
i'm boring (IP:133.48.179.12,,)

ความเห็นเพิ่มเติมที่ 23 4 เม.ย. 2549 (17:39)
จริงๆ ฟังๆดูแล้วหลายๆคน เข้าใจวิธีการแยกตัวประกอบ

หรือตรวจสอบการเป็นจำนวนเฉพาะ ด้วยวิธีตรงๆ ง่ายๆ เป็นอย่างดี



การนำไปเขียนโปรแกรมก็น่าจะทำได้ไม่ลำบากนัก



และหลายๆท่านก็เสนอแนวทางปรับปรุงแก้ไข

อย่างเช่น



การทดสอบการหารลงตัว ว่ามีตัวเลขจำนวนอื่น นอกจาก 1 กับตัวมันเองหารลงตัวหรือไม่ ก็เป็นที่ชัดเจนว่าทำแค่เพียงถึงประมาณรากที่สองของจำนวนนั้น ซึ่งช่วยได้มากๆ ถ้าจำนวนที่ต้องการทดสอบมีค่ามากๆ



อีกแนวทางหนึ่ง ที่จะช่วยได้ โดยเฉพาะการ generate จำนวนที่เป็น prime



อาจจะใช้วิธี generate แล้วเก็บค่าไว้ใน array

ซึ่งจะเสียเวลาในช่วงแรกนิดหน่อย



แต่พอได้เซตของ prime ที่มากพอ ก็จะนำไปใช้ในเรื่องต่างๆ

เช่นการแยกตัวประกอบ ได้ง่าย และสะดวกมาก





ที่สำคัญ



1. เราเข้าใจตัวหลักการทางคณิตศาสตร์ ที่พอเพียง



2. เรามีทักษะการเขียนโปรแกรมที่พอเพียง



แล้วก็รวมกับ ความคิดสร้างสรรค์ และจินตนาการของเรา





บางครั้งเทคนิคทางคณิตศาสตร์ ก็ทำให้ได้ขั้นตอนวิธี (algorithm) ที่มีประสิทธิภาพดีขึ้นมากๆ มากกว่าวิธีการลูกทุ่ง



บางครั้งเทคนิคทางการเขียนโปรแกรมก็อาจจะช่วยได้ ในเรื่องของการทำซ้ำ การคิดแบบเวียนเกิด
MG (IP:202.12.97.118,10.177.64.81,)

ความเห็นเพิ่มเติมที่ 24 4 เม.ย. 2549 (20:30)
ผู้ที่มาให้คำแนะนำน้องนั้น เขาเขียนโปรแกรมแบบนี้เป็นตั้งนานแล้วครับ แต่ได้เสียสละเวลามาแนะนำให้โปรแกรมน้องทำงานได้ดีขึ้น แทนที่จะขอคำแนะนำเพิ่มเติมตรงจุดที่ไม่เข้าใจกลับ ... เฮ้อ...



เอาเป็นว่า ผมจะแสดงการทดสอบ 48 ด้วยเลขต่างๆตั้งแต่ 2,3,...,47 ให้ดูสักครั้ง แล้วสังเกตความสมมาตรให้ดีๆครับ ว่าจำเป็นต้องไล่หารไปจนถึง 47 จริงๆรึเปล่า จะไม่มาแนะนำอะไรเพิ่มเติมอีกแล้ว



2 x 24 = 48

3 x 16= 48

4 x 12=48

6 x 8 = 48

8 x 6 = 48

12 x 4 = 48

16 x 3 = 48

24 x 2 = 48
555 (IP:58.9.197.111,,)

ความเห็นเพิ่มเติมที่ 25 5 เม.ย. 2549 (12:04)
ก็ขอบคุณมากๆ นะครับสำหรับคำแนะนำจากทุกท่าน



ผมเองไม่ได้จบเอกคณิตศาสตร์ ทฤษฎีบทบ้างอย่างอาจไม่แม่นเท่าคนจบคณิตศาสตร์โดยตรง



ตอนแรกเข้าใจว่าบางท่านยังไม่เข้าใจวิธีการของผมเลยพยายามอธิบายซ้ำไปซ้ำมา



วิธีการที่ผมใช้ ผมก็ใช้ตามสามัญสำนึกที่เรียนมาสมัยเด็ก ว่าจำนวนเฉพาะคือจำนวนที่มีเพียง 1 กับตัวมันเองเท่านั้นที่เป็นตัวประกอบ



ทฤษฎีบทมันก็ว่าเพียงเท่านี้อ่านดูได้ใจความเข้าใจง่าย โดยที่มันไม่ได้บอกเลยว่าถ้าจะหาจำนวนเฉพาะเอาตัวไปหารแค่รากที่สองของมันก็พอ



พอมาสอนเด็ก ผมก็สอนตามนั้น เด็กเข้าใจง่าย และพิสูจน์ให้เด็กเห็นได้จริงตามทฤษฎีบทดังกล่าว



และที่ผมเอาโปรแกรมนี้มาแจกไม่ได้ว่าจะเอามาอวดอ้างแต่อย่างใด แต่เห็นว่ามันมีประโยชน์ สำหรับครูสอนคณิตศาสตร์ เพราะบางครั้งเด็กมาถามเรา เกี่ยวกับการแยกตัวประกอบบางจำนวนมันก็แยกอยากเหมือนกัน



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



วิธีการนี้หาได้เร็วจริง แต่การสอนเด็กอาจทำให้เด็กเข้าใจได้ยาก เพราะเด็กต้องมีความรู้ก่อนว่า ทำไมถึงหารแค่รากที่สอง ซึ่งต้องใช้ความรู้สูงขึ้นมาอีกระดับหนึ่ง



คิดว่าถาเขียนใช้เองกับการสอนเด็กไม่เหมือนกัน เพราะต้องดูก่อนว่าเด็กที่เราสอนมีความรู้ขนาดไหน เด็กบางคนไม่ได้เรียนมาทางวิทย์-คณิต ขนาดผมสอนวิธีธรรมดายังทำไม่ได้เลยครับ



ก็ขอบคุณมากๆ ครับสำหรับคำแนะนำจากหลายๆท่าน
แงซาย (IP:58.11.68.100,192.168.3.201,)

ความเห็นเพิ่มเติมที่ 26 5 เม.ย. 2549 (15:10)
ผมคิดว่าใจคุณเริ่มเปิดแล้ว แต่เห็นได้ชัดว่ายังไม่ได้อ่านคคห.ของคุณวริน คุณ I'm boring คุณ MG และผมเลย



ผมจะขอลองอีกสักตั้งนะ เรื่องนี้เป็นเรื่องสำคัญ อย่าได้หยุดตัวเองด้วยเหตุผลเพียงแค่ไม่ได้จบเอกคณิตศาสตร์ หรือคิดไปก่อนว่าเรื่องนี้ยากเกินกว่าที่เด็กจะรับรู้ได้



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



ที่เคยเป็นอย่างนั้นเป็นเพราะตอนนั้นผมไม่รู้จักคิด ยอมแพ้ตั้งแต่ยังไม่ได้ลงมือทำ และผมเชื่อว่าเด็กจำนวนมากก็เป็นอย่างนั้น



ความจริงแยกตัวประกอบไม่ได้ถึกขนาดที่คิด แค่ถึกระดับเบาะๆ ถ้าเรารู้จักใช้ความรู้พื้นฐานบวกกับตรรกะเล็กน้อย



ผมจะลองให้คุณดูกับเลข 13



13/2 ได้ 6 กว่าๆ ไม่ลงตัว

13/3 ได้ 4 กว่าๆ ไม่ลงตัว

13/4 ได้ 3 กว่าๆ ไม่ลงตัว



เอ๊ะ... หารด้วย 4 ได้ 3 กว่าๆ แสดงว่าหารด้วย 5 ก็ต้องน้อยกว่านี้อีกสิ แล้วเลขที่น้อยกว่า 4 นั้นเราได้ลองไปหมดแล้วไม่มีตัวไหนหารลงตัวสักหน่อย



อย่างนี้ก็สรุปได้เลยว่า 13 นั้นเป็นจำนวนเฉพาะ



เห็นไหมว่าเด็กที่ไม่รู้จัก square root ก็ทำได้ ขอให้หารเป็นและช่างสังเกตสักหน่อยเท่านั้น



ผมฟันธงว่าเด็กประถมก็เข้าใจได้ ไม่ต้องมัธยมโปรแกรมวิทย์-คณิตแต่อย่างใด



ผลจากการใช้ความสังเกตแค่นี้ เราสามารถประหยัดเวลาในการทดสอบจำนวนเฉพาะและแยกตัวประกอบได้มาก ยิ่งเลขมากยิ่งช่วยมาก

ลองดูซิ

เลข 11 แทนที่จะต้องทดสอบ 9 ตัว เราสามารถทดสอบเพียง 3 ตัวเท่านั้น ใช้เพียงแค่ 1/3 ของการทดสอบจาก 2 ถึง n-1



หรือจำนวนเฉพาะใหญ่ๆอย่าง 2147483647(2^31-1) เราใช้แค่ราวๆ 1/50000 เท่านั้นเอง
CrazyHOrse
ร่วมแบ่งปัน567 ครั้ง - ดาว 109 ดวง

ความเห็นเพิ่มเติมที่ 27 5 เม.ย. 2549 (15:10)
สำหรับการต่อยอดออกไป



อย่างที่คุณแงซายว่า เรารู้อยู่แล้วว่านอกจาก 2 แล้วเลขคู่นั้นไม่ใช่จำนวนเฉพาะแน่นอน เราจึงสามารถทดสอบโดยใช้แต่เลขคี่



วิธีนี้ลดจำนวนตัวเลขที่ต้องทดสอบเหลือเพียง 50%



ในเมื่อเราสามารถตัดตัวที่หาร 2 ลงตัวออกได้ ทำไมเราไม่ทำกับพวกที่หาร 3 ลงตัวบ้างล่ะ



ฟังดูเหมือนต้องมาคำนวณกันวุ่นวาย แต่หากเราลองคิดดูผลการหารจำนวนด้วยเลข 2 จะซ้ำทุกๆ 2 จำนวน และหารด้วย 3 จะซ้ำทุกๆ 3 จำนวน ดังนั้นหากจัดเป็นกลุ่มเฉพาะของผลหาร 2 และ 3 จะได้เป็น ครน.ของ 2 และ 3 นั่นคือ 6



1 หาร 2 ไม่ลงตัว หาร 3 ไม่ลงตัว

2 หาร 2 ลงตัว หาร 3 ไม่ลงตัว

3 หาร 2 ไม่ลงตัว หาร 3 ลงตัว

4 หาร 2 ลงตัว หาร 3 ไม่ลงตัว

5 หาร 2 ไม่ลงตัว หาร 3 ไม่ลงตัว

6 หาร 2 ลงตัว หาร 3 ลงตัว



จะเห็นว่ามีตัวที่หารด้วย 2 และ 3 ไม่ลงตัวอยู่เพียง 2 จำนวน จากทุกๆ 6 จำนวน

เหลือ 1/3 เท่านั้นเอง



ถ้าลองเอาเลขที่หาร 5 ลงตัวมาร่วมวงด้วย ครน.ของ 2,3,5 คือ 30 ไล่ดูจะพบว่าจำนวนที่รอดไปได้มีเพียง 8 จำนวนในทุกๆ 30 จำนวน



นั่นคือเหลือเพียงไม่ถึง 27%



ทางปฏิบัติเราสามารถเอาไปใช้ได้อย่างไร



ไม่ยากเลยครับ ลองเขียนอย่างที่ผมทำกับ 2 และ 3 จะเห็นว่าลำดับของ 8 จำนวนในทุก 30 จำนวนคือ



ทดสอบด้วย 2,3,5,7 หลังจากนั้น +4, +2, +4, +2, +4, +6, +2, +6 แล้ววนไป +4, +2, +4, +2, +4, +6, +2, +6 ต่อไปเรื่อยๆจนกว่าจะได้คำตอบ



นั่นคือ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,49,53,...



algorithm นี้เหมาะกับ computer แต่สำหรับนักเรียนแล้วเลขที่ลงท้ายด้วย 5 และ 0 นั้นชัดเจนมาก(ในขณะที่ computer ต้องเปลืองเวลาคำนวณจึงรู้)



ดังนั้นการถอยกลับไปใช้แค่ 2 กับ 3 อาจจะเหมาะกว่า ลำดับก็ง่ายแก้การจดจำมาก

คือ หลังจากทดสอบ 2,3,5 แล้วก็แค่ทดสอบด้วยค่าที่ +2, +4, +2, +4 ไปเรื่อยๆ ตัวไหนลงด้วย 5 ก็ผ่านเลย



วิธีที่คล้ายคลึงกันนี้ครูสอนคณิตศาสตร์ควรได้ศึกษา The Sieve of Eratosthenes โดยหารายละเอียดได้ทั่วไปใน internet



แต่ถ้าเปลี่ยนโจทย์เป็นการหาจำนวนเฉพาะทุกตัวที่เป็นไปได้ในช่วง 1-n (ดังเช่นในโปรแกรมที่คุณแงซายทำไว้) จะมีวิธีดีๆหรือไม่



ทุกๆท่านข้างต้นได้ชี้แนะไว้แล้ว



ในเมื่อเราต้องหารหา prime ทุกตัว หากไม่ติดขัดเรื่องหน่วยความจำแล้วล่ะก็



เราก็ทดสอบด้วยตัวเลข prime ที่เรารู้อยู่ก่อนแล้ว



เริ่มต้นเรามี



2



ทดสอบ 3 ด้วย 2 ไม่ลงตัวแสดงว่า 3 เป็น prime number จะได้



2 3



ทดสอบ 4 ด้วย 2 3 ไม่ผ่านตั้งแต่ 2

ทดสอบ 5 ด้วย 2 3 ไม่ลงตัวแสดงว่า 5 เป็น prime number จะได้



2 3 5



ทำดังนี้ไปเรื่อยๆ



ง่ายไหม?



ทำมือก็ได้ขอแต่กระดาษแผ่นเดียวกับคนที่หารเลขเป็น ซึ่งก็คือเด็กประถมนั่นเอง



เด็กม.ต้นทำได้สบายมากๆเลยครับ
CrazyHOrse
ร่วมแบ่งปัน567 ครั้ง - ดาว 109 ดวง

ความเห็นเพิ่มเติมที่ 28 18 เม.ย. 2549 (15:34)
ถามหน่อยได้ไหมค่ะ ว่าตัวประกอบ 1-100 มีตัวอารายบ้าง และมีกี่ตัวค่ะ ช่วยตอบด้วยน่ะค่ะ จะขอบคุณเป็นอย่างสูงค่ะ
มิ้น (IP:203.156.36.195,,)

ความเห็นเพิ่มเติมที่ 30 12 ส.ค. 2549 (19:59)
ผมลองแก้ไขแล้วครับ ขั้นตอนยุ่งยากกว่าเดิมมาก วันหลังจะเอามาให้โหลดนะครับ





คุณมิ้น ไม่ลองโหลดไปใช้ดูเลยอ่ะครับ



++++++++++++++++++++++++++++++++++
แงซาย
ร่วมแบ่งปัน139 ครั้ง - ดาว 155 ดวง

ความเห็นเพิ่มเติมที่ 31 13 ส.ค. 2549 (04:47)
อะโห ลึกซึ้ง
neverheal
ร่วมแบ่งปัน548 ครั้ง - ดาว 230 ดวง

ความเห็นเพิ่มเติมที่ 32 23 ก.พ. 2550 (01:54)
ผมมีของมาฝาก ครับ

เป็นสคริปต์หาจำนวนเฉพาะ

วิธีใช้ก็ง่าย คัดลอกไปแปะใน NotePad แล้ว Save เป็น .html แล้วก็รันได้เลย

(ในเครื่องต้องมี IE ด้วยนะ ซึ่งคงจะมีอยู่แล้ว)



ต้องการหาจำนวนเฉพาะจากจำนวนใด ถึงจำนวนใด ให้ใส่ค่า min และ max เองนะครับ

-------------------------------------------------------------------------



<HTML>

<HEAD><TITLE>New Document</TITLE>

</HEAD>

<BODY>

<SCRIPT language=javascript>

var min = 12

var max = 100

num = min

document.write("จำนวนเฉพาะ จาก" +min+ " ถึง " +max+ " ได้แก่ "+"<br>")

for (num=min ;num<max ;++num){

for( d=1;d<num/2;++d){

mo=num%d

if (mo==0)

{++num ; d=1

}

}

document.write(num+", ")

d=1

}

</SCRIPT>

</BODY></HTML>



--------------------------------------------------------------------
np (IP:58.8.87.77)

ความเห็นเพิ่มเติมที่ 33 23 ก.พ. 2550 (02:24)
มีการแยกตัวประกอบด้วยนะครับ

------------------------------------------------------------------



<HTML>

<HEAD>

<TITLE> New Document </TITLE>

</HEAD>

<BODY bgcolor =#ffff00>

<SCRIPT LANGUAGE="JavaScript">

function factor(num){

var fact=""

var addF=""

document.write("<center>");

document.write("<font size = 5>"+"พิมพ์จำนวนที่ต้องการแยกตัวประกอบ")

document.write("<br><br>")

document.write(num+" = ")



for(f=2;f<=num;)

if(num%f==0)

{

fact=fact+" x "+f

addF=eval(addF+f)

num = num/f;

}else

{f++;



}

document.write(fact.substring(2,fact.length));

document.write("<br><br>")

document.write("ผลบวกของตัวประกอบ = "+addF);

document.write("<br><br>")

document.write("<a href = 'Entry_Fact.html'> [ restart ]</a>");

document.write("<a href = 'javascript:window.close();'>"+"[close]"+"</a>");

document.write("</center>");

}

</SCRIPT>

<center><font color = #000000>

<font size = 5>

พิมพ์จำนวนที่ต้องการแยกตัวประกอบ

<form name=myForm>

<input type = text name = num>

<input type = button value = submit onClick= factor(document.myForm.num.value);>

</form>

</form></h2></font><br>



<a href ="Entry_Fact.html">[Restart]</a>

<a href ="javarscript:window.close()">[close]</a>

</center>



</BODY>

</HTML>

----------------------------------------------------
np (IP:58.8.87.77)

ความเห็นเพิ่มเติมที่ 34 26 ก.พ. 2550 (08:24)
คุณ CrazyHOrse อยู่ ห น า ย . . . . .
np (IP:202.57.179.189)

ความเห็นเพิ่มเติมที่ 35 11 มี.ค. 2550 (22:39)
คุณแงซาย อยู่ ห น ว ย . . . . .
np (IP:58.8.89.244)

ความเห็นเพิ่มเติมที่ 38 14 มี.ค. 2550 (15:02)
ไอเดียดีครับ ใช้ javascript ไม่ต้องยุ่งยากไปหาโปรแกรมอะไรมาลง ทุกคนมี browser ย่อมต้องใช้ได้อยู่แล้ว



โปรแกรมใน #32 ใช้ loop ยังไม่ค่อยเหมาะสมนะครับ ผลลัพธ์ออกมามี 101 ทะลุเกินมาด้วย ที่สำคัญ การทดสอบเลข prime ใช้ถึง n/2 ดูจะฟุ่มเฟือยไปหน่อย ทดสอบถึง sqrt(n) ก็พอเพียงแล้วครับ
CrazyHOrse
ร่วมแบ่งปัน567 ครั้ง - ดาว 109 ดวง

ความเห็นเพิ่มเติมที่ 39 14 มี.ค. 2550 (15:08)
ผมลองทดสอบโปรแกรมใน #32 บน firefox ปรากฏว่าให้ทดสอบ 2-50000 firefox ถามให้หยุดการทำงานตั้งแต่แปดพันกว่าเท่านั้นเอง



เขียนใหม่ให้กระชับขึ้นอย่างนี้ โดยเพิ่มเกณฑ์ดังนี้

- ทดสอบเฉพาะเลขที่เป็นเลขคี่เท่านั้น

- เลขที่เอามาหาร ใช้ถึงแค่ sqrt(n)

- เลขที่เอามาหาร ใช้แต่เลขคี่เท่านั้น

เร็วขึ้นมากครับ ทดสอบ 2 - 50,000 ผ่านตลอดสบายๆ (เพิ่มส่วนจับเวลาให้ด้วย)


CrazyHOrse
ร่วมแบ่งปัน567 ครั้ง - ดาว 109 ดวง

ความเห็นเพิ่มเติมที่ 40 14 มี.ค. 2550 (15:22)
แก้ไม่ตกครับ โพสต์ code ไม่ได้ ทำไงดี
CrazyHOrse
ร่วมแบ่งปัน567 ครั้ง - ดาว 109 ดวง

ความเห็นเพิ่มเติมที่ 41 14 มี.ค. 2550 (15:42)


<SCRIPT language=javascript>

var d1 = new Date

begin = d1.getTime()

var min = 2

var max = 50000

num = min

document.write("¨Ó¹Ç¹à©¾ÒÐ ¨Ò¡" +min+ " ¶Ö§ " +max+ " ä´éá¡è "+"<br>")

if (max<min) exit

if ((min<=2)&&(max>=2)) document.write("2<br>")

if (min<3) min=3

if (max<min) exit

if (min%2==0) min++;

for (num=min ;num<=max ;num+=2){

if (isprime(num)) document.write(num+"<br>")

}

var d2 = new Date

end = d2.getTime()

runtime = end - begin

document.write("This process ran for "+ runtime + " microseconds!<br>")



function isprime(num) {

if (num==2) return(true)

if (num%2==0) return(false)

maxtest = Math.sqrt(num)

d=3

while (d <= maxtest) {

if (num%d==0) return(false)

d+=2

}

return (true)

}

</SCRIPT>


CrazyHOrse
ร่วมแบ่งปัน567 ครั้ง - ดาว 109 ดวง

ความเห็นเพิ่มเติมที่ 42 14 มี.ค. 2550 (15:49)
ได้ละ เล่นเอาเหนื่อย



วิธีนี้ทำให้โปรแกรมทำงานเร็วขึ้น แต่ยังไม่ถือว่าดีพอ เพราะวิธีที่ดีกว่านี้อีกหน่อยใน wiki เรียกว่าวิธีไร้เดียงสา (Naive Method) อ่านเพิ่มที่นี่ครับ http://en.wikipedia.org/wiki/Primality_test





วิธีใน #41 จะตัดตัวที่หารด้วย 2 ลงตัว(เลขคู่)ออกไป ในขณะที่วิธีไร้เดียงสาจะตัดตัวที่หารด้าย 3 ออกไปด้วย เรียกว่าถ้าเริ่มที่ 7 ตัวถัดไป +4 เป็น 11 ตัวถัดไป +2 เป็น 13 แล้ว +4, +2, +4, +2 สลับกันไปเรื่อยๆ ประสิทธิภาพจะดีกว่าวิธี #41 อีกราว 30% ดังนี้ครับ





<SCRIPT language=javascript>

var d1 = new Date

begin = d1.getTime()

var min = 2

var max = 50000

document.write("¨Ó¹Ç¹à©¾ÒÐ ¨Ò¡" +min+ " ¶Ö§ " +max+ " ä´éá¡è "+"<br>")

if (max<min) exit

if ((min<=2)&&(max>=2)) document.write("2<br>")

if ((min<=3)&&(max>=3)) document.write("3<br>")

if ((min<=5)&&(max>=5)) document.write("5<br>")

if (min<7) min=7

if (max<min) exit

i = (min-1)%6

if (i>0) min+=(4-i)

if (i==5) min+=2

if ((i==0)||(i==5)) {

s = 4;

} else s =2

number=min

while (number<=max){

if (fastisprime(number)) document.write(number+"<br>")

number+=s

if (s==4) {

s=2;

} else s=4

}

var d2 = new Date

end = d2.getTime()

runtime = end - begin

document.write("This process ran for "+ runtime + " microseconds!<br>")



function fastisprime(num) {

if (num%5==0) return(false)

maxtest = Math.sqrt(num)

d=7

step=4

while (d <= maxtest) {

if (num%d==0) return(false)

d+=step

if (step==4) {

step=2;

} else step=4

}

return (true)

}

</SCRIPT>


CrazyHOrse
ร่วมแบ่งปัน567 ครั้ง - ดาว 109 ดวง

ความเห็นเพิ่มเติมที่ 43 14 มี.ค. 2550 (15:55)
ถ้าวิธีข้างต้นยังไม่ดีพอ เราจะลองอีกสักวิธีก็ย่อมได้

วิธีนี้เรียกว่าตะแกรงของอีราโธสธีนีส (Sieve of Eratosthenes method)

จะต้องไล่ตั้งแต่ 2 เป็นต้นไป เก็บค่าจำนวนเฉพาะทุกค่าไว้ แล้วทดสอบตัวเลขด้วยจำนวนเฉพาะที่มีเก็บไว้แล้วเท่านั้น

แน่นอนว่า เราจะตัดตัวที่หารด้วย 2 และ 3 ออกด้วยวิธีข้างบน แล้วทดสอบถึง sqrt(n) เท่านั้น

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





<SCRIPT language=javascript>

var d1 = new Date

begin = d1.getTime()

var min = 2

var max = 50000

document.write("¨Ó¹Ç¹à©¾ÒÐ ¨Ò¡" +min+ " ¶Ö§ " +max+ " ä´éá¡è "+"<br>")



prime = new Array(5000)



if (max<min) exit

if (max>=2) document.write("2<br>")

if (max>=3) document.write("3<br>")

if (max>=5) document.write("5<br>")



prime[0] = 5

j=1

min=7

if (max<min) exit

step = 4;

number=min

while (number<=max){

flag=true

maxtest=Math.sqrt(number)

for (k=0;prime[k]<=maxtest;k++) {

if (number%prime[k]==0) {

flag=false

break

}

}

if (flag) {

document.write(number+"<br>")

prime[j] = number

j++

}

number+=step

if (step==4) {

step=2;

} else step=4

}

var d2 = new Date

end = d2.getTime()

runtime = end - begin

document.write("This process ran for "+ runtime + " microseconds!<br>")



</SCRIPT>


CrazyHOrse
ร่วมแบ่งปัน567 ครั้ง - ดาว 109 ดวง

ความเห็นเพิ่มเติมที่ 44 14 มี.ค. 2550 (15:59)
กรณีที่ต้องการทดสอบเลขที่มีค่ามากๆว่าเป็นจำนวนเฉพาะหรือไม่ วิธีที่มีประสิทธิภาพมากกว่าหาอ่านได้ที่นี่ครับ http://en.wikipedia.org/wiki/Primality_test





ผมได้ลอง Miller-Rabin Test แล้วไม่เหมาะกับเลขน้อยๆครับ(ช้า) ถ้าเลขใหญ่มากๆน่าจะกินขาดครับ
CrazyHOrse
ร่วมแบ่งปัน567 ครั้ง - ดาว 109 ดวง

ความเห็นเพิ่มเติมที่ 45 15 มี.ค. 2550 (12:27)
อ่าน คิดตาม ทดลองใช้ เปลี่ยนโน่ยเปลี่ยนี่ ปรับปรุงแก้ไข เปลี่ยนค่า เพ่มค่า ลดค่า ลองแก้ไขสคริปต์อยู่นะครับ
np (IP:202.57.179.163)

ความเห็นเพิ่มเติมที่ 46 18 เม.ย. 2550 (20:24)
เยี่ยมเลยครับท่าน



ผมเองก็เพิ่งรู้ว่าวิธีการมันหลากหลายขนาดนี้



ขอขอบคุณทุกท่านที่มาต่อยอดและแบ่งปันความรู้ให้



++++++++++++++++++++++++++++++++++++++++++++++++++
แงซาย
ร่วมแบ่งปัน139 ครั้ง - ดาว 155 ดวง

ความเห็นเพิ่มเติมที่ 47 24 มิ.ย. 2550 (01:40)
พี่ๆที่เยนC#โปรๆกันเเล้วช่วยadd ผมหน่อยคับ

ขอร้องจริงๆ

ช่วยเเนะนำที่เรียนเขียนโปรเเกรมดีๆให้หน่อยสิคับ
kajonkeati_BD9@hotmail.com (IP:158.108.210.72)

ความเห็นเพิ่มเติมที่ 49 18 พ.ค. 2551 (11:54)

งง


เบลล์ (IP:117.47.94.136)

ความเห็นเพิ่มเติมที่ 50 29 พ.ค. 2551 (17:59)
<P><FONT face="courier new, courier, mono">ขอบคุณค่ะ</FONT></P>

<P>&nbsp;</P>
นารา (IP:125.25.8.209)

ความเห็นเพิ่มเติมที่ 51 16 ม.ค. 2552 (12:40)

เด็กแว้น อยากเรียนเลขอีกจิง


นน (IP:125.25.228.217)

ความเห็นเพิ่มเติมที่ 52 27 มิ.ย. 2552 (17:07)

187เป็นจำนวนเฉพาะไหน


นำทิพย์ (IP:125.27.49.79)

ความเห็นเพิ่มเติมที่ 53 30 ส.ค. 2552 (17:02)

เก่งมากเลย
ขอบคุณน่ะค่ะ


charuamkwan@hotmail.com (IP:118.172.134.94)

ความเห็นเพิ่มเติมที่ 54 9 ก.ย. 2552 (16:19)

ลิงค์อันเดิมเสียครับ ลิ่งใหม่ที่นี่นะครับ

http://kroo.ipst.ac.th/teacher/result/result.php?mem=read&nid=920&pg=2

ชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชชช


แงซาย
ร่วมแบ่งปัน139 ครั้ง - ดาว 155 ดวง

ความเห็นเพิ่มเติมที่ 55 20 เม.ย. 2553 (17:21)
ง่ายมาก





หนูจะขึ้นป 6
Miruntee2316@hotmail (IP:202.149.25.225)

ความเห็นเพิ่มเติมที่ 56 29 พ.ย. 2553 (10:02)
งงอ่ะ อยากได้แบบว่า
เอาโค๊ดทั้งหมดของวิธีหาจำนวนของจำนวนเฉพาะในภาษาซีอ่ะ
สอง (IP:203.113.101.211)

ความเห็นเพิ่มเติมที่ 57 19 มิ.ย. 2555 (17:37)

โปรแกรมตัวนี้ผมแจกเมื่อนานมาก แจกตั้งแต่สมัยเป็นนักศึกษาจนมาเป็นอาจารย์สอน


พอดีมีน้องเมล์มาขอโปรแกรมบอกว่าลิ้งค์เดิมมันเสีย ตอนนี้อัพไฟล์ให้ใหม่แล้วนะครับ สามารถโหลดได้จากลิ้งค์ข้างล่างนี้


http://www.upload-thai.com/download.php?id=a73515fbafacd8e89199853352c43868




ถ้าติดปัญหาโหลดไม่ได้ หรือ ไฟล์หมดอายุอีกก็สามารถเมล์มาขอได้นะครับ prasitcu@hotmail.com


แงซาย
ร่วมแบ่งปัน139 ครั้ง - ดาว 155 ดวง

ความเห็นเพิ่มเติมที่ 58 27 มิ.ย. 2555 (18:24)
ไม่ได้เรื่อง
care_ssr@hotmail.com (IP:125.24.96.121)

จำไว้ตลอด

ความเห็นเพิ่มเติม วิชาการ.คอม
ชื่อ / email:
ข้อความ

กรุณาล๊อกอินก่อน เพื่อโพสต์รูปภาพ และ ใช้ LaTex ค่ะ สมัครสมาชิกฟรีตลอดชีพที่นี่
กรอกตัวอักษรตามภาพ
ตัวช่วย 1: CafeCode วิธีการใช้
ตัวช่วย 2: VSmilies วิธีการใช้
ตัวช่วย 3: พจนานุกรมไทย ออนไลน์ ฉบับราชบัณฑิต
ตัวช่วย 4 : dictionary ไทย<=>อังกฤษ ออนไลน์ จาก NECTEC
ตัวช่วย 5 : ดาวน์โหลด โปรแกรมช่วยพิมพ์ Latex เพื่อแสดงสมการบนวิชาการ.คอม
Google  
ผู้สนับสนุน คลิีกดูสถิติ
อีเมล : star@vcharkarn.com
โทรศัพท์ : 02-9620127
Creative Commons License สงวนสิทธิ์บางประการภายใต้สัญญาอนุญาต ครีเอทีฟคอมมอนส์ แสดงที่มา-ไม่ใช้เพื่อการค้า-ไม่ดัดแปลง 3.0 ประเทศไทย.
ท่านสามารถนำเนื้อหาในส่วนบทความไปใช้ แสดง เผยแพร่ โดยต้องอ้างอิงที่มา ห้ามใช้เพื่อการค้าและห้ามดัดแปลง
Page generated in0.2979 seconds !