इस चुनौती का उद्देश्य आपके चयन के नुकसान में, निम्नलिखित फ़ंक्शन का एक असंभव छोटा कार्यान्वयन खोजना है p
। यहां C कोड इसे लागू कर रहा है ( यह TIO लिंक देखें
जो इसके आउटपुट को प्रिंट भी करता है) और एक विकिपीडिया पृष्ठ जिसमें यह है।
unsigned char pi[] = {
252,238,221,17,207,110,49,22,251,196,250,218,35,197,4,77,
233,119,240,219,147,46,153,186,23,54,241,187,20,205,95,193,
249,24,101,90,226,92,239,33,129,28,60,66,139,1,142,79,
5,132,2,174,227,106,143,160,6,11,237,152,127,212,211,31,
235,52,44,81,234,200,72,171,242,42,104,162,253,58,206,204,
181,112,14,86,8,12,118,18,191,114,19,71,156,183,93,135,
21,161,150,41,16,123,154,199,243,145,120,111,157,158,178,177,
50,117,25,61,255,53,138,126,109,84,198,128,195,189,13,87,
223,245,36,169,62,168,67,201,215,121,214,246,124,34,185,3,
224,15,236,222,122,148,176,188,220,232,40,80,78,51,10,74,
167,151,96,115,30,0,98,68,26,184,56,130,100,159,38,65,
173,69,70,146,39,94,85,47,140,163,165,125,105,213,149,59,
7,88,179,64,134,172,29,247,48,55,107,228,136,217,231,137,
225,27,131,73,76,63,248,254,141,83,170,144,202,216,133,97,
32,113,103,164,45,43,9,91,203,155,37,208,190,229,108,82,
89,166,116,210,230,244,180,192,209,102,175,194,57,75,99,182,
};
unsigned char p(unsigned char x) {
return pi[x];
}
क्या है p
p
दो रूसी क्रिप्टोग्राफिक मानकों का एक घटक है, जिसका नाम हैश फ़ंक्शन स्ट्रीबॉग और ब्लॉक सिफर कुज़्नचिक है । में इस लेख (और आईएसओ बैठकों के दौरान), इन एल्गोरिदम के डिजाइनरों ने दावा किया कि वे सरणी उत्पन्न pi
यादृच्छिक 8 बिट क्रमपरिवर्तन उठा द्वारा।
"असंभव" कार्यान्वयन
कर रहे हैं 8 बिट्स पर क्रमपरिवर्तन। इसलिए, किसी दिए गए यादृच्छिक क्रमपरिवर्तन के लिए, एक कार्यक्रम जो इसे लागू करता है, उसे 1683 बिट्स से कम की आवश्यकता नहीं होगी।
हालाँकि, हमने कई असामान्य रूप से छोटे कार्यान्वयन पाए हैं (जो हम यहां सूचीबद्ध करते हैं ), उदाहरण के लिए निम्नलिखित सी कार्यक्रम:
p(x){unsigned char*k="@`rFTDVbpPBvdtfR@\xacp?\xe2>4\xa6\xe9{z\xe3q5\xa7\xe8",l=0,b=17;while(--l&&x^1)x=2*x^x/128*285;return l%b?k[l%b]^k[b+l/b]^b:k[l/b]^188;}
जिसमें केवल 158 अक्षर हैं और इस तरह 1264 बिट्स में फिट बैठता है। यह देखने के लिए यहां क्लिक करें कि यह काम करता है।
हम एक "असंभव" लघु कार्यान्वयन के बारे में बात करते हैं, क्योंकि यदि क्रमपरिवर्तन एक यादृच्छिक प्रक्रिया का उत्पादन था (जैसा कि इसके डिजाइनरों द्वारा दावा किया गया है), तो यह छोटा नहीं होगा एक कार्यक्रम ( अधिक विवरण के लिए इस पृष्ठ को देखें)।
संदर्भ कार्यान्वयन
पिछले C कोड का अधिक पठनीय संस्करण है:
unsigned char p(unsigned char x){
unsigned char
s[]={1,221,146,79,147,153,11,68,214,215,78,220,152,10,69},
k[]={0,32,50,6,20,4,22,34,48,16,2,54,36,52,38,18,0};
if(x != 0) {
unsigned char l=1, a=2;
while(a!=x) {
a=(a<<1)^(a>>7)*29;
l++;
}
unsigned char i = l % 17, j = l / 17;
if (i != 0) return 252^k[i]^s[j];
else return 252^k[j];
}
else return 252;
}
तालिका k
ऐसी है k[x] = L(16-x)
, जहां L
अर्थ में रैखिक है L(x^y)==L(x)^L(y)
, और जहां, सी की तरह, ^
XOR को दर्शाता है। हालाँकि, हमने अपने कार्यान्वयन को छोटा करने के लिए इस संपत्ति का लाभ उठाने का प्रबंधन नहीं किया। हम किसी भी संरचना के बारे में नहीं जानते हैं s
जो एक सरल कार्यान्वयन की अनुमति दे सकती है --- इसका उत्पादन हमेशा सबफील्ड में होता है, हालांकि, जहां परिमित क्षेत्र में किया जाता है। बेशक, आप एक को खोजने के लिए एक सरल अभिव्यक्ति का उपयोग करने के लिए बिल्कुल स्वतंत्र हैं !s
जबकि लूप 256 तत्वों के साथ परिमित क्षेत्र में एक असतत लघुगणक के मूल्यांकन से मेल खाता है। यह एक सरल जानवर-बल खोज के माध्यम से काम करता है: डमी चर a
परिमित क्षेत्र का एक जनरेटर होने के लिए सेट किया गया है, और जब तक परिणाम नहीं के बराबर होता है, तब तक इसे इस जनरेटर द्वारा गुणा किया जाता है x
। जब यह मामला है, हमारे पास l
असतत लॉग है x
। यह फ़ंक्शन 0 में परिभाषित नहीं है, इसलिए if
कथन के अनुरूप विशेष मामला ।
जनरेटर द्वारा गुणा करके एक गुणा के रूप में देखा जा सकता है में सापेक्ष बहुपद जो तब कम हो जाता है । यह सुनिश्चित करने के लिए कि चर 8 बिट पर रहता है की भूमिका है । वैकल्पिक रूप से, हम इस्तेमाल कर सकते हैं , जिसमें मामले एक हो सकता है (या किसी अन्य पूर्णांक प्रकार)। दूसरी तरफ, 1 के बराबर होने पर हमें शुरू करना आवश्यक है ।unsigned char
a
a=(a<<1)^(a>>7)*(256^29)
a
int
l=1,a=2
l=255
x
पिछले शार्ट इम्प्लीमेंटेशन प्राप्त करने के लिए हमारे अधिकांश अनुकूलन के राइटअप के साथ, हमारे पेपरp
में प्रस्तुत किए गए गुणों के बारे में अधिक जानकारी दी गई है ।
नियम
p
1683 बिट्स से कम में फ़ंक्शन को लागू करने वाले प्रोग्राम का प्रस्ताव करें । कार्यक्रम जितना छोटा होता है, दी गई भाषा के लिए यह उतना ही अधिक असामान्य होता है, लेकिन यह बेहतर होता है। यदि आपकी भाषा में कुज़नेचिक, स्ट्रीबोग या p
एक बिलिन के रूप में होता है , तो आप उनका उपयोग नहीं कर सकते।
सबसे अच्छा कार्यान्वयन निर्धारित करने के लिए हम जिस मीट्रिक का उपयोग करते हैं, वह बाइट्स में प्रोग्राम की लंबाई है। हम अपने अकादमिक पेपर में बिट-लेंथ का उपयोग करते हैं लेकिन हम सादगी के लिए यहां बाइट्स करते हैं।
यदि आपकी भाषा में फ़ंक्शन, तर्क या आउटपुट की स्पष्ट धारणा नहीं है, तो एन्कोडिंग आपको परिभाषित करने के लिए है, लेकिन मूल्य एन्कोडिंग जैसी चालें स्पष्ट pi[x]
रूप x
से निषिद्ध हैं।
हमने पहले ही इस विषय पर अपने निष्कर्षों के साथ एक शोध पत्र प्रस्तुत किया है। यह यहां उपलब्ध है । हालांकि, इसे एक वैज्ञानिक स्थल में प्रकाशित किया जाना चाहिए, हम सबसे अच्छे कार्यान्वयन के लेखकों को खुशी से स्वीकार करेंगे।
वैसे, इस सवाल का मसौदा तैयार करते समय उनकी मदद के लिए xnor को धन्यवाद!
1683 bits at most
एक सख्त प्रतिबंध है [sic?] या लक्ष्य?