Як отримати невідомі значення


19

Чи може мені хтось допомогти з наступною проблемою?

Я хочу знайти деякі значення a i , b jai,bj (mod NN ), де i = 1 , 2 , , K , j = 1 , 2 , , Ki=1,2,,K,j=1,2,,K (наприклад, К = 6K=6 ), задавши список значень К 2K2 які відповідають різниці a i - b j( модN )aibj(modN) (наприклад N = 251N=251 ), не знаючи конкретного відповідного відношення. Оскільки значення a i , b j( модN )ai,bj(modN) не визначені однозначно, враховуючи відмінності a i - b j( модN )aibj(modN) , ми шукаємо будь-яке дійсне призначення значень.

Безумовно, спробувати кожну перестановку чисел К 2K2 у списку (цілком К 2 !K2! Можливі випадки), а потім вирішити модульні рівняння з a i , b jai,bj як змінні нездійсненно.

Насправді ця проблема виникає у статті про криптоаналіз до ранньої версії схеми підпису NTRU ( http://eprint.iacr.org/2001/005 ). Однак автор написав лише одне речення «Простий алгоритм зворотного відстеження знаходить одне рішення ...» (у Розділі 3.3), і тому хто-небудь може дати більше пояснень? Крім того, автор також зазначив, що «кожен круговий зсув { ( ( a i + M )модN , ( b i + M )модN } K i = 1{((ai+M)modN,(bi+M)modN}Ki=1 або swap ( { ( N - 1 - b i , N - 1 - a i ) } K i =1)({(N1bi,N1ai)}Ki=1) призводить до того ж шаблону аibjmodNaibjmodN ”і чи корисне це твердження?


7
Зауважте, що відновити неможливо , оскільки якщо до всіх чисел додати деяку константу , то відмінності залишаються однаковими. ai,bjai,bjCC
Yuval Filmus

1
@Yuval: Це вже включено в останнє речення опису. Я думаю, що потрібне лише одне рішення, оскільки їх може існувати декілька.
domotorp

2
@Yuval Вибачте за не вказавши, що «s також повинні бути прийняті модульне . Так що не існує нескінченних рішень. ai,bjai,bjNN
гість

@domotorp Так, знайти будь-яке з рішень добре.
гість

1
Можливо, ОП може уточнити, що , приймаються за модулем раніше на посаді: можливо, в заголовку або в першому абзаці. Питання з постійною також варто згадати. Обидві речі плутали мене, коли я почав читати. a i b j N CaibjNC
Хуан Бермеджо Вега

Відповіді:


4

Ось пропозиція, для K = 6 і N = 251 . Нам дається список a i - b jK=6N=251( модN ) . Почніть з одного з них, не втрачаючи загальності a 1 - b 1 . Без втрати загальності b 1 = 0 , і отримуємо значення a 1 . Тепер візьміть ще один, і сподіватисящо вона має вигляд 2 - б 1 (це відбувається з ймовірністю +5 / +35 = 1 / 7 ), і вивести на 2 .aibj(modN)a1b1b1=0a1a2b15/35=1/7a2

На даному етапі, ми знаємо , з 1 , а 2 , б 1 . Наша наступна мета полягає в тому, щоб шукати в 1 - б J для J 1 . Для кожного кандидата a i - b j , якщо i = 1, тоді ( a i - b j ) + ( a 2 - a 1 ) = a 2 - b j також має бути у списку. Якщо яa1,a2,b1a1bjj1aibji=1(aibj)+(a2a1)=a2bj1 , то ймовірністьщо ( я - Ь J ) + ( 2 - 1 ) також в списку приблизно 33 / 251 . Отже, якщо ми знайдемо якогось кандидата a i - b j, для якого ( a i - b j ) + ( a 2 - a 1 ) також є у списку, то, ймовірно, i = 1 . Таким чином ми можемо відновитисьi1(aibj)+(a2a1)33/251aibj(aibj)+(a2a1)i=1b 2 з певною визначеністю.b2

На цьому етапі ми знаємо a 1 , a 2 , b 1 , b 2 . Таким же чином , що ми витягнутого б 2 , можна відновити в 3 з достатньою ступенем впевненості. Потім ми можемо відновити b 3 , шукаючи кандидата a i - b j, для якого ( a i - b j ) + ( a 2 - a 1 ) і ( a i - ba1,a2,b1,b2b2a3b3aibj(aibj)+(a2a1)j ) + ( a 3 - a 1 ) обидва в списку. Тому щонас є щес, наша ймовірність відмови йде значно вниз. Продовжуємо і знаходимо b 3 , a 4 , b 4 , a 5 , b 6 , a 6 , b 6 .(aibj)+(a3a1)ab3,a4,b4,a5,b6,a6,b6

У будь-який момент в цьому алгоритмі, ми могли б здогадатися що - то не так, і це в кінцевому рахунку призведе до протиріччя (скажімо , в якій - то момент, що не хороший кандидат я - б J ). Потім ми повертаємось назад і спробуємо іншу можливість; якщо ми вичерпаємо всі можливості, ми знову відступимо і спробуємо іншу можливість (для іншого етапу алгоритму); і так далі.aibj

Це дійсно добре програмувати цей алгоритм - це, мабуть, єдиний спосіб зрозуміти, як правильно реалізувати зворотний трек. Це також єдиний спосіб сказати, чи працює цей алгоритм на практиці.


Дякую, і я також зашифрую це відтворення, щоб зрозуміти його. Можливо, автор цього оригінального документу використовував подібний метод, тому що він також згадав "зворотній шлях".
гість

Вибачте, що забули написати коментар до вашої відповіді! Я також реалізував запропонований вами метод (на C ++). Висновок полягає в тому, що ваш алгоритм працює досить добре, і одне з рішень можна знайти дуже швидко (менше ніж на секунду на моєму ПК). І цього разу я можу краще зрозуміти процедури зворотного треку. Велике спасибі!
гість

Чому я не можу "@Yuval" у своєму останньому коментарі ?! Вибачте, але я кілька разів намагався.
гість

Можливо, ви могли б поділитися кодом в Інтернеті, щоб інші люди, які читали документ, мали доступ до нього.
Yuval Filmus

5

Оновлення : Опис, наведений нижче, стосується іншої проблеми (у якій у вас все парні відстані в наборі, а не попарні відстані між двома різними наборами). Я все одно залишу це, оскільки це тісно пов'язане.

Ця проблема називається проблемою колії , і це окремий випадок загальної проблеми вбудовування d -torus. Вона також тісно пов’язана з проблемою "під ключ", в якій різниці відстаней є абсолютними (не по модулю деяка кількість).d

Невідомо, чи допускає проблема прохідної колії полігональний алгоритм. Існують різні алгоритми псевдо-полі часу для відповідних питань. Найкраща довідка (на жаль, стара) - робота Лемке, Скіени та Сміта .


1
Я думаю, що ця проблема інша. У задачі про прохідний шлях ми знаємо всі попарні відстані, тут ми знаємо його лише між двома точками, які знаходяться в різних групах. Хоча це здається менше інформації, але насправді це може допомогти вирішити проблему.
domotorp

Ага так. це двосторонній графік. гарна думка.
Суреш Венкат

Біпартитовий графік? Щось на зразок. Можливо, я повинен спробувати проблему таким чином, але в мене зараз немає конкретного думки.
гість

3

Ось зауваження, яке, на мою думку, дає тобі місце, можливо, достатньо одного, щоб вирішити проблему.

Припустимо, у нас є чотири відмінності a 1 - b 1 , a 1 - b 2 , a 2 - b 1 , a 2 - b 2, які виникають у вигляді попарних різниць між двома a 's та 2 b ' s. Назвіть це квартетом відмінностей. Зауважте, що у нас нетривіальні стосунки:a1b1a1b2a2b1a2b2ab

( a 1 - b 1 ) - ( a 1 - b 2 ) = ( a 2 - b 1 ) - ( a 2 - b 2 )( модN ) .

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

Ви можете спробувати використати це відношення для визначення потенційних квартетів із списку K 2 . Наприклад, виберіть зі списку чотири відмінності; якщо вони не задовольняють вищевказаним відносинам, то вони точно не виникають із структури квартету; якщо вони задовольняють стосунки, вони можуть виникнути з квартету.K2

Є багато способів взяти речі звідси, але я підозрюю, що цього буде достатньо.

Я особливо підозрюю, що для ваших прикладних параметрів, проблема буде досить простою, тому що вищевказаний тест на розпізнавання квартету, ймовірно, не буде мати занадто багато помилкових позитивних результатів. Наше з усіх ( К 24 ) способів вибору 4 відмінностей зі списку, буде ( K(K24)2 ) 2квартети (які всі задовольнятимуть відносини), а решта - це неквартети (які задовольняють відношення з вірогідністю1/N, евристично). Тому ми очікуємо побачити про((K2(K2)21/N4 ) - ( К2 ) 2)/Nхибних позитивних результатів, тобто 4-кортезів, які проходять тест, навіть якщо вони не є квартетами. Для ваших параметрів це означає, що у нас є 225 квартетів та(58905-225)/251234інших помилкових позитивних результатів; тому приблизно половина 4-х кортежів, які проходять тест, насправді є квартетами. Це означає, що вищевказаний тест є досить хорошим способом розпізнавання квартетів. Після того, як ви зможете розпізнати квартети, ви зможете реально поїхати в місто, відновивши структуру списку відмінностей.((K24)(K2)2)/N(58905225)/251234


@DW: Дякую, але мені зараз цікаво наступний крок після того, як знайдуться всі можливі квартети (всього 225 + 234 = 459). Чи слід шукати 3 квартети, що не перетинаються, і перевіряти, чи можуть вони стати можливим рішенням? Як це досягти ефективно? Можливо, не так складно, оскільки не буде багато перекриттів.
гість

@aguest, гарне запитання! Я не можу згадати, що я думав у той час. Я думаю , що я пам'ятаю , думав один підхід міг би почати з одного квартету, а потім подивитися на всі інші , які перекривають його в 2 відмінностей (наприклад, що виникають з в 1 , в J , б 1 , б 2 , де J 2 ), але я не знаю, куди податися звідти (як відфільтрувати помилкові позитиви). a1,aj,b1,b2j2
DW

3

Ось інший підхід, заснований на итеративно знайти номери , які не можуть з'являтися серед { 1 , ... , 6 } . Назвемо безліч А більш-аппроксимацией а «S , якщо ми знаємо , що { 1 , ... , а 6 } A . Точно так же, B є overapproximation з Ь «и , якщо ми знаємо , що { Ь 1 , ... , б 6 } B . Очевидно, що менший A{a1,,a6}Aa{a1,,a6}ABb{b1,,b6}BA, Тим більше корисно це по-наближення, і те ж саме відноситься і до B . Мій підхід ґрунтується на ітераційному уточненні цих надмірних наближень, тобто ітеративному зменшенні розміру цих наборів (оскільки ми виключаємо все більше і більше значень як неможливих).B

Основою цього підходу є метод доопрацювання : задавши перевищення апроксимації A для a та надмірне наближення B для b , знайдіть нове перевищення A для такого a , що A * . Зокрема, як правило , * буде менше , ніж А , так що це дозволяє нам уточнити Надмірна наближення для через «с.AaBbAaAAAAa

За допомогою симетрії, по суті, той самий трюк дозволить нам уточнити наше надмірне наближення для b : з огляду на перевищення наближення A для a та надмірне наближення B для b , воно призведе до нового -приближення B для b 's.bAaBbBb

Отже, дозвольте мені розповісти, як зробити уточнення, тоді я зберу все, щоб отримати повний алгоритм цієї проблеми. Далі, нехай D позначає множину різниць, тобто D = { a i - b j : 1 i , j 6 } ; ми зосередимося на пошуку доопрацьовуватися наближення А * , враховуючи , B .DD={aibj:1i,j6}AA,B

How to compute a refinement. Consider a single difference dDdD. Consider the set d+B={d+y:yB}d+B={d+y:yB}. Based on our knowledge that BB is an over-approximation of the bb's, we know that at least one element of d+Bd+B must be an element of {a1,,a6}{a1,,a6}. Therefore, we can treat each of the elements in d+Bd+B as a "suggestion" for a number to possibly include in AA. So, let's sweep over all differences dDdD and, for each, identify which numbers are "suggested" by dd.

Now I'm going to observe that the number a1a1 is sure to be suggested at least 6 times during this process. Why? Because the difference a1b1a1b1 is in DD, and when we process it, a1a1 will be one of the numbers it suggests (since we're guaranteed that b1Bb1B, (a1b1)+B(a1b1)+B will surely include a1a1). Similarly, the difference a1b2a1b2 appears somewhere in DD, and it'll cause a1a1 to be suggested again. In this way, we see that the correct value of a1a1 will be suggested at least 6 times. The same holds for a2a2, and a3a3, and so on.

