SORU
29 Temmuz 2015, ÇARŞAMBA


Neden l-matematik optimal yapanlarla formüller olmadan büyük modüler exponentiations hesaplamak için edebiliyoruz?

Kilise sayılar fonksiyonlar olarak doğal sayılardan oluşan bir kodlama.

(\ f x → (f x))             -- church number 1
(\ f x → (f (f (f x))))     -- church number 3
(\ f x → (f (f (f (f x))))) -- church number 4

Düzgünce, sadece bunları uygulayarak 2 kilise numaraları exponentiate. Eğer 4 uygularsanız, 2, kilise sayısı 16 2^4 olsun. Belli ki, bu son derece kullanışsız. Kilise numaraları bellek doğrusal bir miktar gerekir ve gerçekten, gerçekten yavaş. Hızlı GHCİ 10^10 - bilgi işlem gibi bir şey doğru cevapları - yaş almak ve bilgisayarınızda hafızasına zaten sığmıyor.

Optimum l sınıfı ile son zamanlarda deniyorum. Benim testlerde, ben yanlışlıkla benim optimal şu l-hesap makinesi yazılan:

10 ^ 10 % 13

Çarpma, üs olacaktı. Parmaklarım umutsuzluk içinde sonsuza kadar çalışan programı durdurmak için hareket etmeden önce, benim ricam, cevap verdi:

3
{ iterations: 11523, applications: 5748, used_memory: 27729 }

real    0m0.104s
user    0m0.086s
sys     0m0.019s

Benim "hata uyarısı", Google'a girdim ve yanıp sönen, 10^10 == 3 gerçekten de doğrulandı.Ama l-hesap makinesi sonucu, zar zor 10^10 saklayabilirsiniz bulmak gerekiyordu.Bunu vurgulayarak, bilim başladım. Anında beni, *, *1720^20 == 350^50 == 4cevap. external tools kullanmak için bu sonuçları doğrulamak için, beri vardıHaskell hesaplamak mümkün (tamsayı taşması nedeniyle) kendisi değildi(eğer Tamsayı kullanıyorsanız değer vermez, tabii ki değil!). Kendi sınırlarını zorlama, bu 200^2001 cevap oldu:

5
{ iterations: 10351327, applications: 5175644, used_memory: 23754870 }

real    0m4.025s
user    0m3.686s
sys 0m0.341s

Evrendeki her atomun, evrenin bir kopyası vardı ve toplam kaldık her atom için bir bilgisayar olsaydı, kilise sayıda mağaza edemedik 200^200. Bu bana eğer benim mac gerçekten güçlü olsaydı soru istenir. Belki de en iyi değerlendiricisi Haskell tembel değerlendirme ile, aynı şekilde gereksiz dalları atlamak ve cevabı hemen ulaşmak mümkün oldu. Bu test için, l program Haskell için derledim:

data Term = F !(Term -> Term) | N !Double
instance Show Term where {
    show (N x) = "(N "  (if fromIntegral (floor x) == x then show (floor x) else show x)  ")";
    show (F _) = "(λ...)"}
