Sense of number : ตอนที่ 1 - ไปดวงจันทร์

มาลองนั่งคิดกันเล่นๆ ว่าถ้าอยากจะไปดวงจันทร์

Tow
The Y’s Journey
2 min readFeb 8, 2018

--

Ref : https://www.behance.net/gallery/5336689/Moon-rocket

ระยะทางจากโลกคือ 384,400 กิโลเมตร

ตอนยานอพอลโล 11 ไปเหยียบดวงจันทร์ครั้งแรกใช้เวลาประมาณ 70 ชม. 38 นาที ก็ประมาณ 3 วัน

ถ้าขับรถด้วยความเร็ว 120km/hr จะใช้เวลาประมาณ 3,203 ชั่วโมง (133 วัน) โดยไม่ต้องคิดถึงแรงโน้มถ่วง

เอาล่ะ.. ก่อนจะเข้าสู่คำถาม มีกฎเล่นๆว่า หลังจากอ่านคำถามเสร็จให้ลองตอบตัวเลขที่คิดขึ้นมาได้ทันทีภายใน 5 วินาที ไม่ต้องคิด ไม่ต้องคำนวณ ไม่กดเครื่องคิดเลข แล้วมาลองดูกันว่าจะตรงมั้ย?

คำถามก็คือ…..

สมมุติกระดาษขนาด A4 หนาโดยประมาณ 0.1 มิลลิเมตร

ถ้าเราพับกระดาษใบเดิม.. พับทบไปเรื่อยๆ เราต้องพับกระดาษทั้งหมดกี่ทบ เราจึงจะได้ความหนาที่สูงพอที่จะไปถึงดวงจันทร์​ได้?

เลขแรกที่แว้บเข้ามาในหัวทันทีคือเลขอะไร? หรือคิดว่ามากกว่าจำนวนเลขอะไร?

พับทบไปเรื่อยๆ แบบนี้

เอ้า !!!! ตอบเลยยยยยยย !!!!

เอาล่ะ… มาดูกันว่า จะใช่ตัวเลขคิดไว้หรือเปล่า?

ระยะทางจากโลก ถึง ดวงจันทร์ 384,400 กิโลเมตร
= 384,400,000 เมตร
= 38,440,000,000 เซ็นติเมตร
= 384,400,000,000 มิลลิเมตร

ดังนั้นต้องใช้กระดาษ 3,844,000,000,000 แผ่น = 7,688,000,000 รีม

การพับกระดาษ 1 ครั้ง สมมุติได้ว่ามีความหนาเท่ากระดาษ 2 แผ่นซ้อนกัน

ถ้าเราพับกระดาษ 9 ครั้ง ก็จะได้กระดาษหนาประมาณ 1 รีม (500 แผ่น)

เฮ้ย!!! แค่ 9 ครั้ง ได้ 1 รีมแล้ว แต่เรายังต้องการอีกตั้ง 7 พันล้านกว่ารีม หนทางดูช่างยาวไกลเหลือเกิน (T^T,, )

ก็พับกันต่อไป…

ในที่สุด ครั้งที่ 42

2⁴² = 4,398,046,511,104 แผ่น = 8,796,093,022 รีม
เอ้า!! นี่ก็เลยดวงจันทร์ไปแล้ว!!!!!! 5555+

แต่ถ้า 41 ครั้งก็ยังไม่ถึงนะเพราะว่า
2⁴¹ = 2,199,023,255,552 แผ่น ขาดไปอีกหนึ่งล้านล้านกว่าๆ

มานั่งคิดดูๆ 42 ครั้งนี่ก็ดูว่าเป็นเลขที่ไม่เยอะมากนะ ถ้าคิดในแง่ว่าเราพับครึ่งกระดาษครั้งแรกประมาณ 1–2 วินาที ถ้าทำซ้ำๆ 42 ครั้ง ก็น่าจะใช้เวลาไม่น่าเกิน 3 นาที แต่กลายเป็นว่าเราสามารถไปถึงดวงจันทร์ได้เลยทีเดียว

นี่คือพลังของ “Exponential Growth”
พับทบกัน 100 ครั้ง คงสามารถทะลุจักรวาล 5555+

ความน่าสนใจจากการถามตอบเล่นกันแบบสนุกๆ กับหลายๆคน ว่าแบบเลขที่แว๊บเข้ามาทันทีหลังจากรู้คำถามเลย ก็คือ

คนส่วนใหญ่จะพูดตั้งแต่หลัก ล้าน ไปจนถึง หลายพันล้าน

คนที่เป็นโปรแกรมเมอร์ บางส่วนมักจะพูดทันทีเลยว่าเป็น Exponential นี่นา..​ แต่ Range ก็จะอยู่ในช่วง พัน ถึง แสน

และเพียงส่วนน้อยเท่านั้นที่พูดอยู่ที่ระดับหลัก <100

ทำไม… เราถึงพูดเรื่องนี้?

ในการเขียนโปรแกรม เรามักจะต้องมีการ deal กับเรื่องของตัวเลขตลอดเวลา ตัวแปรที่ใช้เก็บจำนวนเต็ม ส่วนใหญ่ มีขนาด 32 บิท หรือ 64 บิท ถ้าเปลี่ยนคำถามเป็น

ตัวเลข 384,400,000,000 สามารถเก็บใน Long (หรือ 64bit Integer) ได้รึเปล่า?

โปรแกรมเมอร์หลาย ๆ คนน่าจะตอบว่า “ ได้ ”

ถ้างั้นทำไมคำถามข้างต้น เราถึงตอบเลขที่เยอะเกินกว่า 64 ?

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

วิธีการที่ตรงไปตรงมาที่สุด สำหรับหลายๆปัญหา Runtime จะเป็น Exponential เมื่อเทียบกับขนาดของ Input

ซึ่งมันไม่ควรจะเป็น (ยกเว้น Input จะขนาดเล็กจัดจริงๆ)

แม้หลายๆคนจะรู้แต่ว่าก็ยัง underestimate มันไว้มากพอสมควร ว่ามันจะซักแค่ไหนกันเชียว?

นี่ก็เป็นตัวอย่างหนึ่งว่า แค่เพิ่มทีละสองเท่าแค่ 42 ครั้ง ก็เป็นตัวเลขถึง 4 ล้านล้านแล้ว แล้วถ้ามากกว่านี้ล่ะ? หรือถ้าเป็นเพิ่มทีละสามเท่า หรือ เพิ่มทีละสี่เท่าล่ะ?

ถ้าใครคิดว่าโม้ ก็ลองพับดูเล่นๆได้

ขอบคุณ Pattara Sukprasert สำหรับไอเดียในเรื่องนี้

บัยจ้า~
(•‾◡‾•)و ̑̑♡

--

--