2 điểm bởi GN⁺ 2026-03-09 | 1 bình luận | Chia sẻ qua WhatsApp
  • Là một thư viện Python hiện thực số học độ chính xác tùy ý dựa trên phép dựng hình bằng compa và thước thẳng, thực hiện mọi phép toán bằng các cấu trúc hình học
  • Biểu diễn mỗi số dưới dạng một điểm trên mặt phẳng, và hiện thực toàn bộ phép cộng, phép nhân và phép toán logic bằng các quy tắc dựng hình
  • Có thể thay thế ALU bên trong trình giả lập Game Boy (PyBoy) bằng CasNum để chạy game chỉ bằng các phép toán hình học
  • Bao gồm ví dụ RSA và ví dụ tích hợp Game Boy, đồng thời có thể xem quá trình dựng hình theo thời gian thực qua trình xem trực quan (viewer)
  • Được phát hành theo giấy phép MIT, đồng thời sửa đổi và đi kèm PyBoy (LGPL v3) và 2048.gb (giấy phép zlib)

Tổng quan về CasNum

  • CasNum là một thư viện Python thực hiện số học độ chính xác tùy ý bằng phép dựng compa và thước thẳng (compass and straightedge)

    • Mỗi số x được biểu diễn thành điểm (x, 0) trên mặt phẳng
    • Phép cộng được hiện thực bằng cách tìm trung điểm của hai điểm rồi mở rộng nó lên gấp đôi
    • Phép nhân và phép chia được dựng dựa trên nguyên lý tam giác đồng dạng
    • Các phép toán logic (AND, OR, XOR) cũng được hiện thực theo hình học
  • Bộ máy dựng hình cơ bản nằm trong thư mục cas/, hỗ trợ năm phép dựng cơ bản sau

    • Đường thẳng đi qua hai điểm
    • Đường tròn có tâm tại một điểm và đi qua một điểm khác
    • Giao điểm của hai đường thẳng
    • Giao điểm của đường thẳng và đường tròn
    • Giao điểm của hai đường tròn
  • Dựa trên các phép dựng này, lớp CasNum được định nghĩa và thực hiện toàn bộ phép toán số học lẫn logic theo hình học

Tính năng chính và tối ưu hóa

  • Phép nhân, phép chia, phép modulo v.v. được hiện thực bằng tam giác đồng dạng và các quan hệ hình học
  • Một số phép toán nhất định (ví dụ: nhân đôi) có thể được thực hiện hiệu quả hơn thuật toán tổng quát
  • Dùng lru_cache của Python để lưu cache kết quả phép toán, giúp tăng tốc khi tái sử dụng
  • Cần lưu ý rằng cache có thể làm mức sử dụng bộ nhớ tăng mạnh

Ví dụ sử dụng

  • Hiện thực chương trình mã hóa RSA

  • Tích hợp vào ALU của trình giả lập Game Boy (PyBoy) để thay thế mọi phép toán bằng CasNum

    • Chỉ sửa tối thiểu tệp opcodes_gen.py
    • Có thể chạy các ROM như Pokémon Red (nhưng mất khoảng 15 phút để khởi động)
    • Từ lần chạy thứ hai trở đi, nhờ cache mà có thể hoạt động ở khoảng 0.5~1 FPS
  • Thư mục examples/ có kèm ví dụ RSA và Game Boy

  • Có thể theo dõi quá trình dựng hình theo thời gian thực qua trình xem trực quan (casnum/cas/viewer.py)

Triết lý và hiệu năng

  • Nhấn mạnh tinh thần lập trình kiểu “tự tay làm lấy”, tức là thay vì phép toán đơn giản a + b, sẽ trực tiếp hiện thực quá trình tìm trung điểm bằng giao cắt giữa đường thẳng và đường tròn
  • Có kèm câu đùa mang tính triết lý: “Nếu không thể tăng bộ đếm vòng lặp mà không giải phương trình bậc bốn, thì đó không phải là phép tăng đích thực”
  • Diễn đạt Độ phức tạp thời gian: Yes / Độ phức tạp không gian: Also yes như một cách châm biếm việc chi phí tính toán là cực kỳ lớn