infixl 0 #
(F f) # x = f x
churchNum = F(\(N n)->F(\f->F(\x->if n<=0 then x else (f#(churchNum#(N(n-1))#f#x)))))
expMod    = (F(\v0->(F(\v1->(F(\v2->((((((churchNum # v2) # (F(\v3->(F(\v4->(v3 # (F(\v5->((v4 # (F(\v6->(F(\v7->(v6 # ((v5 # v6) # v7))))))) # v5))))))))) # (F(\v3->(v3 # (F(\v4->(F(\v5->v5)))))))) # (F(\v3->((((churchNum # v1) # (churchNum # v0)) # ((((churchNum # v2) # (F(\v4->(F(\v5->(F(\v6->(v4 # (F(\v7->((v5 # v7) # v6))))))))))) # (F(\v4->v4))) # (F(\v4->(F(\v5->(v5 # v4))))))) # ((((churchNum # v2) # (F(\v4->(F(\v5->v4))))) # (F(\v4->v4))) # (F(\v4->v4))))))) # (F(\v3->(((F(\(N x)->F(\(N y)->N(x y)))) # v3) # (N 1))))) # (N 0))))))))
main = print $ (expMod # N 5 # N 5 # N 4)

Bu doğru 1 (5 ^ 5 % 4) - ama 10^10 yukarıda bir şey atıp, hipotezini ortadan kalmış olacak çıkışlar.

optimal evaluator I used üstel modül matematik herhangi bir tür dahil olmadığını 160 hatları uzun, unoptimized bir JavaScript programı ve kullandım lambda-hesap modülü işlevi de aynı derecede basitti

(λab.(b(λcd.(c(λe.(d(λfg.(f(efg)))e))))(λc.(c(λde.e)))(λc.(a(b(λdef.(d(λg.(egf))))(λd.d)(λde.(ed)))(b(λde.d)(λd.d)(λd.d))))))

Özel modüler aritmetik algoritma veya formül kullandım.Nasıl en iyi değerlendiricisi doğru cevaplara ulaşmak mümkün olur?

CEVAP
30 Temmuz 2015, PERŞEMBE


Fenomen gelir tutarı paylaşılan beta-azaltma adımları, önemli ölçüde farklı Haskell tarzı tembel değerlendirme (ya da her zamanki call-by-value, hangi değil o kadar bu konuda) ve Vuillemin-Lévy-Lamping-Kathail-Asperti-Guerrini-(et al.) "en uygun" değerlendirme. Bu örnekte kullanabilirsiniz aritmetik formülleri tamamen bağımsız olan genel bir özelliktir.

Paylaşım hangi bir "gerçek lambda vadeli temsil ediyorsunuz. birkaç benzer parça anlatabilir düğüm lambda süreli bir temsile sahip olmak demektir Örneğin, terim gösterebilir

\x. x ((\y.y)a) ((\y.y)a)

hangi alt çizgeler (\y.y)a, temsil eden tek bir örneği var (yönetmen döngüsel) bir grafik kullanarak ve iki kenarları olan alt çizgeler hedefleme. Haskell açısından, sadece bir kez değerlendirmek bir thunk var, ve bu thunk iki işaretçiler.

Haskell tarzı memoization tam subterms paylaşımı uygular. Paylaşım bu düzeyde yönlendirilmiş döngüsel grafik tarafından temsil edilebilir. Optimal paylaşımı bu kısıtlama yok: bunu da paylaşın "" grafik gösterimi. devir anlamına gelebilir subterms, kısmi olabilir

Paylaşım bu iki düzeyi arasındaki farkı görmek için, vadeli düşünün

\x. (\z.z) ((\z.z) x)

Eğer paylaşımı yasak olduğu için tam olarak subterms bu durumda Haskell, sadece bir oluşumu \z.z ama iki beta-redexes burada olacak farklı: biri (\z.z) x diğerinin (\z.z) ((\z.z) x), ve o zamandan beri onlar değil eşit şartlarda onlar olamaz paylaştı. Eğer paylaşım kısmi subterms izin verilir, o zaman mümkün hale paylaşmak kısmi süreli (\z.z) [] (sadece fonksiyonu \z.z ama "işlevi \z.z uygulamalıbir şeysadece bir adım olarak değerlendirir.), ^em>bir şeybu argüman ne olursa olsun., Belli olan tek bir düğüm iki farklı bağımsız değişkenleri için \z.z iki uygulama temsil eder, ve bu iki uygulama tek bir adımda azaltılabilir bir grafik var. Bu argümanı beri bu düğümde bir döngüsü var, bu sözler, "ilk oluşum" tam olarak "ikinci olay". Son olarak, optimal paylaşımı gidebilirsin (grafik temsil eden) \x. (\z.z) ((\z.z) x)) (bir grafik gösteren) sonuç \x.x sadece bir adım beta-azaltma (artı Muhasebecilik). Bu en iyi değerlendiricisi (ve grafik gösterimi uzay patlama engeller de var) olur temelde.

Biraz genişletilmiş açıklamalar, kağıt Weak Optimality, and the Meaning of Sharing (ilgilenen ne tanıtımı ve bölüm 4.1, ve belki de sonunda bibliyografik bazı işaretçiler) bakabilirsiniz.

Geri geliyor örnek, kodlama aritmetik fonksiyonlar çalışıyor Kilisesi tamsayılar biridir "bilinen" maden örnekleri optimum değerlendirme yapmak olabilir, daha yaygın diller (bu cümle, iyi bilinen aslında anlamına gelen bir avuç uzmanları farkında bu örnekler). Daha böyle örnekler, bakmak kağıdı Safe Operators: Brackets Closed Forever Asperti ve Chroboczek (ve bu arada, sen-ecek bulmak burada ilginç lambda-şartlar değil GERÇEK typeable; yani ben teşvik size bakmak kahinler ile başlayan bu Asperti/Chroboczek kağıt).

Kendin söyledin, kodlama bu tür tamamen kullanışsız, ama hala neler olduğunu anlamanın güzel bir yolu temsil eder. Ve şunu da akdi bir meydan okuma için daha fazla araştırma: o da sizin için bir örnek üzerinde olan optimal değerlendirilmesi, bu sözde kötü kodlamalar aslında par ile geleneksel değerlendirme konusunda makul bir veri sunumu? (bu gerçek bir sorudur bildiğim kadarıyla).

Saygılarımızla, ve ben bir sonraki ne olacağını bildirin.

Thibaut Balabonski.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MandMEvangelists

    MandMEvangel

    28 Ocak 2008
  • OnlyFunClips

    OnlyFunClips

    16 ŞUBAT 2012
  • Thom Hall

    Thom Hall

    24 Kasım 2006