CasNum - pustaka aritmetika presisi arbitrer dengan kompas dan penggaris
(github.com/0x0mer)- Pustaka Python yang mengimplementasikan aritmetika presisi arbitrer berdasarkan konstruksi kompas dan penggaris, dengan semua operasi dilakukan melalui konstruksi geometri
- Setiap angka direpresentasikan sebagai titik pada bidang, dan penjumlahan, perkalian, serta operasi logika semuanya diimplementasikan dengan aturan konstruksi
- ALU di dalam emulator Game Boy (PyBoy) dapat diganti dengan CasNum, sehingga game bisa dijalankan hanya dengan operasi geometris
- Termasuk contoh RSA dan integrasi Game Boy, serta proses konstruksi dapat dilihat secara real time melalui viewer visualisasi
- Dirilis dengan lisensi MIT, serta memodifikasi dan menyertakan PyBoy (LGPL v3) dan 2048.gb (lisensi zlib)
Gambaran umum CasNum
-
CasNum adalah pustaka Python untuk melakukan aritmetika presisi arbitrer dengan konstruksi kompas dan penggaris (compass and straightedge)
- Setiap angka
xdirepresentasikan sebagai titik(x, 0)pada bidang - Penjumlahan diimplementasikan dengan mencari titik tengah dari dua titik lalu memperluasnya menjadi dua kali lipat
- Perkalian dan pembagian dibangun menggunakan prinsip kesebangunan segitiga
- Operasi logika (AND, OR, XOR) juga diimplementasikan secara geometris
- Setiap angka
-
Mesin konstruksi dasar berada di direktori
cas/dan mendukung lima konstruksi dasar berikut- Garis lurus yang melalui dua titik
- Lingkaran berpusat di satu titik dan melalui titik lain
- Titik potong dua garis
- Titik potong garis dan lingkaran
- Titik potong dua lingkaran
-
Berdasarkan operasi konstruksi tersebut, kelas CasNum didefinisikan untuk melakukan operasi aritmetika dan logika sepenuhnya secara geometris
Fitur utama dan optimisasi
- Perkalian, pembagian, dan operasi modulo diimplementasikan menggunakan kesebangunan segitiga dan relasi geometris
- Operasi tertentu (misalnya perkalian 2 kali) dapat dijalankan lebih efisien daripada algoritme umum
- Menggunakan
lru_cachemilik Python untuk menyimpan hasil operasi dalam cache, sehingga lebih cepat saat digunakan ulang - Karena cache, penggunaan memori dapat meningkat sangat besar, sehingga perlu diperhatikan
Contoh penggunaan
-
Implementasi program enkripsi RSA
-
Diintegrasikan ke ALU milik emulator Game Boy (PyBoy), menggantikan semua operasi dengan CasNum
- Hanya file
opcodes_gen.pyyang dimodifikasi seminimal mungkin - ROM seperti Pokémon Red dapat dijalankan (namun waktu boot sekitar 15 menit)
- Mulai eksekusi kedua dan seterusnya, berkat cache dapat berjalan di sekitar 0.5~1 FPS
- Hanya file
-
Direktori
examples/berisi contoh RSA dan Game Boy -
Proses konstruksi dapat diamati secara real time melalui viewer visualisasi (
casnum/cas/viewer.py)
Filosofi dan performa
- Menekankan semangat developer yang memilih untuk mengimplementasikan langsung proses mencari titik tengah lewat perpotongan garis dan lingkaran, alih-alih sekadar operasi
a + byang sederhana - Memuat humor filosofis: “Jika penghitung loop tidak bisa dinaikkan tanpa menyelesaikan persamaan kuartik, maka itu belum increment yang sesungguhnya”
- Menggunakan ungkapan kompleksitas waktu: Yes / kompleksitas ruang: Also yes untuk menyindir betapa besarnya biaya komputasinya
Dependensi dan lisensi
- Dependensi wajib:
sympy - Dependensi opsional:
pyglet(untuk visualisasi),pytest-lazy-fixtures(untuk pengujian),pycryptodome(untuk contoh RSA) - Didistribusikan dengan lisensi MIT
- Komponen pihak ketiga yang disertakan
- PyBoy (versi modifikasi): LGPL v3.0
- ROM 2048.gb: lisensi zlib
- PyBoy dimodifikasi agar menggunakan CasNum, dan versi aslinya dapat dilihat di Baekalfen/PyBoy
FAQ
- “Bisakah menjalankan Doom?” → “Tidak, karena itu angka”
- “Cepat tidak?” → “Jauh lebih cepat daripada menyalin salinan Euclid dengan tangan”
- “Kenapa dibuat?” → “Karena ingin aritmetika presisi arbitrer, tapi sekaligus ingin merasakan sesuatu”
1 komentar
Komentar Hacker News
Lelucon dalam format FAQ terasa sangat relate
Terutama bagian “aritmetika presisi arbitrer yang kuinginkan, tetapi aku juga ingin merasakan emosi” sangat berkesan
Ini benar-benar penulisan yang lucu sekaligus proyek yang hebat
Kalimat “apa pun yang kutulis, pastikan disimpan sebelum dijalankan” benar-benar bikin tertawa
Aku hanya ingin menambahkan pujian, dan berharap 0x0mer merasakan cahaya batin yang hangat dari respons ini
Baru-baru ini aku menonton video ‘Doubling the Cube’ dari kanal Ben Syversen, dan untuk pertama kalinya belajar cara menghitung dengan kompas dan penggaris
Terima kasih sudah membagikan proyek ini
Aku penasaran bagaimana kamu menemukannya
Ungkapan “100% lebih banyak Euclid” terdengar sangat keren
Sepertinya implementasinya juga bisa disederhanakan hanya dengan kompas
Lihat teorema Mohr–Mascheroni
Mascheroni mendedikasikan sebuah buku kepadanya, dan ada anekdot bahwa Laplace berkata, “Saya mengharapkan segalanya darinya, kecuali pelajaran geometri”
Tulisan terkait
Ini pendekatan yang menarik untuk menangani bilangan besar tanpa hanya bergantung pada
BigIntDengan basis 10^9, operasi yang efisien bisa dilakukan memakai angka JavaScript biasa, sekaligus mengurangi penggunaan memori
Aku penasaran dengan perbandingan benchmark melawan
BigIntdi berbagai browser engine dan versi NodeUngkapan “anggap ini sebagai ISA Anda” sangat jelas dan sangat rapi secara semiotik
Aku penasaran apa perbedaannya dibanding library reals
Ide yang sangat keren
Aku penasaran apakah mungkin menaruh seluruh status game dan ROM di atas bidang, lalu menghitung langkah berikutnya dari keadaan itu
Secara teoretis sepertinya mungkin, dan bahkan bisa diimplementasikan dalam bentuk yang lebih luas daripada simulasi ALU
Hanya saja, kalau begitu, kemurniannya mungkin akan sedikit berkurang
Ide lain adalah mencoba menggambar grafik game secara langsung dengan kompas dan penggaris
Proyek yang benar-benar menggemaskan