CasNum - ไลบรารีเลขคณิตความแม่นยำไม่จำกัดด้วยวงเวียนและไม้บรรทัด
(github.com/0x0mer)- เป็น ไลบรารี Python ที่ทำเลขคณิตความแม่นยำไม่จำกัดโดยอิงจาก การสร้างเรขาคณิตด้วยวงเวียนและไม้บรรทัด โดยดำเนินการทุกอย่างผ่านการประกอบสร้างทางเรขาคณิต
- แทนค่าตัวเลขแต่ละตัวเป็นจุดบนระนาบ และทำ การบวก·การคูณ·การดำเนินการเชิงตรรกะ ทั้งหมดด้วยกฎการสร้าง
- สามารถแทนที่ ALU ภายในของ Game Boy emulator (PyBoy) ด้วย CasNum เพื่อรันเกมโดยใช้การคำนวณเชิงเรขาคณิตล้วน ๆ ได้
- มีทั้งตัวอย่าง RSA และตัวอย่างการรวมเข้ากับ Game Boy พร้อม วิวเวอร์แสดงผล (viewer) ที่ให้ดูขั้นตอนการสร้างได้แบบเรียลไทม์
- เผยแพร่ภายใต้ สัญญาอนุญาต MIT และมีการดัดแปลง/รวม PyBoy (LGPL v3) กับ 2048.gb (สัญญาอนุญาต zlib)
ภาพรวมของ CasNum
-
CasNum เป็นไลบรารี Python สำหรับทำเลขคณิตความแม่นยำไม่จำกัดด้วย การสร้างเรขาคณิตด้วยวงเวียนและไม้บรรทัด (compass and straightedge)
- ค่าทุกค่า
xจะแทนเป็นจุด(x, 0)บนระนาบ - การบวกทำโดยหาจุดกึ่งกลางของจุดสองจุดแล้วขยายผลเป็นสองเท่า
- การคูณและการหารสร้างขึ้นโดยใช้ หลักความคล้ายของสามเหลี่ยม
- การดำเนินการเชิงตรรกะ (AND, OR, XOR) ก็ถูกทำขึ้นในเชิงเรขาคณิตเช่นกัน
- ค่าทุกค่า
-
เอนจินการสร้างพื้นฐานอยู่ในไดเรกทอรี
cas/และรองรับการสร้างพื้นฐาน 5 แบบดังนี้- เส้นตรงที่ผ่านจุดสองจุด
- วงกลมที่มีจุดหนึ่งเป็นศูนย์กลางและผ่านอีกจุดหนึ่ง
- จุดตัดของเส้นตรงสองเส้น
- จุดตัดของเส้นตรงกับวงกลม
- จุดตัดของวงกลมสองวง
-
จากการดำเนินการสร้างเหล่านี้จึงนิยามคลาส CasNum ขึ้นมา และ ทำทั้งเลขคณิตและตรรกะทั้งหมดในเชิงเรขาคณิต
ฟีเจอร์หลักและการปรับให้เหมาะสม
- การคูณ การหาร และการดำเนินการโมดูโล ถูกสร้างขึ้นโดยอาศัยความคล้ายของสามเหลี่ยมและความสัมพันธ์ทางเรขาคณิต
- การดำเนินการบางอย่าง (เช่น การคูณสองเท่า) ทำได้มีประสิทธิภาพกว่าวิธีทั่วไป
- ใช้
lru_cacheของ Python เพื่อแคชผลลัพธ์การคำนวณ ทำให้เร็วขึ้นเมื่อนำผลเดิมกลับมาใช้ - แต่แคชอาจทำให้ การใช้หน่วยความจำเพิ่มขึ้นอย่างมาก จึงต้องระวัง
ตัวอย่างการใช้งาน
-
การสร้างโปรแกรมเข้ารหัส RSA
-
รวมเข้ากับ ALU ของ Game Boy emulator (PyBoy) เพื่อแทนที่การคำนวณทั้งหมดด้วย CasNum
- แก้ไขไฟล์
opcodes_gen.pyเพียงเล็กน้อยเท่านั้น - สามารถรัน ROM อย่าง Pokémon Red ได้ (แต่ใช้เวลาบูตราว 15 นาที)
- ตั้งแต่การรันครั้งที่สองเป็นต้นไป จะทำงานได้ราว 0.5~1 FPS ด้วยอานิสงส์ของแคช
- แก้ไขไฟล์
-
มีตัวอย่าง RSA และ Game Boy อยู่ในไดเรกทอรี
examples/ -
สามารถดูขั้นตอนการสร้างแบบเรียลไทม์ได้ผ่าน วิวเวอร์แสดงผล (
casnum/cas/viewer.py)
แนวคิดและประสิทธิภาพ
- เน้นจิตวิญญาณนักพัฒนาที่ลงมือสร้าง กระบวนการหาจุดกึ่งกลางจากการตัดกันของเส้นตรงและวงกลม ด้วยตัวเอง แทนที่จะเขียนแค่
a + bแบบง่าย ๆ - มีมุกเชิงปรัชญาว่า “ถ้าไม่สามารถเพิ่มตัวนับลูปได้โดยไม่ต้องแก้สมการกำลังสี่ ก็ยังไม่ใช่การเพิ่มค่าที่แท้จริง”
- ใช้คำว่า Time complexity: Yes / Space complexity: Also yes เพื่อเสียดสีว่าต้นทุนการคำนวณสูงมาก
การพึ่งพาและสัญญาอนุญาต
- การพึ่งพาที่จำเป็น:
sympy - การพึ่งพาแบบเลือกใช้:
pyglet(สำหรับการแสดงผล),pytest-lazy-fixtures(สำหรับการทดสอบ),pycryptodome(สำหรับตัวอย่าง RSA) - แจกจ่ายภายใต้ สัญญาอนุญาต MIT
- องค์ประกอบจากภายนอกที่รวมมา
- PyBoy (เวอร์ชันที่ดัดแปลง): LGPL v3.0
- ROM 2048.gb: สัญญาอนุญาต zlib
- PyBoy ถูกดัดแปลงให้ใช้ CasNum และสามารถดูต้นฉบับได้ที่ Baekalfen/PyBoy
FAQ
- “รัน Doom ได้ไหม?” → “ไม่ได้ เพราะมันเป็นตัวเลข”
- “เร็วไหม?” → “เร็วกว่าเขียนคัดลอก Euclid ด้วยมือลงกระดาษมาก”
- “ทำไมถึงสร้างมันขึ้นมา?” → “เพราะอยากได้เลขคณิตความแม่นยำไม่จำกัด แต่ในขณะเดียวกันก็ อยากจะรู้สึกอะไรบางอย่าง”
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มุกในรูปแบบ FAQ ชวนให้รู้สึกร่วมมาก
โดยเฉพาะท่อนที่ว่า “อยากได้เลขคณิตความแม่นยำตามต้องการ แต่ก็อยากรู้สึกถึงอารมณ์ด้วย” ที่น่าประทับใจมาก
เป็นทั้งโปรเจกต์และงานเขียนที่ ตลกมากอย่างยอดเยี่ยม
ประโยคที่ว่า “สิ่งที่ฉันเขียน อย่าลืมเซฟก่อนรัน” ทำเอาขำมาก
แค่อยากเพิ่มคำชมอีกนิด และหวังว่า 0x0mer จะสัมผัสได้ถึง แสงสว่างภายในใจ อันอบอุ่นจากปฏิกิริยานี้
ไม่นานมานี้เพิ่งดูวิดีโอ ‘การทำลูกบาศก์ให้มีปริมาตรเป็นสองเท่า’ ของช่อง Ben Syversen แล้วนั่นก็เป็นครั้งแรกที่ได้เรียนรู้เรื่อง การคำนวณด้วยวงเวียนและไม้บรรทัด
ขอบคุณที่นำโปรเจกต์นี้มาโพสต์
อยากรู้ว่าคุณไปเจอสิ่งนี้ได้อย่างไร
วลี “Euclid มากขึ้น 100%” เท่มากจริง ๆ
ดูเหมือนว่าสามารถ ทำให้การติดตั้งง่ายขึ้นโดยใช้แค่วงเวียน ได้ด้วย
ลองดู ทฤษฎีบท Mohr–Mascheroni
Mascheroni อุทิศหนังสือให้เขา และมีเกร็ดว่า Laplace เคยพูดว่า “ฉันคาดหวังได้ทุกอย่างจากเขา ยกเว้นบทเรียนเรขาคณิต”
บทความที่เกี่ยวข้อง
เป็นแนวทางที่น่าสนใจในการจัดการจำนวนขนาดใหญ่โดยไม่ต้องพึ่ง
BigIntอย่างเดียวการใช้ ฐาน 10^9 ทำให้คำนวณได้อย่างมีประสิทธิภาพด้วยตัวเลข JavaScript ปกติ และยังช่วยลดการใช้หน่วยความจำได้
อยากเห็น การเปรียบเทียบ benchmark กับ
BigIntตามเอนจินเบราว์เซอร์และเวอร์ชันของ Node ต่าง ๆคำพูดที่ว่า “ให้คิดว่านี่คือ ISA ของคุณ” ชัดเจนมากและ ประณีตในเชิงสัญศาสตร์
อยากรู้ว่าถ้าเทียบกับ ไลบรารี reals แล้วจะต่างกันอย่างไร
เป็นไอเดียที่เจ๋งมากจริง ๆ
สงสัยว่าจะสามารถวางสถานะเกมทั้งหมดและ ROM ลงบนระนาบ แล้วคำนวณสเต็ปถัดไปจากสถานะนั้นได้ไหม
ในทางทฤษฎีน่าจะเป็นไปได้ และอาจทำออกมาในรูปแบบที่ขยายไปไกลกว่า การจำลอง ALU ได้ด้วย
แต่ถ้าทำแบบนั้นก็ดูเหมือนจะลดความบริสุทธิ์ของแนวคิดลงไปนิดหน่อย
อีกไอเดียหนึ่งคือการลอง วาดกราฟิกเกมโดยตรงด้วยวงเวียนและไม้บรรทัด
เป็นโปรเจกต์ที่น่ารักมากจริง ๆ