Phụ thuộc và giấy phép

  • Phụ thuộc bắt buộc: sympy
  • Phụ thuộc tùy chọn: pyglet (để trực quan hóa), pytest-lazy-fixtures (để test), pycryptodome (cho ví dụ RSA)
  • Phát hành theo giấy phép MIT
  • Các thành phần bên thứ ba đi kèm
    • PyBoy (bản đã chỉnh sửa): LGPL v3.0
    • ROM 2048.gb: giấy phép zlib
  • PyBoy đã được chỉnh sửa để dùng CasNum, và có thể xem bản gốc tại Baekalfen/PyBoy

FAQ

  • “Có chạy được Doom không?” → “Không, vì nó là số”
  • “Có nhanh không?” → “Nhanh hơn rất nhiều so với việc chép lại Euclid bằng tay”
  • “Tại sao lại làm ra nó?” → “Vì muốn có số học độ chính xác tùy ý, nhưng đồng thời cũng muốn cảm nhận điều gì đó

1 bình luận

 
GN⁺ 2026-03-09
Ý kiến trên Hacker News
  • Trò đùa theo kiểu FAQ quá sức đồng cảm
    Đặc biệt ấn tượng với đoạn “muốn số học độ chính xác tùy ý, nhưng cũng muốn cảm nhận được cảm xúc”

    • Cảm ơn! Mình thật sự rất vui vì bạn cảm thấy như vậy
  • Đây thật sự là một dự án và một bài viết hài hước tuyệt vời
    Câu “hãy nhớ lưu những gì tôi viết trước khi chạy nó” buồn cười quá
    Mình chỉ muốn góp thêm lời khen, và hy vọng 0x0mer cảm nhận được ánh sáng nội tâm ấm áp từ phản hồi này

    • Cảm ơn! Mình cũng đang cảm nhận rất rõ nguồn năng lượng ấm áp đó
  • Gần đây mình xem video ‘gấp đôi khối lập phương’ trên kênh của Ben Syversen, và đó là lần đầu mình biết đến cách tính toán bằng compa và thước thẳng

  • Cảm ơn vì đã đăng dự án này
    Mình tò mò không biết bạn đã phát hiện ra nó như thế nào

    • CasNum là một thư viện số học độ chính xác tùy ý được hiện thực bằng compa và thước thẳng
      Cụm “nhiều Euclid hơn 100%” thật sự quá đỉnh
  • Có vẻ phần hiện thực này cũng có thể được đơn giản hóa chỉ bằng compa
    Có thể tham khảo định lý Mohr–Mascheroni

    • Nghe nói Napoleon cũng rất quan tâm đến chủ đề này
      Mascheroni đã đề tặng cho ông một cuốn sách, và có giai thoại rằng Laplace nói: “Tôi mong đợi ở ông ấy mọi thứ, trừ các bài học hình học”
      Bài viết liên quan
  • Đây là một cách tiếp cận thú vị để xử lý số lớn mà không chỉ phụ thuộc vào BigInt
    Nó dùng cơ số 10^9 để thực hiện phép toán hiệu quả bằng các số JavaScript thông thường, đồng thời giảm mức sử dụng bộ nhớ
    Mình tò mò muốn thấy so sánh benchmark với BigInt theo từng engine trình duyệt và phiên bản Node

  • Cách diễn đạt “hãy xem đây là ISA của bạn” quá rõ ràng và tinh tế về mặt ký hiệu học

  • Mình tò mò không biết nó khác gì so với thư viện reals

    • CasNum có lẽ sẽ không nhanh đến vậy về mặt hiệu năng
  • Ý tưởng thật sự rất ngầu
    Mình tự hỏi liệu có thể đặt toàn bộ trạng thái game và ROM lên mặt phẳng, rồi từ trạng thái đó tính ra bước tiếp theo không

    • Mình cũng đã nghĩ đến điều đó
      Về mặt lý thuyết thì có vẻ khả thi, và thậm chí có thể hiện thực ở quy mô lớn hơn mô phỏng ALU
      Nhưng nếu làm vậy thì có lẽ sẽ bớt đi một chút tính thuần túy
      Một ý tưởng khác là thử vẽ trực tiếp đồ họa game bằng compa và thước thẳng
  • Đúng là một dự án đáng yêu

    • Cảm ơn!