Jak uzyskać nieznane wartości

19

Czy ktoś może mi pomóc z następującym problemem?

Chcę znaleźć niektóre wartości ai,bjai,bj (mod N.N ) gdzie i = 1 , 2 , , K , j = 1 , 2 , , Ki=1,2,,K,j=1,2,,K (na przykład K = 6K=6 ), biorąc pod uwagę listę wartości K 2K2 , które odpowiadają różnicom a i - b j( modN )aibj(modN) (na przykład N = 251N=251 ), nie znając konkretnej odpowiedniej relacji. Ponieważ wartości a i , b j( modN )ai,bj(modN) nie są jednoznacznie zdefiniowane, biorąc pod uwagę różnice a i - b j( modN )aibj(modN) , szukamy jakiegokolwiek prawidłowego przypisania wartości.

Zdecydowanie wypróbowanie każdej permutacji liczb K 2K2 na liście (całkowicie możliwe przypadki K 2 !K2! ), A następnie rozwiązywanie równań modułowych za pomocą a i , b jai,bj ponieważ zmienne są niemożliwe.

W rzeczywistości problem ten pojawia się w artykule na temat kryptoanalizy we wczesnej wersji schematu podpisu NTRU ( http://eprint.iacr.org/2001/005 ). Jednak autor napisał tylko jedno zdanie „Prosty algorytm cofania się znajduje jedno rozwiązanie…” (w rozdziale 3.3), a zatem czy ktoś może podać więcej wyjaśnień? Co więcej, autor wspomniał również, że „każde przesunięcie kołowe { ( ( a i + M )modN , ( b i + M )modN } K i = 1{((ai+M)modN,(bi+M)modN}Ki=1 lub zamiana ( { ( N - 1 - b i , N - 1 - a i ) } K i = 1 )({(N1bi,N1ai)}Ki=1) daje taki sam wzorzec jak a i -b jmodN.aibjmodN ”i czy to stwierdzenie jest pomocne?

gość
źródło
7
Zauważ, że niemożliwe jest odzyskanie a i , bjai,bj , ponieważ jeśli dodasz stałą doC do wszystkich liczb, różnice pozostaną takie same.
Yuval Filmus
1
@Yuval: To jest już zawarte w ostatnim zdaniu opisu. Myślę, że potrzebne jest tylko jedno rozwiązanie, ponieważ może istnieć kilka.
domotorp 18.04.13
2
@Yuval Przepraszamy za nie wskazując, że „s należy również wziąć modułową . Więc nie ma nieskończonych rozwiązań. a i , b j N.ai,bjN
gość
@domotorp Tak, znalezienie jednego z rozwiązań jest OK.
gość
1
Być może OP mógłby wyjaśnić, że , są brane modulo wcześniej w poście: być może w tytule lub w pierwszym akapicie. Warto również wspomnieć o kwestii stałejObie rzeczy wprawiły mnie w zakłopotanie, kiedy zacząłem czytać. a i b j N CaibjNC
Juan Bermejo Vega

Odpowiedzi:

4

Oto sugestia dla i . Otrzymujemy listę . Zacznij od wzięcia jednego z nich, bez utraty ogólności . Bez utraty ogólności , a otrzymujemy wartość . Teraz weź inny i miej nadzieję, że ma on postać (dzieje się to z prawdopodobieństwem ), i wywnioskuj .K = 6 K=6N = 251 N=251a i - b j( modN ) 1 - b 1 b 1 = 0 1 2 - b 1 5 / 35 = 1 / 7 2aibj(modN)a1b1b1=0a1a2b15/35=1/7a2

Na tym etapie wiemy . Naszym kolejnym celem jest poszukiwanie dla . Dla każdego kandydata , jeśli to również powinno być na liście. Jeśli , to prawdopodobieństwo, że jest również na liście, wynosi około . Jeśli więc znajdziemy kandydata dla którego również znajduje się na liście, to prawdopodobnie . W ten sposób możemy odzyskać z pewną pewnością.a 1 , a 2 , b 1 a1,a2,b1a 1 - b ja1bj j 1 j1a i - b jaibj i = 1 i=1( a i - b j ) + ( a 2 - a 1 ) = a 2 - b j(aibj)+(a2a1)=a2bj i 1 i1( a i - b j ) + ( a 2 1 ) - a(aibj)+(a2a1)33/25133/251aibjaibj(aibj)+(a2a1)(aibj)+(a2a1)i=1i=1b2b2

Na tym etapie wiemy . W ten sam sposób, w jaki odzyskaliśmy , możemy odzyskać z rozsądną pewnością. Następnie możemy odzyskać , szukając kandydata dla którego i znajdują się na liście. Ponieważ mamy więcej s, nasza prawdopodobieństwo awarii idzie znacznie w dół. Kontynuujemy i znajdujemy .a1,a2,b1,b2a1,a2,b1,b2b2b2a3a3b3b3aibjaibj(aibj)+(a2a1)(aibj)+(a2a1)(aibj)+(a3a1)(aibj)+(a3a1)aab3,a4,b4,a5,b6,a6,b6b3,a4,b4,a5,b6,a6,b6

W dowolnym momencie tego algorytmu moglibyśmy zgadnąć coś złego, co ostatecznie doprowadzi do sprzeczności (powiedzmy, że w pewnym momencie nie ma dobrego kandydata ). Następnie cofamy się i próbujemy innej możliwości; jeśli wyczerpiemy wszystkie możliwości, cofniemy się ponownie i spróbujemy innej możliwości (dla innego etapu algorytmu); i tak dalej.aibjaibj

Dobrym ćwiczeniem jest zaprogramowanie tego algorytmu - to prawdopodobnie jedyny sposób, aby zrozumieć, jak poprawnie zaimplementować cofanie. To także jedyny sposób, aby stwierdzić, czy ten algorytm działa w praktyce.

Yuval Filmus
źródło
Dziękuję, a ja również zakoduję to cofanie, aby lepiej je zrozumieć. Być może autor tego oryginalnego artykułu zastosował podobną metodę, ponieważ wspomniał także o „cofaniu się”.
gość
Przepraszam, że zapomniałem opublikować mojego komentarza do swojej odpowiedzi! Zaimplementowałem również metodę, którą zasugerowałeś (w C ++). Wniosek jest taki, że twój algorytm działa całkiem dobrze i jedno z rozwiązań można wtedy znaleźć bardzo szybko (w mniej niż sekundę na moim komputerze). I tym razem lepiej rozumiem procedury cofania. Dziękuję Ci bardzo!
gość
Dlaczego nie mogę napisać „@Yuval” w moim ostatnim komentarzu ?! Przepraszam, ale próbowałem kilka razy.
gość
Być może mógłbyś udostępnić kod online, aby inne osoby czytające gazetę miały do ​​niego dostęp.
Yuval Filmus
5

Aktualizacja : Poniższy opis dotyczy innego problemu (w którym wszystkie pary są parami w zestawie, a nie parami odległości między dwoma odrębnymi zestawami). Zrezygnuję z tego, ponieważ jest to ściśle powiązane.

Problem ten nazywa się problemem obwodnicy i jest szczególnym przypadkiem ogólnego problemu osadzania się -torus. Jest to również ściśle związane z problemem rogatki, w którym różnice odległości są absolutne (nie modulo pewnej liczby).d

Nie wiadomo, czy problem z obwodnicą dopuszcza algorytm wieloczasowy. Istnieją różne algorytmy pseudo-poli-czasowe dla powiązanych pytań. Najlepszym odniesieniem (niestety starym) jest artykuł Lemke, Skieny i Smitha .

Suresh Venkat
źródło
1
Myślę, że ten problem jest inny. W problemie obwodnicy znamy wszystkie odległości parami, tutaj znamy go tylko między dwoma punktami, które są w różnych grupach. Chociaż wydaje się, że to mniej informacji, w rzeczywistości może pomóc rozwiązać problem.
domotorp 18.04.13
O tak. to wykres dwudzielny. Słuszna uwaga.
Suresh Venkat
Dwustronny wykres? Coś jak. Może powinienem spróbować rozwiązać problem w ten sposób, ale nie mam teraz konkretnego ciągu myśli.
gość
3

Oto spostrzeżenie, które moim zdaniem stanowi przyczółek, być może wystarczający do rozwiązania problemu.

Załóżmy, że mamy cztery różnice , , , które powstają jako pary różnic między dwoma a i . Nazwij to kwartetem różnic. Zauważ, że mamy nietrywialny związek:a1b1a1b2a2b1a2b2ab

(a1b1)(a1b2)=(a2b1)(a2b2)(modN).

Możesz spróbować wykorzystać ten związek do zidentyfikowania potencjalnych kwartetów z listy . Na przykład wybierz cztery różnice z listy; jeśli nie spełniają powyższego związku, to na pewno nie powstają ze struktury kwartetu; jeśli spełnią relację, mogą powstać z kwartetu.K2

Istnieje wiele sposobów na zabranie rzeczy stąd, ale podejrzewam, że to wystarczy.

Podejrzewam szczególnie, że dla przykładowych ustawień parametrów problem będzie dość łatwy, ponieważ powyższy test rozpoznawania kwartetu prawdopodobnie nie będzie miał zbyt wielu fałszywych trafień. Nasz ze wszystkich sposobów wyboru 4 różnic z listy, będą kwartety (które wszystkie spełnią relację), a reszta to kwartety niekompetentne (które spełniają związek z prawdopodobieństwem , heurystycznie). Dlatego spodziewamy się zobaczyć o fałszywych trafień, tj. 4-krotkach, które przejdą test, nawet jeśli nie są kwartetami. Dla twoich parametrów oznacza to, że mamy 225 kwartetów i(K24)(K2)21/N((K24)(K2)2)/N(58905225)/251234inne fałszywe alarmy; więc około połowa 4-krotek, które przejdą test, to tak naprawdę kwartety. Oznacza to, że powyższy test jest całkiem dobrym sposobem na rozpoznanie kwartetów. Kiedy już rozpoznasz kwartety, naprawdę możesz udać się do miasta po odzyskaniu struktury listy różnic.

DW
źródło
@DW: Dziękuję, ale teraz zastanawiam się nad następnym krokiem po znalezieniu wszystkich możliwych kwartetów (łącznie 225 + 234 = 459). Czy powinno szukać 3 nie pokrywających się kwartetów i sprawdzać, czy mogą one stanowić możliwe rozwiązanie? Jak to zrobić skutecznie? Może nie tak trudne, ponieważ nie będzie wielu nakładek.
gość
@aguest, dobre pytanie! Nie pamiętam, co wtedy myślałem. Myślę, że pamiętam, że jednym podejściem może być rozpoczęcie od jednego kwartetu, a następnie poszukiwanie wszystkich innych, które pokrywają się z nim w dwóch różnicach (np. Wynikających z gdzie ), ale ja nie wiedzieć, dokąd się udać (jak odfiltrować fałszywe alarmy). a1,aj,b1,b2j2
DW
3

Oto inne podejście, oparte na iteracyjnym wyszukiwaniu liczb, które nie mogą pojawić się w . Nazywamy zbiorem nadmierne przybliżenie „s, jeśli wiemy, że . Podobnie, jest overapproximation z „s, jeśli wiemy, że . Oczywiście mniejszy{a1,,a6}Aa{a1,,a6}ABb{b1,,b6}BA , tym bardziej użyteczne to nadmierne przybliżenie jest i to samo dotyczy . Moje podejście opiera się na iteracyjnym udoskonalaniu tych nadmiernych przybliżeń, tj. Iteracyjnym zmniejszaniu rozmiaru tych zbiorów (ponieważ wykluczamy coraz więcej wartości jako niemożliwych).B

Zasadniczą cechą tego rozwiązania jest sposób udoskonalenia : podany nadmierne przybliżenie dla „S nadmierne przybliżenie do ” s, znalezienie nowego nadmiernej aproksymacji do jest taki, że . W szczególności normalnie będzie mniejsza niż , więc to pozwala nam udoskonalić nadmiernej Przybliżony „s.AaBbAaAAAAa

Przez symetrii zasadniczo taka sama sztuczka pozwoli nam udoskonalić nasze nadmiernej Przybliżony „s: podany nadmierne zbliżanie dla ” ów i nadmierne zbliżanie do „s, będzie produkować nowy ponad - przybliżenie dla .bAaBbBb

Więc pozwól, że powiem ci, jak udoskonalić, a następnie połączę wszystko, aby uzyskać pełny algorytm dla tego problemu. W poniższym przykładzie niech oznacza zbiór różnic, tzn. ; skupimy się na znalezieniu wyrafinowanego nadmiernego przybliżeniaDD={aibj:1i,j6}A , zważywszy .A,B

Jak obliczyć udoskonalenie. Rozważmy jeden różnicy . Rozważmy zestaw . W oparciu o naszą wiedzę, że jest nadmiernym przybliżeniem , wiemy, że co najmniej jeden element musi być elementem . W związku z tym można traktować każdy z elementów jako „sugestii” po numer może zawierać w . Prześledźmy więc wszystkie różnice i, dla każdej, określ, które liczby są „sugerowane” przez .dDd+B={d+y:yB}Bbd+B{a1,,a6}d+BAdDd

Teraz zauważę, że liczba pewnością zostanie zasugerowana co najmniej 6 razy podczas tego procesu. Dlaczego? Ponieważ różnica występuje w , a kiedy ją przetworzymy, będzie jedną z sugerowanych przez nią liczb (ponieważ mamy gwarancję, że , z pewnością będzie zawierać ). Podobnie różnica pojawia się gdzieś w i spowoduje ponowne zasugerowanie . W ten sposób widzimy, że poprawna wartośća1a1b1Da1b1B(a1b1)+Ba1a1b2Da1a1 zostanie zasugerowana co najmniej 6 razy. To samo dotyczy ia2a3, i tak dalej.

Niech będzie zbiorem liczbAa , które zostały zasugerowane co najmniej 6 razy. To z pewnością będzie nadmierne przybliżenie „s, w powyższych komentarzach.a

Jako optymalizacji, możemy odfiltrować wszystkie propozycje, które nie są obecne w natychmiast: innymi słowy, możemy traktować różnicę jak sugeruje wszystkie wartości . Gwarantuje to, że będziemy musieli . Mamy nadzieję, że jest ściśle mniejsze niżAd(d+B)AAAAA ; żadnych gwarancji, ale jeśli wszystko pójdzie dobrze, może tak będzie.

Podsumowując, algorytm udoskonalenia dajeA,BA jest następujący:

  1. Niech . To jest zestaw sugestii.S=dD(d+B)A

  2. Policz, ile razy pojawia się każda wartość w . Niech oznacza zbiór wartości, które są w co najmniej 6 razy w . (Może to być realizowane skutecznie budując tablicę z 251 na początku, początkowo wszystkie zera, i za każdym razem liczba jest sugerowane, to przyrost ; na koniec zamiatać przez szuka elementów, których wartość wynosi 6 lub większy)SASasa[s]a

Podobną metodę można zbudować w celu udoskonalenia celu uzyskania . W zasadzie odwrotnej rzeczy powyżej odwrócić pewne oznaki: np zamiast , obejrzysz .A,BBd+Bd+A

Jak obliczyć początkowe przekroczenie przybliżenia. Aby uzyskać nasze wstępne przybliżenie, jednym z pomysłów jest założenie (wlog), że . Wynika stąd, że każda wartość musi pojawić się gdzieś między , stąd listę różnic mogą być stosowane jako naszego początkowego nadmiernego zbliżenia dla tych. Niestety, nie daje to nam bardzo przydatnego przesadnego przybliżenia wartości .b1=0aiDDab

Lepszym podejściem jest dodatkowe odgadnięcie wartości jednego z „a”. Innymi słowy, zakładamy (wlog), które i używać jako naszego początkowego nadmiernego zbliżenia „s. Następnie możemy odgadnąć, która z tych wartości jest 36 rzeczywiście jeden z „s, powiedzmy . To daje nam w przybliżeniu dla . Używamy tego wstępnego przeszacowania , a następnie iteracyjnie dopracowujemy go do zbieżności i sprawdzamy, czy wynik jest poprawny. Powtarzamy do 36 razy, z 36 różnymi przypuszczeniami na (średnio powinno wystarczyć 6 domysłów), aż znajdziemy taki, który działa.ab1=0A=Daaa1B=a1DbA,Ba1

Pełny algorytm. Teraz możemy mieć pełny algorytm do obliczania . Zasadniczo wyprowadzamy wstępne przybliżenie dla i , a następnie iteracyjnie udoskonalamy.a1,,a6,b1,,b6AB

  1. Zgadnij: Dla każdego zgadnij, że . Wykonaj następujące czynności:zDa1=z

    1. Początkowe : zdefiniuj i .A=DB=zD

    2. Udoskonalenie iteracyjne: Powtarzaj kolejno następujące czynności aż do zbieżności:

      • Popraw aby uzyskać nowe przybliżenie z .A,BBb
      • Popraw aby uzyskać nowe przybliżenie dlaA,BAa „s.
      • Niech i .A:=AB:=B
    3. Sprawdź sukces: jeśli każdy z wynikowych zestawów ma rozmiar 6, sprawdź , czy są one poprawnym rozwiązaniem problemu. Jeśli tak, przestań. Jeśli nie, przejdź do pętli nad wartościami kandydującymi .A,Bz

Analiza. Czy to zadziała? Czy ostatecznie zbiegnie się w iA={a1,,a6}B={b1,,b6} , czy utknie bez całkowitego rozwiązania problemu? Najlepszym sposobem na sprawdzenie tego jest prawdopodobnie przetestowanie go. Jednak dla twoich parametrów, tak, spodziewam się, że będzie skuteczny.

Jeśli użyjemy metody nr 1, o ilenie są zbyt duże, heurystycznie spodziewam się, że rozmiary zestawów zmniejszą się monotonicznie. Rozważmy wyprowadzania z . Każda różnica sugerujewartości; jeden z nich jest poprawny, a drugi można traktować (heurystycznie) jako liczby losowe. Jeśli jest liczbą, która nie pojawia się wśród „s, jakie jest prawdopodobieństwo, że przeżyje filtrowanie i dodano do ? Spodziewamy sugestii dotyczącej|A|,|B|AA,Bd|B||B|1xaAa(|B|1)×36/251razy ogółem (średnio przy standardowym odchyleniu o pierwiastek kwadratowy z tego). Jeśli , prawdopodobieństwo, że niepoprawne. Na przykład, jeśli , to na podstawie tych heurystyk oczekuję|B|36x przetrwa filtrowanie powinno wynosić około lub więcej (przy użyciu normalnego przybliżenia dla dwumianu, z korektą ciągłości). (Prawdopodobieństwo jest mniejsze, jeśli jest mniejsze; np. Dla , spodziewam się .) Spodziewam się, że rozmiar będzie około , co zdecydowanie poprawi nadmierne zbliżenie, ponieważ jest ono ściśle mniejsze niżp=0.4|B||B|=30p0.25Ap(|A|6)+6|A||A|=|B|=36|A|18 , co stanowi dużą poprawę w stosunku do.|A|

Dlatego przewiduję, że czas działania będzie bardzo szybki. Spodziewam się, że około 3-5 iteracji udoskonalenia będzie wystarczających do konwergencji, a zwykle około 6 domysłów w punkcie powinno prawdopodobnie wystarczyć. Każda operacja udoskonalania obejmuje może kilka tysięcy odczytów / zapisów w pamięci, a robimy to może 20-30 razy. Oczekuję więc, że będzie to bardzo szybkie, jak na określone parametry. Jednak jedynym sposobem, aby się przekonać, jest wypróbowanie go i sprawdzenie, czy działa dobrze, czy nie.z

DW
źródło
@DW: Dziękuję bardzo za twoją długą odpowiedź i wysiłek włożony w pisanie tylu słów !!! Według twojego opisu, twój algorytm jest tutaj całkiem poprawny. Zamierzam go teraz zakodować, aby przetestować wydajność.
gość
@DW: Cześć, zaimplementowałem twój opis w C ++. Algorytm działa szybko i etap wyrafinowanie powoduje zmniejszenia rozmiarów oryginalnych zbiorów i . Jednak konwergencja nie wydaje się tak idealna. W rzeczywistości, dla każdej domysły , końcowe rozmiary i są nadal większe niż 10, zgodnie z moimi danymi wyjściowymi zapisanymi przez program. Najczęstszą liczbą istniejących elementów, gdy (i ) nie można poprawić przez kolejne powtórzenia udoskonalenia, jest 11, ale prawie nie widzę liczby poniżej 10. Jednak to sprawiło, że problem można rozwiązać, próbując każdego z nich Wybrano 6 elementówABzDABAB
gość
@DW: (Cotinued) końcowe i dla każdej zgadywanki (chociaż nie wdrożyłem ostatniego kroku na moim komputerze). Szacuję, że całkowita kwota obliczeń wyniesie około . Dziękuję Ci bardzo! ABz220
gość
Przepraszam, ale mój ostatni komentarz jest za długi i muszę go podzielić na dwie części.
gość