2 คะแนน โดย GN⁺ 2026-03-09 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เป็น ไลบรารี 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 ความคิดเห็น

 
GN⁺ 2026-03-09
ความคิดเห็นจาก Hacker News
  • มุกในรูปแบบ FAQ ชวนให้รู้สึกร่วมมาก
    โดยเฉพาะท่อนที่ว่า “อยากได้เลขคณิตความแม่นยำตามต้องการ แต่ก็อยากรู้สึกถึงอารมณ์ด้วย” ที่น่าประทับใจมาก

    • ขอบคุณ! ดีใจมากจริง ๆ ที่คุณรู้สึกแบบนั้น
  • เป็นทั้งโปรเจกต์และงานเขียนที่ ตลกมากอย่างยอดเยี่ยม
    ประโยคที่ว่า “สิ่งที่ฉันเขียน อย่าลืมเซฟก่อนรัน” ทำเอาขำมาก
    แค่อยากเพิ่มคำชมอีกนิด และหวังว่า 0x0mer จะสัมผัสได้ถึง แสงสว่างภายในใจ อันอบอุ่นจากปฏิกิริยานี้

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

  • ขอบคุณที่นำโปรเจกต์นี้มาโพสต์
    อยากรู้ว่าคุณไปเจอสิ่งนี้ได้อย่างไร

    • CasNum คือ ไลบรารีเลขคณิตความแม่นยำตามต้องการที่สร้างด้วยวงเวียนและไม้บรรทัด
      วลี “Euclid มากขึ้น 100%” เท่มากจริง ๆ
  • ดูเหมือนว่าสามารถ ทำให้การติดตั้งง่ายขึ้นโดยใช้แค่วงเวียน ได้ด้วย
    ลองดู ทฤษฎีบท Mohr–Mascheroni

    • ว่ากันว่า Napoleon เองก็สนใจเรื่องแนวนี้มาก
      Mascheroni อุทิศหนังสือให้เขา และมีเกร็ดว่า Laplace เคยพูดว่า “ฉันคาดหวังได้ทุกอย่างจากเขา ยกเว้นบทเรียนเรขาคณิต”
      บทความที่เกี่ยวข้อง
  • เป็นแนวทางที่น่าสนใจในการจัดการจำนวนขนาดใหญ่โดยไม่ต้องพึ่ง BigInt อย่างเดียว
    การใช้ ฐาน 10^9 ทำให้คำนวณได้อย่างมีประสิทธิภาพด้วยตัวเลข JavaScript ปกติ และยังช่วยลดการใช้หน่วยความจำได้
    อยากเห็น การเปรียบเทียบ benchmark กับ BigInt ตามเอนจินเบราว์เซอร์และเวอร์ชันของ Node ต่าง ๆ

  • คำพูดที่ว่า “ให้คิดว่านี่คือ ISA ของคุณ” ชัดเจนมากและ ประณีตในเชิงสัญศาสตร์

  • อยากรู้ว่าถ้าเทียบกับ ไลบรารี reals แล้วจะต่างกันอย่างไร

    • ในแง่ประสิทธิภาพ CasNum ดูจะ ไม่น่าเร็วขนาดนั้น
  • เป็นไอเดียที่เจ๋งมากจริง ๆ
    สงสัยว่าจะสามารถวางสถานะเกมทั้งหมดและ ROM ลงบนระนาบ แล้วคำนวณสเต็ปถัดไปจากสถานะนั้นได้ไหม

    • ผมก็เคยคิดแบบนั้นเหมือนกัน
      ในทางทฤษฎีน่าจะเป็นไปได้ และอาจทำออกมาในรูปแบบที่ขยายไปไกลกว่า การจำลอง ALU ได้ด้วย
      แต่ถ้าทำแบบนั้นก็ดูเหมือนจะลดความบริสุทธิ์ของแนวคิดลงไปนิดหน่อย
      อีกไอเดียหนึ่งคือการลอง วาดกราฟิกเกมโดยตรงด้วยวงเวียนและไม้บรรทัด
  • เป็นโปรเจกต์ที่น่ารักมากจริง ๆ

    • ขอบคุณ!