So, let AA be the set of numbers aa that have been suggested at least 6 times. This is sure to be an over-approximation of the aa's, by the above comments.

As an optimization, we can filter out all suggestions that are not present in AA immediately: in other words, we can treat the difference dd as suggesting all of the values (d+B)A(d+B)A. This ensures that we will have AAAA. We are hoping that AA is strictly smaller than AA; no guarantees, but if all goes well, maybe it will be.

Putting this together, the algorithm to refine A,BA,B to yield AA is as follows:

  1. Let S=dD(d+B)AS=dD(d+B)A. This is the multi-set of suggestions.

  2. Count how many times each value appears in SS. Let AA be the set of values that appear at least 6 times in SS. (This can be implemented efficiently by building an array aa of 251 initially, initially all zero, and each time the number ss is suggested, you increment a[s]a[s]; at the end you sweep through aa looking for elements whose value is 6 or larger)

A similar method can be built to refine A,BA,B to get BB. You basically reverse things above and flip some signs: e.g., instead of d+Bd+B, you look at d+Ad+A.

How to compute an initial over-approximation. To get our initial over-approximation, one idea is to assume (wlog) that b1=0b1=0. It follows that each value aiai must appear somewhere among DD, thus the list of differences DD can be used as our initial over-approximation for the aa's. Unfortunately, this doesn't give us a very useful over-approximation for the bb's.

