CasNum - Thư viện số học độ chính xác tùy ý bằng compa và thước thẳng
(github.com/0x0mer)- 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
- Mỗi số
-
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_cachecủ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
- Chỉ sửa tối thiểu tệp
-
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
Ý 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”
Đâ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
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
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
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
BigIntNó 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
BigInttheo từng engine trình duyệt và phiên bản NodeCá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
Ý 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
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