গল্ফস্ক্রিপ্ট, 60 টি অক্ষর
{[[0 1{.283{1$2*.255>@*^}:r~^}255*].@?~)={257r}4*99]{^}*}:S;
এই কোডটি একটি ফাংশনটিকে সংজ্ঞায়িত করে S
যা একটি বাইট নেয় এবং এতে রিজান্ডেল এস-বাক্স প্রয়োগ করে। (এটি r
কয়েকটি অক্ষর সংরক্ষণের জন্য নামের একটি অভ্যন্তরীণ সহায়তা ফাংশনও ব্যবহার করে ))
টমাস পর্নিনের পরামর্শ অনুসারে এই প্রয়োগটি জিএফ (2 8 ) বিপরীত গণনা করতে লোগারিথম টেবিল ব্যবহার করে । কয়েকটি অক্ষর সংরক্ষণ করতে, প্রতিটি লগ ইনকাম বাইটের জন্য পুরো লোগারিদম টেবিলটি পুনরায় গণনা করা হয়; তবুও, এবং গল্ফস্ক্রিপ্ট সাধারণভাবে খুব ধীর ভাষা হওয়া সত্ত্বেও, এই কোডটি আমার পুরানো ল্যাপটপটিতে একটি বাইট প্রসেস করতে প্রায় 10 এমএস লাগে। লোগারিদম টেবিলকে প্রাক্কলিতকরণ (যেমন L
) আরও তিনটি অক্ষরের ব্যয়বহুল ব্যয়ে এটি প্রতি বাইট প্রতি 0.5 মাইল গতিবেগ করে:
[0 1{.283{1$2*.255>@*^}:r~^}255*]:L;{[L?~)L={257r}4*99]{^}*}:S;
সুবিধার্থে, এখানে একটি সাধারণ পরীক্ষার জোতা যা S
উপরের সংজ্ঞায়িত হিসাবে ফাংশনটিকে কল করে , উইকিপিডিয়ায় পছন্দ করে পুরো এস-বাক্সটি হেক্সে প্রিন্ট করতে :
"0123456789abcdef"1/:h; 256, {S .16/h= \16%h= " "++ }% 16/ n*
এই কোডটি অনলাইনে চেষ্টা করে দেখুন।
(খুব বেশি সময় না নিরূপণে অনলাইন ডেমো লোগারিথম টেবিলকে প্রাক্কলিত করে Even তবুও, অনলাইন গল্ফস্ক্রিপ্ট সাইটটি মাঝে মাঝে এলোমেলোভাবে সময় শেষ করতে পারে; এটি সাইটের সাথে একটি পরিচিত সমস্যা এবং একটি পুনরায় লোড সাধারণত এটি ঠিক করে দেয়))
ব্যাখ্যা:
আসুন লগারিদম টেবিল গণনা এবং বিশেষত সহায়ক ফাংশন দিয়ে শুরু করুন r
:
{1$2*.255>@*^}:r
এই ফাংশনটি স্ট্যাকের দুটি ইনপুট নেয়: একটি বাইট এবং হ্রাস বিটমাস্ক (256 এবং 511 এর মধ্যে একটি ধ্রুবক)। এটি ইনপুট বাইটটিকে সদৃশ করে, অনুলিপিটিকে 2 দ্বারা গুণিত করে এবং ফলাফলটি 255 ছাড়িয়ে যায়, বিটমাস্কের সাহায্যে এটি এক্সওর করে এটি 256 এর নীচে ফিরিয়ে আনতে।
লগ-টেবিল উত্পন্ন কোডের মধ্যে, ফাংশনটি r
হ্রাস বিটমাস্ক 283 = 0x11b (যা রিজান্ডেল জিএফ (2 8 ) হ্রাস বহুপদী x 8 + x 4 + x 3 + x + 1) এর সাথে ডাকা হয় এবং ফলাফলটি XORed হয় আসল বাইট সহ, কার্যকরভাবে এটিকে 3 (= x + 1, একটি বহুবর্ষ হিসাবে) রিজান্ডেল সসীম ক্ষেত্রে। এই গুণটি বাইট 1 থেকে শুরু করে 255 বার পুনরাবৃত্তি হয় এবং ফলাফলগুলি (একটি প্রাথমিক শূন্য বাইট) 257-উপাদান অ্যারেতে সংগ্রহ করা হয় L
যা দেখতে এটির (মাঝের অংশ বাদ দেওয়া):
[0 1 3 5 15 17 51 85 255 26 46 ... 180 199 82 246 1]
257 টি উপাদান রয়েছে তার কারণ হ'ল, প্রেনপেন্ড 0 এবং 1 এর সাথে দু'বার ঘটছে, আমরা প্রদত্ত যে কোনও বাইটের মডুলার ইনভার্সটি কেবলমাত্র এই অ্যারেটিতে তার (শূন্য-ভিত্তিক) সূচীটি অনুসন্ধান করে, এটিকে অবহেলা করে এবং সন্ধান করতে পারি একই অ্যারে অবহেলিত সূচীতে বাইট আপ করুন। (গল্ফস্ক্রিপ্টে, অন্যান্য অনেক প্রোগ্রামিং ভাষার মতো, নেগেটিভ অ্যারে সূচকগুলি অ্যারের প্রান্ত থেকে পিছনের দিকে গণনা করে)) প্রকৃতপক্ষে, L?~)L=
ফাংশনের শুরুতে কোডটি ঠিক এটিই S
করে।
উল্টানো ইনপুট বাইটের চার বিট-ঘোরানো অনুলিপি তৈরি করতে বাকী কোডটি r
হ্রাস বিটমাস্ক 257 = 2 8 + 1 এর সাহায্যে চারবার সহায়তা ফাংশনকে কল করে । এগুলি সমস্ত ধীরে ধীরে 99 = 0x63 এর সাথে একত্রে সংগ্রহ করা হয় এবং চূড়ান্ত আউটপুট উত্পাদনের জন্য একসাথে XORed করা হয়।