A better approach is to additionally guess the value of one of the aa's. In other words, we assume (wlog) that b1=0b1=0, and use A=DA=D as our initial over-approximation of the aa's. Then, we guess which one of these 36 values is indeed one of the aa's, say a1a1. That then gives us an over-approximation B=a1DB=a1D for the bb's. We use this initial over-approximation A,BA,B, then iteratively refine it until convergence, and test whether the result is correct. We repeat up to 36 times, with 36 different guesses at a1a1 (on average 6 guesses should be enough) till we find one that works.

A full algorithm. Now we can have a full algorithm to compute a1,,a6,b1,,b6a1,,a6,b1,,b6. Basically, we derive an initial over-approximation for AA and BB, then iteratively refine.

  1. Make a guess: For each zDzD, guess that a1=za1=z. Do the following:

    1. Initial over-approximation: Define A=DA=D and B=zDB=zD.

    2. Iterative refinement: Repeatedly apply the following until convergence:

      • Refine A,BA,B to get a new over-approximation BB of the bb's.
      • Refine A,BA,B to get a new over-approximation AA of the aa's.
      • Let A:=AA:=A and B:=BB:=B.
    3. Check for success: If the resulting sets A,BA,B each have size 6, test whether they are a valid solution to the problem. If they are, stop. If not, continue with the loop over candidate values of zz.

