চার্চ নম্বরগুলি ফাংশন হিসাবে প্রাকৃতিক সংখ্যার একটি এনকোডিং।
(\ 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
ঝরঝরেভাবে, আপনি কেবল চার্চের সংখ্যাগুলি প্রয়োগ করে কেবল তা ঘটাতে পারেন। মানে, যদি আপনি 4 2 প্রযোজ্য হলেও, আপনি গির্জায় নম্বর পেতে 16
, বা 2^4
। স্পষ্টতই, এটি সম্পূর্ণ অপ্রচলিত। চার্চ নম্বরগুলির জন্য একটি লিনিয়ার পরিমাণ মেমরি প্রয়োজন এবং সত্যই, সত্যই ধীর। এমন কিছু 10^10
গণনা করা - যা GHCI দ্রুত সঠিকভাবে উত্তর দেয় - যুগে যুগে সময় লাগবে এবং যাইহোক আপনার কম্পিউটারে মেমরিটি ফিট করতে পারে না।
আমি ইদানীং অনুকূল λ মূল্যায়নকারীদের সাথে পরীক্ষা করছি। আমার পরীক্ষাগুলিতে, আমি ঘটনাক্রমে আমার অনুকূল λ-ক্যালকুলেটরটিতে নিম্নলিখিতটি টাইপ করেছি:
10 ^ 10 % 13
এটি বহুত্বের নয়, গুণফলের কথা ছিল। হতাশায় চিরকালীন চলমান কর্মসূচি বাতিল করতে আমি আমার আঙ্গুলগুলি সরাতে পারার আগে, এটি আমার অনুরোধটির উত্তর দিয়েছে:
3
{ iterations: 11523, applications: 5748, used_memory: 27729 }
real 0m0.104s
user 0m0.086s
sys 0m0.019s
আমার "বাগ সতর্কতা" জ্বলজ্বলে, আমি গুগলে গিয়ে 10^10%13 == 3
সত্যই যাচাই করেছি । তবে result-ক্যালকুলেটরটি ফলাফলটি আবিষ্কার করার কথা ছিল না, এটি সবেমাত্র 10 ^ 10 সঞ্চয় করতে পারে। আমি এটি চাপ দেওয়া শুরু করলাম, বিজ্ঞানের জন্য। এটা তোলে অবিলম্বে আমার ডাকে সাড়া দিলেন 20^20%13 == 3
, 50^50%13 == 4
, 60^60%3 == 0
। এই ফলাফলগুলি যাচাই করতে আমাকে বাহ্যিক সরঞ্জামগুলি ব্যবহার করতে হয়েছিল , যেহেতু হাসেল নিজেই এটি গণনা করতে সক্ষম ছিল না (পূর্ণসংখ্যার অতিরিক্ত প্রবাহের কারণে) (এটি যদি আপনি ইন্টিজ নয় অবশ্যই ব্যবহার করেন তবে!)! এটির সীমাতে ঠেলাতে, এই উত্তরটি ছিল 200^200%31
:
5
{ iterations: 10351327, applications: 5175644, used_memory: 23754870 }
real 0m4.025s
user 0m3.686s
sys 0m0.341s
মহাবিশ্বের প্রতিটি পরমাণুর জন্য যদি মহাবিশ্বের একটি অনুলিপি থাকত এবং আমাদের মোট প্রতিটি পরমাণুর জন্য একটি কম্পিউটার থাকত, আমরা গির্জার নম্বর সংরক্ষণ করতে পারি না 200^200
। এটি আমাকে প্রশ্ন করতে উত্সাহিত করেছিল যদি আমার ম্যাকটি সত্যই শক্তিশালী ছিল। সম্ভবত অনুকূল মূল্যায়নকারী অপ্রয়োজনীয় শাখাগুলি এড়াতে এবং অলস মূল্যায়নের সাথে হাস্কেলের মতো একই ফ্যাশনে উত্তরটি পৌঁছে দিতে সক্ষম হয়েছিল। এটি পরীক্ষা করার জন্য, আমি হাস্কেলের কাছে λ প্রোগ্রামটি সংকলন করেছি:
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)
এটি সঠিকভাবে আউটপুট দেয় 1
( 5 ^ 5 % 4
) - তবে উপরে কিছু ফেলে দিন 10^10
এবং এটি আটকে থাকবে, অনুমানটি দূর করে।
আমি যে সর্বোত্তম মূল্যায়নকারীটি ব্যবহার করেছি এটি একটি 160-লম্বা লম্বা, অব্যবহিত জাভাস্ক্রিপ্ট প্রোগ্রাম যা কোনও ধরণের ক্ষতিকারক মডুলাস গণিতকে অন্তর্ভুক্ত করে না - এবং আমি যে ল্যাম্বদা-ক্যালকুলাস মডুলাস ফাংশনটি ব্যবহার করেছি এটিও সমান সহজ:
(λ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))))))
আমি কোনও নির্দিষ্ট মডুলার গাণিতিক অ্যালগরিদম বা সূত্র ব্যবহার করিনি। সুতরাং, কীভাবে সর্বোত্তম মূল্যায়নকারী সঠিক উত্তরগুলি পৌঁছাতে সক্ষম?
node test.js
। যদি আপনার কোন প্রশ্ন থাকে তাহলে আমার জানতে দিন।