¿Alguien puede ayudarme con el siguiente problema?
Quiero encontrar algunos valores a i , b jai,bj (mod norteN ) donde i = 1 , 2 , ... , K , j = 1 , 2 , ... , Ki=1,2,…,K,j=1,2,…,K (por ejemplo K = 6K=6 ), dada una lista de valores K 2K2 que corresponden a las diferencias a i - b j( modN )ai−bj(modN) (por ejemplo N = 251N=251 ), sin conocer la relación correspondiente concreta. Dado que los valores a i , b j( modN )ai,bj(modN) no están definidos de manera única dadas las diferencias a i - b j( modN )ai−bj(modN) , buscamos cualquier asignación válida de valores.
Definitivamente, probar cada permutación de los números K 2K2 en la lista (¡totalmente K 2 !K2! Posibles casos) y luego resolver las ecuaciones modulares con a i , b jai,bj como las variables no es factible.
De hecho, este problema surge en un documento sobre el criptoanálisis de una versión temprana del esquema de firma NTRU ( http://eprint.iacr.org/2001/005 ). Sin embargo, el autor escribió solo una oración "Un algoritmo simple de retroceso encuentra una solución ..." (en la Sección 3.3) y ¿alguien puede dar más explicaciones? Además, el autor también mencionó que "cada cambio circular { ( ( a i + M )modificaciónN , ( b i + M )modificaciónN } K i = 1{((ai+M)modN,(bi+M)modN}Ki=1 o un intercambio ( { ( N - 1 - b i , N - 1 - a i ) } K i = 1 )({(N−1−bi,N−1−ai)}Ki=1) da como resultado el mismo patrón de a i - b jmodificaciónnorteai−bjmodN ”y ¿es útil esta afirmación?
Respuestas:
Aquí hay una sugerencia, para y . Se nos da una lista . Comience tomando uno de ellos, sin pérdida de generalidad . Sin pérdida de generalidad , y obtenemos el valor de . Ahora tome otro, y espere que tenga la forma (esto sucede con probabilidad ), y deduzca .K = 6 N = 251 a i - b jK=6 N=251 ( modN ) un 1 - b 1 b 1 = 0 un 1 a 2 - b 1 5 / 35 = 1 / 7 de un 2ai−bj(modN) a1−b1 b1=0 a1 a2−b1 5/35=1/7 a2
En esta etapa, sabemos . Nuestro próximo objetivo es buscar para . Para cada candidato , si entonces también debería estar en la lista. Si , entonces la probabilidad de que también esté en la lista es aproximadamente . Entonces, si encontramos algún candidato para el cual también está en la lista, entonces probablemente . De esta manera, podemos recuperar con cierta certeza.a 1 , a 2 , b 1 a 1 - b j j ≠ 1 a i - b j i = 1 ( a i - b j ) + ( a 2 - a 1 ) = a 2 - b j i ≠ 1 ( a i - b j ) + ( a 2 - aa1,a2,b1 a1−bj j≠1 ai−bj i=1 (ai−bj)+(a2−a1)=a2−bj i≠1 1 ) 33 / 251 un i - b j ( un i - b j ) + ( un 2 - un 1 ) i = 1 b 2(ai−bj)+(a2−a1) 33/251 ai−bj (ai−bj)+(a2−a1) i=1 b2
En esta etapa, conocemos . De la misma manera que recuperamos , podemos recuperar con certeza razonable. Entonces podemos recuperar buscando un candidato para el cual y estén ambos en la lista. Debido a que tenemos más s, nuestra probabilidad de falla disminuye considerablemente. Continuamos y encontramos .a 1 , a 2 , b 1 , b 2 b 2 a 3 b 3 a i - b j ( a i - b j ) + ( a 2 - a 1 ) ( a i - b j ) + ( a 3 - a 1 ) a b 3 , a 4 , b 4a1,a2,b1,b2 b2 a3 b3 ai−bj (ai−bj)+(a2−a1) (ai−bj)+(a3−a1) a , a 5 , b 6 , a 6 , b 6b3,a4,b4,a5,b6,a6,b6
En cualquier punto de este algoritmo, podríamos haber adivinado algo mal, y esto eventualmente resultará en una contradicción (por ejemplo, en algún momento, no hay un buen candidato ). Luego retrocedemos e intentamos otra posibilidad; si agotamos todas las posibilidades, retrocedemos nuevamente e intentamos otra posibilidad (para una etapa diferente del algoritmo); y así.a i - b jai−bj
Es un buen ejercicio programar realmente este algoritmo; esa es probablemente la única forma de entender cómo implementar el retroceso correctamente. Esa es también la única forma de saber si este algoritmo funciona en la práctica.
fuente
Actualización : La siguiente descripción es para un problema diferente (en el que tiene todas las distancias por pares en un conjunto en lugar de distancias por pares entre dos conjuntos distintos). Lo dejaré de todos modos ya que está estrechamente relacionado.
Este problema se llama problema de circunvalación y es un caso especial del problema general de incrustación -torus. También está estrechamente relacionado con el problema de la autopista de peaje, en el que las diferencias de distancia son absolutas (no módulo algún número).dd
No se sabe si el problema de la circunvalación admite un algoritmo de poli-tiempo. Existen varios algoritmos de pseudo-poli-tiempo para preguntas relacionadas. La mejor referencia (por desgracia, una antigua) es el artículo de Lemke, Skiena y Smith .
fuente
Aquí hay una observación que creo que te da un punto de apoyo, posiblemente suficiente para resolver el problema.
Supongamos que tenemos cuatro diferencias , , , que surgen como las diferencias por pares entre dos 'sy dos ' s. Llama a esto un cuarteto de diferencias. Tenga en cuenta que tenemos una relación no trivial:a1−b1a1−b1 a1−b2a1−b2 a2−b1a2−b1 a2−b2a2−b2 aa bb
( a 1 - b 1 ) - ( a 1 - b 2 ) = ( a 2 - b 1 ) - ( a 2 - b 2 )( modN ) .
Puede intentar usar esta relación para identificar posibles cuartetos fuera de la lista de K 2 . Por ejemplo, elija cuatro diferencias de la lista; si no satisfacen la relación anterior, definitivamente no surgen de una estructura de cuarteto; si satisfacen la relación, pueden surgir de un cuarteto.K2
Hay muchas maneras en que puede tomar las cosas desde aquí, pero sospecho que esto será suficiente.
Sospecho especialmente que, para su configuración de parámetros de ejemplo, el problema será bastante fácil, porque la prueba anterior para reconocer un cuarteto probablemente no tendrá demasiados falsos positivos. Nuestro de todos ( K 24 ) formas de elegir 4 diferencias de la lista, habrá ( K(K24) 2 ) 2cuartetos (que satisfarán la relación) y el resto son no cuartetos (que satisfacen la relación con probabilidad1/N, heurísticamente). Por lo tanto, esperamos ver acerca de((K2(K2)2 1/N 4 ) - ( K2 ) 2)/Nfalsos positivos, es decir, 4 tuplas que pasan la prueba a pesar de que no son cuartetos. Para sus parámetros, esto significa que tenemos 225 cuartetos y(58905-225)/251≈234otros falsos positivos; así que aproximadamente la mitad de las 4 tuplas que pasan la prueba son en realidad cuartetos. Esto significa que la prueba anterior es una forma bastante buena de reconocer los cuartetos. Una vez que puede reconocer los cuartetos, realmente puede ir a la ciudad para recuperar la estructura de la lista de diferencias.((K24)−(K2)2)/N (58905−225)/251≈234
fuente
Aquí hay un enfoque diferente, basado en encontrar iterativamente números que no pueden aparecer entre { a 1 , ... , a 6 } . Llame a un conjunto A un exceso de aproximación de la una 's si sabemos que { a 1 , ... , un 6 } ⊆ A . Del mismo modo, B es un overapproximation de la b 's si sabemos que { b 1 , ... , b 6 } ⊆ B . Obviamente, la A más pequeña{a1,…,a6} A a {a1,…,a6}⊆A B b {b1,…,b6}⊆B A es, más útil este exceso de aproximación es, y lo mismo pasa con B . Mi enfoque se basa en refinar iterativamente estas sobre aproximaciones, es decir, reducir de forma iterativa el tamaño de estos conjuntos (a medida que descartamos que cada vez más valores sean imposibles)B
El núcleo de este enfoque es un método de refinamiento : dada una sobre-aproximación A para las a 's y una sobre-aproximación B para las b ' s, encuentre una nueva sobre-aproximación A ∗ para las a 's tal que A * ⊊ A . En particular, normalmente A ∗ será más pequeño que A , por lo que esto nos permite refinar la sobre-aproximación para las a 's.A a B b A∗ a A∗⊊A A∗ A a
Por simetría, esencialmente el mismo truco nos permitirá refinar nuestra sobre-aproximación para las b 's: dada una sobre-aproximación A para las a ' sy una sobre-aproximación B para las b 's, producirá un nuevo sobre -aproximación B ∗ para los b 's.b A a B b B∗ b
Entonces, déjame decirte cómo hacer el refinamiento, luego armaré todo para obtener un algoritmo completo para este problema. En lo que sigue, supongamos que D denota el conjunto múltiple de diferencias, es decir, D = { a i - b j : 1 ≤ i , j ≤ 6 } ; nos centraremos en la búsqueda de un refinado exceso de aproximación A * , dada A , B .D D={ai−bj:1≤i,j≤6} A∗ A,B
Cómo calcular un refinamiento. Considere una sola diferencia d ∈ D . Considere el conjunto d + B = { d + y : y ∈ B } . Según nuestro conocimiento de que B es una sobre-aproximación de las b 's, sabemos que al menos un elemento de d + B debe ser un elemento de { a 1 , ... , a 6 } . Por lo tanto, podemos tratar cada uno de los elementos en d + Bd∈D d+B={d+y:y∈B} B b d+B {a1,…,a6} d+B como una "sugerencia" para un número de, posiblemente, incluir en una . Entonces, recorramos todas las diferencias d ∈ D y, para cada una, identifiquemos qué números son "sugeridos" por d .A d∈D d
Ahora voy a observar que el número a 1 seguramente se sugerirá al menos 6 veces durante este proceso. ¿Por qué? Debido a que la diferencia a 1 - b 1 está en D , y cuando la procesamos, a 1 será uno de los números que sugiere (ya que estamos garantizados que b 1 ∈ B , ( a 1 - b 1 ) + B lo hará seguramente incluye un 1 ). Del mismo modo, la diferencia a 1 - b 2 aparece en algún lugar dea1 a1−b1 D a1 b1∈B (a1−b1)+B a1 a1−b2 D , y haráque se vuelva a sugerir un 1 . De esta manera, vemos que el valor correcto de un 1 se sugerirá al menos 6 veces. Lo mismo vale para un 2 y un 3 , y así sucesivamente.D a1 a1 a2 a3
Entonces, sea A ∗ el conjunto de números a ∗ que se han sugerido al menos 6 veces. Esto seguramente será una sobre-aproximación de las a 's, según los comentarios anteriores.A∗ a∗ a
Como una optimización, podemos filtrar todas las sugerencias que no están presentes en un inmediato: en otras palabras, podemos tratar la diferencia d como una sugerencia de todos los valores ( d + B ) ∩ A . Esto asegura que tendrán un * ⊆ A . Esperamos que A ∗ sea estrictamente más pequeño que A ; sin garantías, pero si todo va bien, tal vez lo sea.A d (d+B)∩A A∗⊆A A∗ A
En conjunto, el algoritmo para refinar A , B para producir A ∗ es el siguiente:A,B A∗
Deje que S = ∪ d ∈ D ( d + B ) ∩ A . Este es el conjunto múltiple de sugerencias.S=∪d∈D(d+B)∩A
Cuente cuántas veces cada valor aparece en S . Deje A * el conjunto de valores que aparecen por lo menos 6 veces en S . (Esto se puede implementar de manera eficiente mediante la construcción de una matriz de una de 251 inicialmente, inicialmente todos cero, y cada vez el número s se sugiere, se incrementa un [ s ] ; al final se barre a través de un busca de elementos cuyo valor es 6 o más grande)S A∗ S a s a[s] a
Se puede construir un método similar para refinar A , B para obtener B ∗ . You cosas básicamente inversa arriba y voltear algunas señales: por ejemplo, en lugar de d + B , se mire - d + A .A,B B∗ d+B −d+A
Cómo calcular una sobre-aproximación inicial. Para obtener nuestra sobre-aproximación inicial, una idea es suponer (wlog) que b 1 = 0 . De ello se deduce que cada valor a i debe aparecer en algún lugar entre D , por lo tanto, la lista de diferencias D se puede utilizar como nuestra sobre-aproximación inicial para las a 's. Desafortunadamente, esto no nos da una sobre-aproximación muy útil para los b 's.b1=0 ai D D a b
Un mejor enfoque es adivinar adicionalmente el valor de una de las a 's. En otras palabras, suponemos (wlog) que b 1 = 0 , y usamos A = D como nuestra sobre-aproximación inicial de las a 's. Entonces, adivinamos cuál de estos 36 valores es de hecho una de las a 's, digamos un 1 . Eso nos da una sobre-aproximación B = a 1 - D para las b 's. Utilizamos esta sobre-aproximación inicial A , Ba b1=0 A=D a a a1 B=a1−D b A,B , luego refínalo iterativamente hasta la convergencia y prueba si el resultado es correcto. Repetimos hasta 36 veces, con 36 diferentes conjeturas en un 1 (en promedio 6 conjeturas debería ser suficiente) hasta que encuentre uno que funcione.a1
Un algoritmo completo. Ahora podemos tener un algoritmo completo para calcular a 1 , ... , a 6 , b 1 , ... , b 6 . Básicamente, derivamos una sobre-aproximación inicial para A y B , luego la refinamos iterativamente.a1,…,a6,b1,…,b6 A B
Adivina: para cada z ∈ D , adivina que a 1 = z . Haz lo siguiente:z∈D a1=z
Inicial sobre-aproximación: Definir A = D y B = z - D .A=D B=z−D
Refinamiento iterativo: aplique repetidamente lo siguiente hasta la convergencia:
Compruebe el éxito: si los conjuntos resultantes A , B tienen cada uno un tamaño 6, pruebe si son una solución válida para el problema. Si lo son, deténgase. Si no, continúe con el ciclo sobre los valores candidatos de z .A,B z
Análisis. esto funcionara? ¿Eventualmente convergerá en A = { a 1 , ... , a 6 } y B = { b 1 , ... , b 6 } , o se atascará sin resolver completamente el problema? La mejor manera de averiguarlo es probablemente probarlo. Sin embargo, para sus parámetros, sí, espero que sea efectivo.A={a1,…,a6} B={b1,…,b6}
Si usamos el método # 1, siempre que | A | , | B | no son demasiado grandes, heurísticamente espero que los tamaños de los conjuntos se reduzcan monotónicamente. Considere derivar Una * de A , B . Cada diferencia d sugiere | B | valores; uno de ellos correcto, y el otro | B | - 1 puede ser tratado (heurísticamente) como números aleatorios. Si x es un número que no aparece entre las a 's, ¿cuál es la probabilidad de que sobreviva al filtrado y se agregue a A|A|,|B| A∗ A,B d |B| |B|−1 x a ∗ ? Bueno, esperamos una a sugerirse sobre ( | B | - 1 ) × 36 / 251 veces en total (en promedio, con una desviación estándar sobre la raíz cuadrada de eso). Si | B | ≤ 36 , la probabilidad de que una x incorrectasobreviva al filtrado debe ser aproximadamente p = 0.4 o menos (usando la aproximación normal para el binomio, con corrección de continuidad). (La probabilidad es menor si | B | es menor; por ejemplo, para | B | =A∗ a (|B|−1)×36/251 |B|≤36 x p=0.4 |B| 30 , espero p ≈ 0.25 .) Espero que el tamaño de A ∗ sea aproximadamente p ( | A | - 6 ) + 6 , lo que mejorará estrictamente la sobre-aproximación ya que es estrictamente más pequeño que | A | . Por ejemplo, si | A | = | B | = 36 , luego basado en estas heurísticas que espero | A ∗ | ≈ 18 , que es una gran mejora sobre | A ||B|=30 p≈0.25 A∗ p(|A|−6)+6 |A| |A|=|B|=36 |A∗|≈18 |A| .
Por lo tanto, predigo que el tiempo de ejecución será muy rápido. Espero que aproximadamente 3-5 iteraciones de refinamiento sean suficientes para la convergencia, por lo general, y aproximadamente 6 conjeturas en z probablemente deberían ser suficientes. Cada operación de refinamiento involucra quizás unos pocos miles de lecturas / escrituras de memoria, y lo hacemos tal vez 20-30 veces. Entonces, espero que esto sea muy rápido, para los parámetros que especificó. Sin embargo, la única forma de averiguarlo con certeza es probarlo y ver si funciona bien o no.z
fuente