Analysis. Will this work? Will it eventually converge on A={a1,,a6}A={a1,,a6} and B={b1,,b6}B={b1,,b6}, or will it get stuck without completely solving the problem? The best way to find out is probably to test it. However, for your parameters, yes, I expect it will be effective.

If we use method #1, as long as |A|,|B||A|,|B| are not too large, heuristically I expect the sizes of the sets to monotonically shrink. Consider deriving AA from A,BA,B. Each difference dd suggests |B||B| values; one of them correct, and the other |B|1|B|1 can be treated (heuristically) as random numbers. If xx is a number that does not appear among the aa's, what is the probability that it survives the filtering and is added to AA? Well, we expect aa to be suggested about (|B|1)×36/251(|B|1)×36/251 times in total (on average, with standard deviation about the square root of that). If |B|36|B|36, the probability that a wrong xx survives the filtering should be about p=0.4p=0.4 or so (using the normal approximation for the binomial, with continuity correction). (The probability is smaller if |B||B| is smaller; e.g., for |B|=30|B|=30, I expect p0.25p0.25.) I expect the size of AA to be about p(|A|6)+6p(|A|6)+6, which will strictly improve the over-approximation since it is strictly smaller than |A||A|. For instance, if |A|=|B|=36|A|=|B|=36, then based upon these heuristics I expect |A|18|A|18, which is a big improvement over |A||A|.

Therefore, I predict that the running time will be very fast. I expect about 3-5 iterations of refinement to be enough for convergence, typically, and about 6 guesses at zz should probably be enough. Each refinement operation involves maybe a few thousand memory reads/writes, and we do that maybe 20-30 times. So, I expect this to be very fast, for the parameters you specified. However, the only way to find out for sure is to try it and see if it works well or not.


@DW: Thank you very much for your long answer and the effort you took to type so many words!!! According to your description, your algorithm here is quite correct. And I’m going to code it to test the efficiency right now.
a guest

@DW: Hi, I’ve implemented your description in C++. The algorithm runs fast and the refinement step does reduce the sizes of original sets A and B. However, the convergence seems to be not so perfect. In fact, for each guess zD, the final sizes of A and B are still more than 10 according to my record output by the program. The most frequent number of existing elements when A (and B) can not be improved by further repetitions of refinement is 11, but I can hardly see a number below 10. However, this has made the problem solvable by trying each 6-elements chosen from
a guest

@DW: (Cotinued)final A and B for each guess z (although I didn’t implement the last step on my PC). The total amount computation will be about 220, I estimate. Thank you very much!
a guest

Sorry, but my last comment is too long, and I have to split it into two.
a guest
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.