CasNum - Pergel ve Cetvelle İsteğe Bağlı Hassasiyetli Aritmetik Kütüphanesi
(github.com/0x0mer)- Pergel ve cetvel konstrüksiyonlarını temel alarak isteğe bağlı hassasiyetli aritmetiği gerçekleştiren bir Python kütüphanesi; tüm işlemler geometrik yapılarla yürütülüyor
- Her sayı düzlem üzerindeki bir nokta olarak ifade ediliyor ve toplama, çarpma ve mantıksal işlemler tamamen konstrüksiyon kurallarıyla uygulanıyor
- Game Boy emülatörü (PyBoy) içindeki ALU, CasNum ile değiştirilerek oyunların yalnızca geometrik işlemlerle çalıştırılması sağlanabiliyor
- RSA örneği ve Game Boy entegrasyon örneği içeriyor; ayrıca görselleştirme görüntüleyicisi (viewer) üzerinden konstrüksiyon süreci gerçek zamanlı izlenebiliyor
- MIT lisansı ile yayımlanıyor; PyBoy (LGPL v3) ve 2048.gb'yi (zlib lisansı) değiştirilmiş hâlleriyle içeriyor
CasNum'a Genel Bakış
-
CasNum, pergel ve cetvel konstrüksiyonlarını (compass and straightedge) kullanarak isteğe bağlı hassasiyetli aritmetik yapan bir Python kütüphanesi
- Her
xsayısı düzlem üzerindeki(x, 0)noktası olarak gösteriliyor - Toplama, iki noktanın orta noktasını bulup bunu iki katına genişletme yöntemiyle gerçekleştiriliyor
- Çarpma ve bölme, üçgen benzerliği ilkesi kullanılarak kuruluyor
- Mantıksal işlemler (AND, OR, XOR) de geometrik olarak uygulanmış durumda
- Her
-
Temel konstrüksiyon motoru
cas/dizininde yer alıyor ve şu beş temel konstrüksiyonu destekliyor- İki noktadan geçen doğru
- Merkezi bir nokta olan ve başka bir noktadan geçen çember
- İki doğrunun kesişim noktası
- Doğru ile çemberin kesişim noktası
- İki çemberin kesişim noktası
-
Bu konstrüksiyon işlemleri temel alınarak CasNum sınıfı tanımlanıyor ve aritmetik ile mantıksal işlemlerin tamamı geometrik olarak yürütülüyor
Başlıca Özellikler ve Optimizasyonlar
- Çarpma, bölme ve mod alma işlemleri gibi işlemler, üçgen benzerliği ve geometrik ilişkiler kullanılarak uygulanıyor
- Belirli işlemler (ör. 2 ile çarpma) genel algoritmalara göre daha verimli gerçekleştirilebiliyor
- Python'un
lru_cacheözelliği kullanılarak işlem sonuçları önbelleğe alınıyor; tekrar kullanımda hız artışı sağlanıyor - Önbellek nedeniyle bellek kullanımı ciddi ölçüde artabilir, dikkat edilmesi gerekiyor
Kullanım Örnekleri
-
RSA şifreleme programı gerçekleştirme
-
Game Boy emülatörü (PyBoy) ALU'suna entegre edilerek tüm işlemlerin CasNum ile değiştirilmesi
- Yalnızca
opcodes_gen.pydosyasında asgari düzeyde değişiklik gerekiyor - Pokémon Red gibi ROM'lar çalıştırılabiliyor (ancak açılış yaklaşık 15 dakika sürüyor)
- İkinci çalıştırmadan itibaren önbellek sayesinde yaklaşık 0.5~1 FPS hızında çalışıyor
- Yalnızca
-
examples/dizininde RSA ve Game Boy örnekleri bulunuyor -
Görselleştirme görüntüleyicisi (
casnum/cas/viewer.py) ile konstrüksiyon süreci gerçek zamanlı olarak incelenebiliyor
Felsefe ve Performans
- Basit bir
a + bişlemi yerine, doğru ve çember kesişimleriyle orta nokta bulma sürecini doğrudan gerçekleştiren geliştirici ruhunu öne çıkarıyor - “Dördüncü dereceden bir denklemi çözmeden döngü sayacını artıramıyorsan, bu gerçek bir artırma değildir” şeklinde felsefi bir mizah içeriyor
- Zaman karmaşıklığı: Evet / alan karmaşıklığı: O da evet ifadesiyle, hesaplama maliyetinin çok yüksek olduğunu hicivli biçimde anlatıyor
Bağımlılıklar ve Lisans
- Zorunlu bağımlılık:
sympy - İsteğe bağlı bağımlılıklar:
pyglet(görselleştirme için),pytest-lazy-fixtures(test için),pycryptodome(RSA örneği için) - MIT lisansı ile dağıtılıyor
- Dahil edilen üçüncü taraf bileşenler
- PyBoy (değiştirilmiş sürüm): LGPL v3.0
- 2048.gb ROM: zlib lisansı
- PyBoy, CasNum kullanacak şekilde değiştirilmiş; özgün sürümüne Baekalfen/PyBoy üzerinden ulaşılabiliyor
SSS
- “Doom çalıştırabilir mi?” → “Bir sayı olmadığı için çalıştıramaz”
- “Hızlı mı?” → “Öklid'in bir nüshasını elle kopyalamaktan çok daha hızlı”
- “Neden yapıldı?” → “İsteğe bağlı hassasiyetli aritmetik istiyordum ama aynı zamanda bir şeyler hissetmek de istiyordum”
1 yorum
Hacker News yorumları
SSS biçimindeki şaka fazlasıyla relatable
Özellikle “keyfi hassasiyetli aritmetik istedim ama aynı zamanda bir şeyler de hissetmek istedim” kısmı çok etkileyiciydi
Gerçekten harika bir mizahi yazım ve projeydi
“Yazdığım şeyi çalıştırmadan önce mutlaka kaydedin” cümlesi beni çok güldürdü
Sadece biraz daha övgü eklemek istedim ve umarım 0x0mer bu tepkiden sıcak bir içsel ışık hissetmiştir
Kısa süre önce Ben Syversen kanalındaki ‘küpü iki katına çıkarma’ videosunu izledim ve pergel ve cetvelle hesap yapmayı ilk kez orada öğrendim
Bu projeyi paylaştığın için teşekkürler
Bunu nasıl keşfettiğini merak ediyorum
“%100 daha fazla Öklid” ifadesi müthiş
Uygulamayı yalnızca pergelle daha da sadeleştirmek mümkün olabilir
Bunun için Mohr–Mascheroni teoremi'ne bakılabilir
Mascheroni kitabını ona adamış ve Laplace'ın “ondan her şeyi bekliyordum ama geometri dersi vermesini değil” dediğine dair bir anekdot var
İlgili yazı
Yalnızca
BigInt'e dayanmadan büyük sayılarla çalışmak için ilginç bir yaklaşım10^9 tabanı kullanarak normal JavaScript sayılarıyla verimli işlemler yapılabiliyor ve bellek kullanımı da azaltılabiliyor
Tarayıcı motorları ve Node sürümlerine göre
BigIntile benchmark karşılaştırmasının nasıl çıktığını merak ediyorum“Bunu kendi ISA'nız gibi düşünün” ifadesi çok net ve göstergebilim açısından incelikli
reals kütüphanesi ile karşılaştırıldığında nasıl farklar çıkacağını merak ediyorum
Gerçekten çok hoş bir fikir
Tüm oyun durumunu ve ROM'u düzlem üzerine yerleştirip, bir sonraki adımı o durumdan hesaplatmak mümkün olur mu diye merak ediyorum
Teorik olarak mümkün gibi duruyor ve ALU simülasyonundan daha da genişletilmiş bir biçimde uygulanabilir
Ama bunu yapınca saflığın biraz azalacakmış gibi geliyor
Bir başka fikir de pergel ve cetvelle oyun grafiklerini doğrudan çizmeyi denemek
Gerçekten çok sevimli bir proje