Enigma ทำงานอย่างไร
เพื่อเพิ่มอรรถรสในการชมภาพยนต์ เรื่อง Imitation Game
จึงอยากจะขออธิบายการทำงานของเครื่อง Enigma ก่อน
ENIGMA ทำงานอย่างไร
ก่อนพูดถึงการทำงานของ ENIGMA ขอพูดเรื่องการเข้ารหัสก่อน มนุษย์ทั่วๆ ไปล้วนมีความลับ (Secret) ที่บอกใครไม่ได้ ยิ่งการรบด้วยแล้ว ข้อมูลต่าง ๆ ต้องปกปิดไม่ให้ฝ่ายตรงข้ามรู้ แต่ถ้าเราไม่สามารถสื่อสารข้อมูลให้ฝ่ายเรารู้ได้ ย่อมไม่มีประโยชน์
เช่น
Hitler ต้องการสั่งให้เรือรบของฝ่ายเยอรมันโจมตีอังกฤษย่อมต้องไม่อยากให้อังกฤษรู้ข้อมูลการโจมตีแน่นอน เช่น เรือรบไหนโจมตีเป้าหมายไหนเวลากี่โมง ถ้าอังกฤษรู้ข้อมูลก็จะเตรียมการป้องกันซึ่งไม่ดีกับฝ่ายเยอรมันแน่
Technology ในการส่งข้อมูลทั้งในอดีตและปัจจุบันสามารถโดนดักฟัง ดักข้อความได้โดยง่าย (เช่น ส่งผ่านคลื่นวิทยุ) ดังนั้น จึงใช้วิธีการเข้ารหัสข้อความเพื่อให้คนที่ขโมยข้อมูลตรงกลางระหว่างคนส่งและคนรับไม่สามารถเข้าใจข้อความได้ เช่น
เช่น นาย A อยากจะส่งจดหมายรัก (ข้อความลับ) ให้นางสาว B แต่กลัวพ่อว่า นาย A จึงเข้ารหัส (Encode) ข้อความก่อน เมื่อพ่อของนางสาว B ได้ข้อความไปก็ไม่เข้าใจอยู่ดี แต่นางสาว B สามารถเข้าใจได้ เพราะนางสาว B มีวิธีถอดรหัส (Decode) จริง ๆ แล้ว มีหลักฐานว่าการเข้ารหัสมีมาตั้งแต่สมัยเจงกิสข่านส่งข้อความแล้ว คงเพราะกลัวม้าเร็วโดนดักตีหัวและขโมยข้อความไป นอกจากนี้กระเทยไทยยังมีภาษาลู (เติมคำว่าลูไว้ข้างหน้าแล้วผวน1รอบ) การเข้ารหัสและถอดรหัสมีหลายแบบ และเป็นความหมกมุ่ยของมนุษย์บางกลุ่มมากๆ
การเข้ารหัสที่ติ่งต๊องที่สุดเช่น ROT-3 (Rotate-3) เช่น
A B C D E F G H……
X Y Z A B C D E…….
การเข้ารหัสคือ ถ้า Input บรรทัดบน จะได้ข้อความบรรทัดล่าง ซึ่งก็คือ กระเถิบไป 3 ตัวอักษร
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
X Y Z A B C D E F G H I J K L M N O P Q R S T Y V W
เช่นอยากส่งคำว่า ILOVEYOU จะได้ข้อความ
FILSBVLR สำหรับส่ง
ที่ต้องทำก็แค่บอก(ตกลงกับคนรับข้อความไว้ก่อนว่าจะส่งรหัสแบบ ROT-3)
เนื่องจากข้อความติ่งต๊องของมันจึงแกะง่ายโคตรๆ มนุษย์จึงคิดอีกวิธีขึ้นมา คือ การใช้ตาราง MAP โดยจะมีการตกลงกันล่วงหน้าว่าจะใช้ตารางแบบไหนในการ MAP ไปและกลับ เช่น ตารางต่อไปนี้
A B C D E F G H
H B E A C G D F
(ขออนุญาตเขียนแบบสมมุติ แค่ 8 ตัวอักษร)
เช่น อยากส่งคำว่า FABCFAB จะได้ข้อความเป็น
GHBEGHB
ซึ่งวิธีแกะคือใช้วิธีทางภาษาศาสตร์ และสถิติ เช่นในภาษาอังกฤษเรารู้ว่าตัว E , A เป็นอักษรที่ใช้เยอะ ตัวไหนมีเยอะ ๆ ก็ลองเดาเป็น E , A ก่อนแล้วทำการเดาแบบเดียวกันกับตัวอื่น ๆ (จริง ๆ วิธีการลึกซึ้งกว่านี้ นี่เป็นแค่ตัวอย่าง)
มนุษย์ก็เลยมีความคิดว่า จะต่อต้านการแกะโดยใช้สถิติยังไง IDEA ก็คือ ตัวอักษร A ตัวเดียว จะถูกแปลงเป็นตัวอักษรอื่น ๆ อีก หลายตัวเพื่อป้องกันการแกะโดยใช้สถิติได้ และนี่คือสิ่งที่ ENIGMA ทำ ENIGMA รับ Input 3 อย่าง
จะเห็นว่าค่า n เปลี่ยนไปเรื่อย ๆ ตามลำดับ แปลว่าถึงจะใส่ค่าเดียวกันเข้าไป enigma มากกว่า 1 ครั้ง ผลลัพธ์ก็จะเปลี่ยนไปเรื่อย ๆ ทำให้ไม่สามารถใช้สถิติแกะรหัสแบบนี้ได้
แล้ว ENIGMA ทำงานอย่างไร
Idea ของ ENIGMA ต้องการให้ตัวอักษรที่ผ่าน ENIGMA ออกมามั่วที่สุดและยังสามารถถอดรหัสได้โดยใช้ ENIGMA อีกเครื่องหนึ่ง
Output = f (input_char , initsetting , n)
ให้ f เป็น enigma function
Input_char เป็น ตัวอักษรที่จะEncode
Initsetting เป็น การตั้งค่าเครื่องเริ่มต้น
N เป็น ลำดับของตัวอักษรที่เข้า
Output เป็น ตัวอักษรที่ encode แล้ว
นอกจากนี้ enigma ยังต้องมีสมบัติ
ถ้า output = f (input_char , initsetting , n) แล้ว input_char = f (output , initsetting , n)
กล่าวคือ เอาตัวอักษร ใส่เข้าไปในenigma ออกมาได้ตัวอักษรใหม่ เอาตัวอักษรใหม่ใส่เข้าไปใน enigma อีกเครื่องหนึ่งที่ตั้งเครื่องเหมือนกับเครื่องแรกและลำดับเดียวกันต้องได้ตัวอักษรตัวแรกออกมา
การใช้ ENIGMA
1. ผู้ส่งสาร มีข้อความที่จะส่งให้เป็น K1
2. ผู้ส่งสารตั้งเครื่อง enigma ตามวิธีการตั้งเครื่อง ซึ่งวิธีการตั้งเครื่อง จะเปลี่ยนทุกวัน ตามภาพ
3. ผู้ส่งสารได้ตัวอักษรที่ encode แล้ว (K2)
4. ผู้ส่งสาร ส่งตัวอักษรที่ encode แล้วเข้าระบบ (K2) ไม่ต้องกลัวว่าจะถูกดักฟังเพราะ ถึงดักได้ก็ไม่มีประโยชน์เพราะไม่เข้าใจ และต่อให้ถูกขโมยเครื่อง enigma ไปก็ไม่สามารถถอดรหัสได้อยู่ดีเพราะว่าไม่รู้วิธีการติดตั้งเครื่องซึ่งเปลี่ยนทุกวัน
5. ผู้รับสาร รับ ตัวอักษรที่ encode แล้ว (K2)
6. ผู้รับสารตั้งเครื่องตามวิธีการติดตั้งเครื่องให้ตรงกับผู้ส่งสาร
7. นำข้อความที่ได้ encode แล้วเข้า enigma จะได้ข้อความเดิมกลับออกมา (K1)
จะเห็นว่า วิธีการเช้ารหัสและถอดรหัส ไม่เป็นความลับฝ่ายตรงข้ามขโมย enigma ไปก็ไม่มีประโยชน์ ข้อความที่ส่งก็ไม่เป็นความลับเพราะได้รับไปก็งงอยู่ดี แต่สิ่งที่เป็นความลับคือวิธีการตั้งเครื่อง enigma
ฝ่ายเยอรมันใช้วิธีการติดตั้งเครื่องที่เปลี่ยนทุกวัน พิมพ์ลงหมึกที่ละลายน้ำได้ แจกจ่ายเดือนต่อเดือน ถ้าจวนตัวจะถูกจับได้ ฝ่ายเยอรมันก็แค่เอาน้ำสาดวิธีการตั้งเครื่องก็จะละลายหายไป ความสุดยอดอยู่ที่ว่า วิธีการตั้งเครื่อง (KEY) สามารถเปลี่ยนได้บ่อย ๆ เปลี่ยนได้ ง่าย ๆ เมื่อเทียบกับ Algorithm ซึ่งถ้าเปลี่ยนก็ต้องเปลี่ยนเครื่องไปเลย การใช้ enigma จึงเป็นวิธีที่เหมาะสมมากมายในการรบ (ยุคเกือบ 100 ปี) ที่แล้ว
แกะดูข้างในเครื่อง enigma จะประกอบด้วย
1. Key board ก็ตามชื่อก็คือ ปุ่มมี26 ปุ่ม A-Z ใช้เป็น input
2. Light board คือไฟ มีตัวอักษรกำกับ A-Z ใช้เป็น Output
3. Rotors มี 3 ตัว ในเครื่อง (ตามมาตรฐาน) เวลาจะใช้มี 5 ตัว(ทั้งหมด) และเลือก 3 ตัว มาใช้ (ของ Army และ Air force) ของ (Navy จะใช้8ตัวเลือก3) การตั้ง Rotors จะมี 2 อย่าง คือ ตั้งจุดเริ่มต้น (ตั้งตำแหน่งเริ่มต้นว่าเริ่มจากตัวอักษรอะไร) และตำแหน่ง Kicker
เมื่อ Rotors C หมุนถึงจุด Kicker จะไปเตะให้ Rotors B ขยับไปหนึ่งตำแหน่งและเมื่อ Rotors B ขยับถึง Kicker จะไปเตะให้ A ขยับ 1 ตำแหน่ง
ภายใน Rotors จะมีการเดินสายแบบมั่ว ๆ เอาไว้ในแต่ละ Rotors จะเดินสายไม่เหมือนกัน เมื่อกดปุ่ม 1 ครั้ง Rotors ขวาสุดจะหมุน 1 step
4. Reflector หรือตัวสะท้อน จะไม่หมุน (Version ต่อมา สามารถหมุนได้) สามารถเปลี่ยนได้เหมือนกัน Reflector จะทำให้มั่นใจว่า กด A แล้วผลลัพธ์จะเป็นอันอื่นที่ไม่ใช่ A แน่นอน
5. Plug board เป็นที่เสียบปลั๊ก มีสาย 10 เส้น เป็นการเลือกเสียบ 10 คู่ รูที่ไม่ได้เสียบจะต่างกันเองแบบปกติ
Enigma wiring diagram
แสดงการทำงานของ Enigma
ความเป็นไปได้ทั้งหมดของ key (วิธีการ set เครื่องของ ENIGMA)
1. มี 5 Rotors (ของกองทัพบกและกองทัพอากาศของ Germars)
C(5 , 3) * 3! = (5*4*3*2*1) / ( 3*2*1*2*1) * (3*2*1)
= 5*4*3 กรณี
= 60 กรณี
2. มี 2 Reflector มี 2 กรณี
3. มีวิธีการตั้งจุดเริ่มต้นของ Rotors 26 แบบในแต่ละตัว
ดังนั้นมี 26 * 26 * 26 กรณี = 17576 กรณี
4. มีวิธีการตั้ง Kicker 26 แบบ ต้องตั้ง 2 ตัว (ตัวกลางและขวา)
มี 26 * 26 กรณี = 676 กรณี
5. Plug board มีสาย 10 เส้น ดังนั้นมี
1/10! * C(26 , 2) * C(24 , 2) * C(22 , 2) * …… C(8 , 2) = 26!/(10!*6!*2^10)
รวมทั้งหมด = 60 * 2 * 17576 * 676 * 150,738,274,937,250
ซึ่งได้ค่าประมาณ 320 ล้านล้านล้าน กรณี
การแกะ code enigma และจุดกำเนิด computer
ในเมื่อมี Key เยอะแยะไปหมดที่เป็นไปได้ เราจึงไม่สามารถใช้สมองของมนุษย์คิดได้ ดังนั้น Alan Turing จึงมาเกี่ยวข้องโดยการใช้เครื่องจักร (machine) ที่คิดเร็วกว่าคนโคตร ๆ เพื่อมาแก้ปัญหานี้และด้วยเวทมนต์ทางคณิตศาสตร์อีกสักกระบุง ฝ่ายอังกฤษจึงสร้าง Algorithm เพื่อสร้าง bombe เครื่องสำหรับแกะรหัส enigma
ในคราวต่อไปถ้าผมว่างผมจะพยายามอธิบายวิธีการแกะรหัส enigma ให้ฟังแบบไม่ต้องใช้ ทฤษฎีคณิตศาสตร์เยอะ ๆ นะครับ
ปล
1. Computer ในปัจจุบันสร้างโดยใช้แนวคิดของ Turing Machine ที่ Alan Turing เป็นคนคิด
2. Turing Test เป็นชื่อของวิธีการตรวจสอบปัญญาประดิษฐ์
3. Turing Award เป็นรางวัลสูงสุดของนักวิทยาศาสตร์คอมพิวเตอร์ (อารมณ์ประมาณ Nobel
prize ของ computer)
สำหรับคำถามที่ว่าเครื่องจักรสามารถคิดได้หรือไม่นั้น ผมขอไม่ตอบแต่ขอถามว่า เรือดำน้ำสามารถว่ายน้ำได้หรือไม่ คำตอบคือไม่ เรือดำน้ำไม่ว่ายน้ำ แต่เคลื่อนที่ได้ในน้ำ เครื่องจักรก็ไม่คิด แต่สามารถทำในสิ่งที่เหมือนกับมนุษย์คิดได้
___________________________________
http://expert-programming-tutor.com/
รับสอนเขียนโปรแกรมคอมพิวเตอร์
เพราะการเขียนโปรแกรมไม่ได้มีแค่การทำweb และการ insert/update/delete/select DB
[ view entry ] ( 3683 views ) | permalink | ( 3 / 3275 )
ทีมา
http://carlcheo.com/startcoding
[ view entry ] ( 4139 views ) | permalink | ( 3.2 / 1037 )
ทำไมคณิตศาสตร์สำคัญกับการเรียนเขียนโปรแกรมคอมพิวเตอร์
รับสอนเขียนโปรแกรมคอมพิวเตอร์
http://expert-programming-tutor.com/
ถ้าอยากเขียนโปรแกรมไม่เรียนคณิตศาสตร์ได้ไหมนะ?
คงเป็นคำถามที่หลายคนสงสัย จะว่าไปก็ต้องบอกว่าได้ครับ แต่โปรแกรมที่ได้จะมีลูกเล่นน้อย
นอกจากนี้ยังลำบากต่อผู้เรียนในการทำความเข้าใจอัลกอริทึมต่างๆเวลาเรียนอีกด้วย
และที่สำคัญคือนั่นจะไม่บรรลุจุดประสงค์ที่แท้จริงของการเขียนโปรแกรม
ทำไมหล่ะ? โดนัล เออร์วิน คนุธ (Donald Ervin Knuth) ผู้เป็นปรมาจารย์ด้านอัลกอริทึมกล่าวเรื่องการเขียนโปรแกรมไว้ว่า
“โปรแกรมที่ดีที่สุดเขียนขึ้นมาเพื่อให้เครื่องคำนวณ สามารถทำงานได้อย่างรวดเร็ว
และเพื่อให้มนุษย์นั้นสามารถเข้าใจเครื่องคำนวณเหล่านั้น
ในเชิงอุดมคติแล้วโปรแกรมเมอร์เป็นเหมือนนักเขียนรายงาน
ผู้ทำงานด้วยสุนทรียะตามแบบแผนและตามรูปแบบของงานเขียน
และรวมไปถึง [การใช้] ความคิดเรื่องคณิตศาสตร์
เพื่อจะสื่อสารให้รู้ว่าอัลกอริทึมทำงานอย่างไร
และเพื่อจูงใจให้ผู้อ่านเชื่อว่าผลลัพธ์จะถูกต้องเสมอ”
แล้วการเขียนโปรแกรมเขียนมาเพื่อคำนวณนั่นหมายความว่าอย่างไรนะ?
ถ้าจะพูดเรื่องนี้คงต้องเล่าถึงประวัติศาสตร์การเกิดคอมพิวเตอร์เสียก่อนว่ามนุษย์แต่ไหนแต่ไรมามีความต้องการที่จะหาเครื่องคำนวณอยู่แล้ว เช่น การขีดนับเลขกับกำแพงพัฒนามาหน่อยก็เป็นลูกคิดเป็นต้น วันเวลาผ่านไป เบส ปาสคาล(Blaise Pascal) ได้ประดิษฐ์เครื่องคำนวณแบบฟันเฟืองขึ้น โดยใช้หลักการหมุนของฟันเฟือง 1 อันถูกหมุนครบ 1 รอบ ฟันเฟืองอีกอันหนึ่งซึ่งอยู่ ทางด้านซ้ายจะถูกหมุนไปด้วยในเศษ 1 ส่วน 10 รอบ เครื่องมือของปาสคาลนี้ถูกนำมาขายในปี พ.ศ. 2188 แต่ไม่ค่อยมีคนนิยมเนื่องจากราคาแพง และตอนใช้งานจริงจะเกิดเหตุการณ์ที่ฟันเฟืองติดขัดบ่อยๆ ทำให้ผลลัพธ์ที่ได้ไม่ค่อยถูกต้องตรงความเป็นจริง ต่อมีไลบ์นิซGottfriend von Leibnitz) ได้ปรับปรุงเครื่องคำนวณของ ปาสคาลให้สามารถคูณและหารได้ด้วย
ชาลส์ แบบบิจ (Charles Babbage) “บิดาแห่งคอมพิวเตอร์” ต้องการสร้างเครื่องคำนวณหาผลต่าง แต่ไม่สำเร็จแต่ก็เป็นไอเดียของการสร้างคอมพิวเตอร์ต่อๆมา หลังจากนั้นเลดี้ เอดา(Lady Auqusta Ada Byron) ได้ทำการศึกษาความคิดของชาลส์ แบบิจจนเขียนวิธีการที่จะสร้างอย่างเป็นขั้นตอนด้วยภาษาคอมพิวเตอร์ชื่อ Ada จึงได้รับขนานนามว่าเป็น “โปรแกรมเมอร์คนแรก”อาดาได้ทำบัตรเจาะรูเพื่อให้คอมพิวเตอร์สามารถทำงานด้วยคำสั่งซ้ำๆจนเป็นที่มาของลูป(Loop)ในเวลาต่อมา ต่อในช่วงปี 1940 มีเครื่องคำนวณขนาดใหญ่ของจริงขึ้นมา โดยใช้หลอดสุญญากาศหลายๆท่อมาช่วยคำนวณเลขฐานสอง ชื่อ ENIAC (Electronic Numerical Integrator And Computer) แต่เครื่องแบบนี้ก็ร้อนมากแถมขนาดใหญ่มโหฬาร ต่อมาเลยทำเครื่องแบบ ทรานซิเตอร์ แทน.จอน นวูแมน (John Von Neumann) ได้พบวิธีการเก็บโปรแกรมไว้ ในหน่วยความจำของเครื่องเช่นเดียวกับการเก็บข้อมูลและต่อวงจรไฟฟ้า สำหรับการคำนวณ และการปฏิบัติการพื้นฐาน ไว้ให้เรียบร้อยภายในเครื่อง แล้วเรียกวงจรเหล่านี้ด้วยรหัสตัวเลขที่กำหนดไว้ เพื่อให้การใช้โปรแกรมง่ายขึ้น เครื่องคอมพิวเตอร์ที่ถูกพัฒนาขึ้นตามแนวความคิดนี้ได้แก่ EVAC (Electronic Ddiscreate Variable Automatic Computer)
คอมพิวเตอร์ถูกพัฒนามาเรื่อย John Backus และ IBM ร่วมกันสร้างภาษาคอมพิวเตอร์ชื่อ FORTRAN ซึ่งเป็นภาษาระดับสูง (high level programming language) ภาษาแรกในประวัติศาสตร์คอมพิวเตอร์ คอมพิวเตอร์ยุคต่อมาใช้ วงจรไอซี (Integrated Circuit) เป็นสารกึ่งตัวนำที่สามารถบรรจุวงจรทางตรรกะไว้แล้วพิมพ์บนแผ่นซิลิกอน (Silicon) เรียกว่า "ชิป"
หลังจากคอมพิวเตอร์ได้ผ่านการเวลาและมีภาษา Assembly ในการสั่งการเครื่องแล้วก็เกิดภาควิชาใหม่แยกออกมาจากภาควิชาคณิตศาสตร์นั้นคือภาควิชาคอมพิวเตอร์ที่มีการศึกษาด้านการพัฒนาซอร์ฟแวร์อย่างจริงจัง อลัน ทัวริ่ง(Alan Mathison Turing) ได้เขียนบทความชื่อ “ว่าด้วยจำนวนที่คำนวณได้และการประยุกต์ใช้สำหรับปัญหาการตัดสนใจ (On Computable Numbers with an application to the Entscheidungs problem)" บทความนี้เกี่ยวกับ คำสั่งตรรกะ (logical instructions)ของการทำงาน แล้วก็บอกว่าการทำงานต้องมี กฎเกณฑ์ที่แน่นอน (definite method) ทั้งหมดก็เป็นเรื่องที่เกี่ยวกับวิธีการเขียนโปรแกรมต่มมา ซึ่งทำให้ต่อมาเขาได้ชื่อว่าเป็น “ผู้ก่อตั้งวิทยาการคอมพิวเตอร์ในยุดใหม่”
จะเห็นได้ว่าจากประวัติคร่าวๆคอมพิวเตอร์นั้นเกิดจากการที่นักคณิตศาสตร์เริ่มจะขี้เกียจคิดเลขจนต้องหาเครื่องมาช่วยคิด ไปๆมาๆก็เลยกลายคอมพิวเตอร์และพัฒนากันมาจนถึงปัจจุบัน หากจะบอกคอมพิวเตอร์ไม่เกี่ยวกับคณิตศาสตร์ก็คงไม่ใช่แล้ว นี่เป็นเหตุผลแรกเลยก็ว่าได้ว่าทำไมเราจึงควรเรียนคณิตศาสตร์ ก็เพื่อให้เข้าใจคอมพิวเตอร์ได้มากที่สุดนั่นเอง
หน้าที่หลักของคอมพิวเตอร์คือการคำนวณแทนมนุษย์อย่างที่ได้กล่าวไปแล้ว แล้วจะคำนวณได้อย่างไรกันนะ?
ALU (Arithmetic & Logical Unit : ALU) หรือหน่วยคำนวณตรรกะ ทำหน้าที่เหมือนกับเครื่องคำนวณอยู่ในเครื่องคอมพิวเตอร์โดยทำงานเกี่ยวข้องกับ การคำนวณทางคณิตศาสตร์ เช่น บวก ลบ คูณ หาร นอกจากนี้ยังสามารถคำนวณในเชิงตรรกะศาสตร์ ได้แก่ ความสามารถในการเปรียบเทียบตามเงื่อนไข และกฎเกณฑ์ทางคณิตศาสตร์ เพื่อตรวจเงื่อนไขนั้นเป็น จริง หรือ เท็จ เช่น เปรียบเทียบมากว่า น้อยกว่า เท่ากัน ไม่เท่ากัน ของจำนวน 2 จำนวน เป็นต้น ซึ่งการเปรียบเทียบนี้มักจะใช้ในการเลือกทำงานของเครื่องคอมพิวเตอร์ จะทำตามคำสั่งใดของโปรแกรมเป็น คำสั่งต่อไป
ส่วนคำนวณเป็นส่วนประมวลผล ซึ่งนับว่าเป็นส่วนที่สำคัญที่สุดของเครื่องคอมพิวเตอร์ ส่วนคำนวณทำหน้าที่ใหญ่ ๆ สองประการ คือ ประการแรกทำการบวก ลบ คูณ และหาร ประการที่สองคือ ทำหน้าที่ตัดสินใจว่าข้อมูลมากกว่าหรือน้อยกว่าอีกข้อมูลหนึ่ง หน้าที่ทั้งสองประการนี้สามารถเกิดได้ด้วยการอาศัยวงจรตรรกะที่เป็นวงจรอิเล็กทรอนิกส์ จึงทำให้ส่วนคำนวณนี้มีชื่อเรียกอีกอย่างหนึ่งว่า ส่วนคำนวณตรรกะ (arithmetic logic unit; ALU) นอกจากนี้ ส่วนคำนวณสามารถเลื่อนข้อมูลไปทางซ้าย หรือทางขวา เก็บหรือย้ายข้อมูลไปยังส่วนอื่น ๆ ของส่วนควบคุมกลางได้ วงจรตรรกะ (logic circuits) เป็นวงจรทางอิเล็กทรอนิกส์ที่ใช้ส่วนประกอบ เช่น ตัวความต้านทาน ตัวเก็บประจุ ไดโอด ทรานซิสเตอร์ ฯลฯ มาจัดให้สามารถทำงานแทนการคำนวณทางตรรกะได้ โดยใช้ "การมีสัญญาณไฟฟ้า" และ "ไม่มีสัญญาณไฟฟ้า" แทนสภาวะตรรกะ "จริง" และ "เท็จ" หรือ "1" กับ "0"
และนี่ก็คือการทำงานของคอมพิวเตอร์นั่นเองต้องอาศัยเรื่องการคำนวณและตรรกศาสตร์ ซึ่งเรื่องพวกนี้ยังช่วยพัฒนาระบบความคิดของเราให้เป็นระบบซึ่งจะทำให้ง่ายต่อการเข้าอัลกอริทึมหรือวิธีคิดในการเขียนโปรแกรมคอมพิวเตอร์ด้วย
คณิตศาสตร์ช่วยเราแก้ปัญหาอะไรเราบ้าง?
ก็อย่างที่เรารู้กันแล้วว่าคอมพิวเตอร์ช่วยแก้ปัญหาทางคณิตศาสตร์ได้ แล้วคณิตศาสตร์ช่วยแก้ปัญหาอะไรให้เราบ้างนะ เราก็จะพบว่าโลกที่เราอยู่ทุกวันเต็มไปด้วยคณิตศาสตร์อยู่รอบตัวเรา
เช่น เวลาที่อยู่บ้าน เราตื่นนอนด้วยนาฬิกาปลุก ก็ต้องตั้งนาฬิกาปลุก ไหนจะตอนไม่ตื่นแล้วกดเลื่อนเวลานาฬิกาก็ต้องทำการคำนวณหาเวลาใหม่และทำการปลุกต่อไป ไม่เพียงแค่นี้เท่านั้นเรายังต้องใช้การคำนวณทำสิ่งต่างๆอีกมากมาย ทั้งการคำนวณเวลารายรับรายจ่ายประจำวัน หรือหาเฉลี่ยของค่าใช้จ่ายรายเดือน หรือแม้กระทั่งเราจะทาสีบ้านต้องใช้สีเท่าไหร่ จะวางเฟอร์นิเจอร์อย่างไรให้ได้พื้นที่ใช้สอยสูงสุด
และเวลาที่ไปเที่ยวก็ยังต้องมีการคำนวณระยะทาง ระดับน้ำมันที่จะใช้ หรือถ้าขึ้นเครื่องบินเราก็ต้องคำนวณการเดินทางไปให้ทันเวลาออก ไหนจะน้ำหนักกระเป่า ว่าเราควรจะใส่อะไรในกระเป่าให้เป็นประโยชน์มากที่สุดก็ล้วนต้องใช้คณิตศาสตร์
นอกจากนี้ในระดับประเทศเราก็ยังระบบธนาคารการคำนวณดอกเบี้ย หากเราฝากเงินไว้กับธนาคารเราจะสามารถคำนวณล่วงหน้าถึงดอกเบี้ยที่จะได้ ราคาหุ้นที่ต้องเปลี่ยนไปวินาทีต่อวินาทีต้องมีการคำนวณอย่างรวดเร็วบนหน้าจอแสดงผล การเก็บข้อมูลประชากรก็ไม่ใช่เรื่องเล่นๆ เรายังต้องคำนวณหาว่าแล้วพลเมืองของรัฐจะเติมโตขึ้นกี่เปอร์เซ็นต์เพื่อนำไปคำนวณด้านอาหาร พลังงานและโรงเรียน สาธารณูปโภคให้มีเท่ากับความต้องการของคนในชาติ หรือถ้าพบว่ามีแนวโน้มลดลงเราจะหาคนจากไหนมาทำงานต่อ รวมไปถึงเวลามีโรคแพร่ระบาดก็ต้องควบคุมประชากรและคำนวณหาโอกาสของผู้ที่จะติดเชื้อด้วย การหาเลขบัตรประชาชนที่จะไม่ซ้ำกับคนอื่นๆ
และสำคัญที่สุดที่ขาดไม่ได้คือโลกแห่งวิทยาศาสตร์ที่เติมโตไปข้างหน้าทุกวันก็ปฏิเสธไม่ได้เลยว่าวิทยาศาสตร์ต้องเดินด้วยคณิตศาสตร์ คอมพิวเตอร์เป็นเทคโนโลยีเป็นวิทยาศาสตร์ก็ต้องเดินด้วยคณิตศาสตร์ แต่ก่อนนักวิทยาศาสตร์นั้นอธิบายปรากฏการณ์ของโลกด้วยคำบรรยายมากมาย แต่เมื่อกาลิเลโอผู้มีเรื่องเล่าว่าไปโยนหินบนหอเอนปิซ่า ได้ขึ้นมาประกาศว่าต่อไปนี้ฟิสิกส์ และธรรมชาติ จะสามารถอธิบายด้วยคณิตศาสตร์ได้เพราะคณิตศาสตร์มีความถูกต้องเหมือนกับที่ฟิสิกส์มีความถูกต้อง ก็เป็นที่นิยมมาถึงปัจจุบันที่ฟิสิกส์และศาสตร์อื่นนำคณิตศาสตร์มาใช้อธิบายโลก เช่น การเดินทางดวงจันทร์ และการคำนวณอื่นๆอีกมากมาย
เกมส์ต่างๆที่เราเล่นก็ต้องใช้คณิตศาสตร์นะ ทุกวันนี้เวลาต้องเดินทางด้วยรถเมล์หรือบีทีเอสนานๆมันคงน่าเบื่อไม่น้อยถ้าเรายังต้องมานั่งบิดบัตรบีทีเอสเล่นไปมา แต่ด้วยความโชคดีที่เหล่าโปรแกรมเมอร์ทั้งหลายต่างสร้างเกมส์มาเพื่อแก้เบื่อให้เรา แล้วเกมส์มันสร้างยังไงล่ะ คำตอบคือเกมส์ก็เป็นการคำนวณทางคณิตศาสตร์ ขั้นเล็กน้อย ตั้งแต่ set vector ,matrix เช่นการเปลี่ยนตำแหน่งของตัวละคร ให้สัตว์ประหลาดหรือมอนสเตอร์มาโจมตีผู้เล่นต่างก็เป็นคณิตศาสตร์ทั้งนั้น ไปจนถึงคณิตศาสตร์ชั้นสูง (calculus , linear algebra ฯลฯ )เช่น การ simulate ต่างๆ มากมาย
ในชีวิตประจำวันๆหนึ่งเราไม่สามารถหนีคณิตศาสตร์ได้เลยจริงๆ แต่การคำนวณทางคณิตศาสตร์จะทำทุกครั้งด้วยตัวเองก็ไม่ไหว เราจึงควรศึกษาคณิตศาสตร์เพื่อมาเขียนโปรแกรมซะ ชีวิตจะได้ง่ายขึ้นเยอะ
สมองมนุษย์กับคณิตศาสตร์
และนอกจากนี้ ถึงจะไม่เกี่ยวกับคอมพิวเตอร์เท่าไหร่ แต่การเรียนคณิตศาสตร์ก็ยังมีช่วยในจิตใจสงบและเกิดสุนทรียภาพด้วย จากบทความ “Mathematics: Why the brain sees maths as beauty” โดย James Gallagher ก็ยังกล่าวว่า ความงามของคณิตศาสตร์เกิดจากการที่ตอนแรกเรามองไม่เห็นความเชื่อมโยงของสัญลักษณ์ต่างๆแต่เมื่อเมื่อเชื่อมโยงกันและเราเข้าใจสมองจะทำงานในรูปแบบเดียวกับตอนที่เราดูงอนศิลปะเลยทีเช่น เช่น e^{i *pi} + 1 = 0 เราอาจไม่เข้าใจ e i และ pi สัมพันธ์กันอย่างไรแต่เมื่อมันสัมพันธ์กันเราก็จะเกิดความสุนทรีย์ การเรียนคณิตศาสตร์ก็เป็นการคลายเครียดไปอีกแบบนั่นเอง
*************************************
บทความโดยน้องตี้
รับสอนเขียนโปรแกรมคอมพิวเตอร์
http://expert-programming-tutor.com/
[ view entry ] ( 1318 views ) | permalink | ( 2.9 / 1303 )
3 เหตุผลว่าทำไม่อยากเขียนเกมต้องตั้งใจเรียนคณิตศาสตร์(ตอนที่ 1)
โดย expert-programming-tutor.com
รับสอนเขียนโปรแกรมคอมพิวเตอร์ 0853507540
EPT
เกมเป็นเป้าหมายหลักของคนเรียนเขียนโปรแกรมคอมพิวเตอร์บางส่วน เพราะเกมมีความสนุก และน่าสนใจในตัวมันเอง ไม่เพียงแต่เด็กๆเท่านั้นที่ชอบเกมผู้ใหญ่หลายคนก็ชอบ ยิ่งในปัจจุบันที่ เกมไม่ได้มีเฉพาะใน computer เครื่องใหญ่ๆ อย่างเดียวใน มือถือและ tablet ก็เต็มไปด้วยเกม มีผู้ใหญ่และเด็กหลายคนถามผมว่าอยากเขียนเกมเป็นต้องรู้อะไรบ้าง ก่อนจะไปถึงคำตอบนั้น เราจะมาดูเหตุผลก่อนว่า ทำไมอยากเรียนเขียนเกม (แบบเจาะลึก สไตล์ EXPERT-PROGRAMMING-TUTOR.com )ต้องตั้งใจเรียนเลข
เกมคอมพิวเตอร์คือ software ที่ทำหน้าที่ให้ความสนุกกับคนเล่น โดยส่วนใหญ่จะเป็นการจำลองสถานการณ์ ทั้งจากโลกจริง หรือจากโลกในจินตนาการ เปรียบเหมือนการสร้างโลกสมมุติ ขึ้นมาเพื่อความสนุกสนาน ในเมื่อเป็นโลกสมมุติ หลายๆอย่างอาจจะไม่เหมือนในโลกจริง แต่กฏบางอย่างยังต้องอยู่ เพื่อความสนุก เช่น โดนยิงต้องตาย ตกจากที่สูงต้องพลังลด ตาต้องสามารถมองเหตุวัตถุต่างๆ
แล้วคณิตศาสตร์เกี่ยวอะไร
1 Graphics
ระบบของ computer Graphics ในปัจจุบันมีสองระบบใหญ่ๆ
1 ray tracing (http://en.wikipedia.org/wiki/Ray_tracing_(graphics) ) เป็นการจำลองการตกกระทบของแสง ยังวัตถุและสะท้อนเข้าสู่ตา (กล้อง) นอกจากนี้ยังคำนวณ การตกกระทบการหักเหของแสงในวัตถุที่มีความหนาแน่นต่างกัน วิธีการนี้ใช้เวลา render นานมาก นิยมใช้ในอุตสาหกรรมภาพยนต์ และงานที่ต้องการความเหมือนจริงมากๆ
ซึ่งการเขียนโปรแกรมตรงนี้ต้องใช้ความรู้คณิตศาสตร์ เรื่อง vector , matrix , ระบบจำนวนจริง , ภาคตัดกรวย , ตรีโกณต์มิติ
ความรู้ฟิสิกส์ เรื่อง แสง ,การหักเหของแสงในตัวกลาง
2 การ Geometry transformวิธีเป็นวิธีที่ใช้ในเกม
หลักการคือ วัตถุต่างๆ เช่นหมี หมา กา ไก่ในเกม จะประกอบด้วย polygon หรือ รูปหลายเหลี่ยมเล็กๆประกอบกัน เช่น
กระต่ายstanford นี้ ประกอบด้วยสามเหลี่ยมเล็กๆจำนวนมากประกอบกัน ยิ่งสามเหลี่ยมมีขนาดเล็กเท่าไหร ก็ยิ่งสามารถ สร้างวัตถุที่ระเอียดเหมือนจริงได้มากเท่านั้น
polygon จะประกอบด้วยจุดยอดเรียกว่า vertex
ซึ่งจะนำมา transform โดยใช้ camera matrix (projective transform) ตามภาพ
หลังจากนี้ก็จะผ่านไปยังกระบวนการให้สี Shader ในที่นี้จะกล่าวถึงวิธีการของ ฟง
ซึ่งมีสูตรดังนี้
ซึ่งการเขียนโปรแกรมตรงนี้ต้องใช้ความรู้คณิตศาสตร์ เรื่อง vector , matrix , ระบบจำนวนจริง , ภาคตัดกรวย , ตรีโกณต์มิติ ,space
นอกจากนี้การเขียนเกมคอมพิวเตอร์ยัง มีเรื่องของ ระบบ AI (ปัญญาประดิษฐ์) ระบบ physics
ซึ่งยังไม่ได้กล่าวถึงในบทความนี้อีกด้วย แล้วโอกาศหน้าผมจะเขียนถึง AI ในเร็วๆนี้
เห็นไหมครับว่าการเรียนคณิตศาสตร์ไม่ใช่เรียนเพื่อเอาไปสอบอย่างเดียวฝาก บทความนี้ไว้เป็นแรงบันดาลใจในการเรียนเลขของเด็กๆม.ต้น ม.ปลายทุกคนครับ
ref.
http://www.gconsole.com/cgi-bin2/show.p ... mp;id=8803
http://homepages.inf.ed.ac.uk/rbf/CVonl ... node3.html
http://en.wikipedia.org/wiki/Phong_reflection_model
[ view entry ] ( 1832 views ) | permalink | ( 2.5 / 89 )
การใส่ลายน้ำให้รูปพร้อมๆกันเยอะๆ
ลายน้ำหรือ watermark คือ ไอ้คำว่า expert-programming-tutor.com ในรูปนี้
เคยเป็นไหม อยากจะใส่ลายน้ำ ให้รูปพร้อมๆกันหลายๆ รูป แบบไม่ต้องมานั่งทำด้วยมือที่ละ file
บางคนอาจจะขยัยแต่สำหรับคนขี้เกียจอย่างผมผมจึงเขียน code ขึ้นมาให้คอมพิวเตอร์ช่วยทำ
จึงขออธิบายวิธีการเป็น step แบบนี้
1 list รูปทุกรูปใน folder ที่เราต้องการ ก่อน
private void button1_Click(object sender, EventArgs e)
{
ProcessDirectory("D:\\JAVA_งานน้องตี้\\HTMLPad\\img");
}
public void ProcessDirectory(string targetDirectory)
{
// Process the list of files found in the directory.
string[] fileEntries = Directory.GetFiles(targetDirectory);
foreach (string fileName in fileEntries)
ProcessFile(fileName);
// Recurse into subdirectories of this directory.
string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
foreach (string subdirectory in subdirectoryEntries)
ProcessDirectory(subdirectory);
}
โดยใน code นี้จะเป็นการ recursive ไปตาม folder ต่างๆที่เป็น folder ลูกของ folder ตั้งต้นของเรา
แล้ว เรียก function ProcessFile
2 step ที่สอง คือ
public static void ProcessFile(string path)
{
Console.WriteLine("Processed file '{0}'.", path);
Bitmap bmp = (Bitmap)(Bitmap.FromFile(path));
Graphics gg = Graphics.FromImage(bmp);
gg.TranslateTransform(20, 20);
gg.RotateTransform((float)( 180.0 / Math.PI * Math.Atan2(bmp.Height , bmp.Width ) ));
SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 255));
gg.CompositingQuality = CompositingQuality.GammaCorrected;
gg.DrawString("expert-programming-tutor.com Tel. 0853507540", new Font("Ariel", 25, FontStyle.Regular), semiTransBrush, 0, 0);
gg.Flush();
String path2 = path.Replace("D:\\JAVA_งานน้องตี้\\HTMLPad\\img\\", "D:\\JAVA_งานน้องตี้\\HTMLPad\\img2\\") ;
if (! Directory .Exists ( Path.GetDirectoryName (path2 ) ))
{
Directory.CreateDirectory(Path.GetDirectoryName(path2));
}
bmp.Save(path2, System.Drawing.Imaging.ImageFormat.Jpeg);
}
สร้าง Graphics จาก Bitmap
translate
rotate
ไปยังตำแหน่งที่ต้องการ
พิมพ์ข้อความที่ต้องการลงไป
save รูปไปยัง path ใหม่ที่ต้องการ
ความรู้ที่ใช้สำหรับเรื่องนี้ (การใส่ watermark แบบ อัตโนมัต)
1 LOOP
2 recursive
3 Array
4 Graphics
5 การ search google หาวิธีใช้ transparent
6 การ translate และ การ rotate รูป
[ view entry ] ( 1239 views ) | permalink | ( 3 / 1776 )
<Back | 1 | 2 | 3 | 4 | 5 | Next> Last>>