Bu zorluğun amacı, seçtiğiniz fonksiyonda , aşağıdaki fonksiyonun imkansız bir şekilde kısa bir uygulamasını bulmaktır p
. İşte bunu uygulayan C kodu ( çıktılarını da basan bu TIO bağlantısına bakın
) ve onu içeren bir wikipedia sayfası .
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];
}
Nedir p
p
İki şifreleme standardı olan yani hash işlevi Streebog ve blok şifreleme Kuznyechik'in bir bileşenidir . Olarak bu makalede (ISO toplantı sırasında), bu algoritmaların tasarımcıları dizi oluşturulan iddia pi
rastgele 8 bit permütasyon seçerek.
"İmkansız" uygulamalar
Orada 8 bit üzerinde permütasyon. Bu nedenle, verilen rastgele bir permütasyon için, onu uygulayan bir programın 1683 bitten daha azına ihtiyaç duyması beklenmeyecektir.
Bununla birlikte, aşağıda sıralanan C programı gibi anormal derecede çok sayıda küçük uygulama bulduk ( burada listelediğimiz ).
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;}
sadece 158 karakter içeriyor ve bu nedenle 1264 bit'e sığıyor. İşe yaradığını görmek için buraya tıklayın .
"İmkansız" bir kısa uygulamadan bahsediyoruz, çünkü eğer izin rastgele bir sürecin çıktısı olsaydı (tasarımcıları tarafından iddia edildiği gibi), o zaman bu kısa bir program olmazdı ( daha fazla bilgi için bu sayfaya bakınız).
Referans uygulaması
Önceki C kodunun daha okunabilir bir versiyonu:
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;
}
Masa k
şekildedir k[x] = L(16-x)
burada, L
anlamında doğrusal L(x^y)==L(x)^L(y)
C'de olduğu gibi, ve ^
XOR belirtmektedir. Ancak, uygulamamızı kısaltmak için bu mülkten yararlanamadık. s
Basit bir uygulamaya izin verecek herhangi bir yapının farkında değiliz - çıktısı her zaman alt alandadır, yani üssünün sonlu alanda yapıldığı s [ x ] 16 = s [ x ] . Elbette, s
bulmanız gereken daha basit bir ifadeyi kullanmakta kesinlikle özgürsünüz !
While döngüsü, sonlu alanda ayrık bir logaritmanın 256 elemanla değerlendirilmesine karşılık gelir. Basit bir kaba kuvvet arama yoluyla çalışır: kukla değişken a
sonlu alanın bir jeneratörü olarak ayarlanır ve sonuç eşit olana kadar bu jeneratör ile çarpılır x
. Durum söz konusu olduğunda, biz l
ayrık kütüğümüz var x
. Bu işlev 0 ile tanımlanmaz, dolayısıyla if
ifadeye karşılık gelen özel durum .
Jeneratör ile çarpma ile çarpılması olarak görülebilir in , sonra polinom modulo azalır . Rolüunsigned char
değişkenina
8 bit üzerinde kalmasınısağlamaktır. Alternatif olarak,a=(a<<1)^(a>>7)*(256^29)
bu durumdaa
birint
(veya başka bir tamsayı türü) olabiliriz. Öte yandan,1'e eşitl=1,a=2
olduğul=255
zamanihtiyacımızolandan başlamak gereklix
.
Özellikleriyle ilgili daha fazla ayrıntı , önceki kısa uygulamayı elde etmek için optimizasyonlarımızın çoğunu içeren bir yazı ile, makalemizde p
sunulmuştur .
kurallar
İşlevi p
1683 bitin altında uygulayan bir program önerin . Program ne kadar kısaysa, belirli bir dil için o kadar anormal olan o kadar kısa olur. Diliniz Kuznyechik, Streebog veya p
yerleşik bir dilde ise, bunları kullanamazsınız.
En iyi uygulamayı belirlemek için kullandığımız metrik, bayt cinsinden program uzunluğu. Akademik uzunluğumuzda bit uzunluğunu kullanıyoruz, ancak sadelik uğruna burada baytlara bağlıyız.
Dil fonksiyonu, argüman veya çıkış net bir fikri yoksa, kodlama tanımlamak için size kalmış, ancak değer kodlama gibi hileler pi[x]
olarak x
açıkça yasaklanmıştır.
Bu konudaki bulgularımızı içeren bir araştırma makalesi hazırladık. Bu kullanılabilir burada . Ancak, bilimsel bir mekanda yayınlanması durumunda, en iyi uygulamaların yazarlarını memnuniyetle kabul edeceğiz.
Bu arada, bu soruyu hazırlarken yardımları için xnor'a teşekkürler!
1683 bits at most
katı bir kısıtlama [sic?] Veya amaç mı?